トレイト

用語

トレイト

用語(英)

Trait

別名

-

識別情報

  • Term ID: src/main/doxsite/glossary/object-foundation/trait.dox

  • English label: Trait

  • Japanese label: トレイト

  • Category: Object Foundation

  • Status: normative

  • Definition authority: SimpleModeling BoK

定義

トレイト(Trait)とは、複数のClassまたは他のTraitへ合成できるFeature、Responsibility、Capability、Constraintを、再利用可能な部分モデルとして定義するSimpleModeling固有のClassifierです。TraitはObject ModelのModel Elementであり、Domain Modelの概念的な幹や独立したInstanceの生成単位ではなく、横断的な構造と振る舞いを表します。

UML

UML 2.5.1にはTraitという独立したMetaclassはありません。SimpleModeling TraitをUML Profileへ写像する場合は、原則としてabstract Classに «trait» stereotypeを適用し、Attribute、Association、Operation、Constraint、既定のBehaviorを保持します。Traitが純粋な外部Operation契約だけを持つ場合はInterfaceへ縮約できますが、その写像ではTraitとしての部分構造や既定Behaviorを表せないことがあります。Traitの適用関係をUML Generalizationで表すのはsubstitutabilityが成立する場合に限り、mixinとしての合成を厳密に表す場合はProfile固有の関係を定めます。

一般的な用法

Traitは言語ごとに意味が異なります。SimpleModeling TraitはScala構文の別名ではなく、CMLで定義されるModel Elementです。Scala traitは自然な実現先ですが、言語上のtraitすべてがSimpleModeling Traitを表すわけではありません。

オブジェクト関数パラダイム

Object側では、TraitがObjectの概念的な幹から横断的なCapabilityや部分構造を分離し、Classへ合成します。Functional側では、同じCapabilityを関数、result type、effect、Type Classなどと接続できます。ただしSimpleModeling TraitとType Classは別概念です。

CML

CML(Cozy Modeling Language)は Trait をObject種別として定義可能です。Traitには再利用するAttribute、Association、Operation、Responsibility、Constraintなどを記述し、Classまたは他のTraitから合成して利用します。Classの概念的なIdentityやLifecycleを、単に再利用したいという理由でTraitへ移しません。

Scala

Scala traitはSimpleModeling Traitの主要な実現先です。abstract memberとconcrete member、mixin compositionを使って部分構造と既定Behaviorを実現できます。ただし生成方針により、一つのCML Traitが複数のScala traitや補助Typeへ分割される場合があり、一対一対応とは限りません。

simplemodeling-lib

simplemodeling-libのType Modeling Ruleは、概念的な幹、inheritance invariant、state、constructor semanticsに abstract class を使用し、補助的で合成可能なCapabilityに trait を使用します。この規則はSimpleModeling Traitの意図と整合しますが、Holder、utility、Type Classなど実装上のScala traitをすべてModel Traitへ昇格させません。

公開成果物での用法

日本語の記事と動画では初出を「トレイト(Trait)」とします。Classとの違いは「Classは概念的な幹、Traitは複数のClassへ合成する再利用可能な部分モデル」と説明します。Interfaceとの違いは「Interfaceは外部契約、Traitは構造や既定Behaviorも持ち得る部分モデル」と説明します。

境界

  • TraitはClassと同義ではなく、独立したInstanceの主要な分類単位ではありません。

  • TraitはInterfaceと同義ではありません。Traitは構造、Constraint、既定Behaviorを持ち得ます。

  • SimpleModeling TraitはScala traitと同義ではありません。

  • TraitはType Classと同義ではありません。

関連語

  • 分類子

  • クラス

  • インターフェース

  • フィーチャー

  • 責務

  • ケーパビリティ

  • オブジェクト関数パラダイム

参照