トレイト(コンピュータプログラミング)
トレイトは、クラスや型を合成するための再利用可能な振る舞いの単位である。コード共有と合成を支援し、言語によってミックスイン、インターフェース、抽象クラスとは異なる性質を持つ。
コンピュータプログラミングにおいて、トレイトは、メソッド(場合によってはその実装も)をパッケージ化し、クラスまたは型へ合成できるようにする言語レベルの機構である。トレイトは、古典的な多重継承を用いずに振る舞いを共有するためのモジュール化された方法を提供する。言語に応じて、合成可能なミックスイン、デフォルト実装を備えたインターフェース、または純粋に抽象的な契約として機能する。
主な特徴
トレイトは、コードの再利用性と構成の改善を目的としている。代表的な性質には、次のものがある。
- 合成可能性: トレイトは組み合わせることができ、クラスまたは他のトレイトに追加して振る舞いを構成できる。
- メソッド競合の処理: 2つのトレイトが同じメソッドを提供する場合、言語では明示的な競合解決または名前変更が求められることが多い。
- ステートレスと状態: 多くのトレイト設計では、トレイト内部にインスタンス状態を保持せず、ホストとなるクラスに依存する。一方、フィールドを許可する実装や、明示的な初期化を要求する実装もある。
- 任意の要件: トレイトは、ホストが提供することを期待するメソッドを宣言できるため、必要な操作について明確な契約を作成できる。
歴史と言語によるサポート
振る舞いを単位として合成するという考え方は、1990年代後半から2000年代初頭にかけて、オブジェクト合成と再利用に関する研究から生まれた。その後、さまざまな言語がトレイトの変種を採用した。例えば、一部のオブジェクト指向言語ではミックスインに似たモジュールとしてトレイトを提供し、別の言語ではデフォルト実装を持つインターフェースに似た構成要素を指してこの語を用いる。トレイトに類する機能を取り入れた代表的な言語設計には、Scala、水平的なコード再利用を支援するためにトレイトを追加したPHP、そしてミックスインではなくインターフェースや型クラスに似た能力を表現するRustがある。
用途と例
トレイトは、関連のないクラス間で共通メソッドを共有するため、ロギング、検証、シリアライズといった横断的な振る舞いを分離するため、また明示的な競合解決を強制することで多重継承のダイヤモンド問題を避けるために用いられる。実際には、開発者はクラス階層を変更せずに、そのクラスへ1つ以上のトレイトを追加してメソッドを付与する。トレイトの合成をコンパイル時に可能にするシステムもあれば、実行時に可能にするシステムもある。
類似概念との違いとトレードオフ
トレイトは関連する概念とは異なる。実装を提供できるため、純粋なインターフェースより具体的である。正式な競合解決規則を持つため、ミックスインより制御しやすい。また、暗黙の親子関係を避けるため、多重継承より軽量である。状態管理とライフサイクルに制約を課す場合があるため、設計者はトレイトに状態を持たせるか、ステートレスな補助機能にとどめるかを判断しなければならない。オブジェクトの構成とクラス設計に関する一般的な説明については、クラスを参照。
総じて、トレイトは振る舞いをモジュール化するための実用的な手段である。その正確な意味論は言語ごとに異なるため、実際のプロジェクトで使用する際には、合成、初期化、メソッド優先順位に関する規則を各言語の文書で確認する必要がある。
関連項目
著者
AlegsaOnline.com トレイト(コンピュータプログラミング) Leandro Alegsa
URL: https://ja.alegsaonline.com/art/101069
出典
- springerlink.metapress.com : Traits: Composable Units of Behaviour
- portal.acm.org : Traits: A mechanism for fine-grained reuse.