トレイト
|
用語 |
トレイト |
|
用語(英) |
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と同義ではありません。