トレイト
表示
トレイト (英: Trait) は、コンピュータプログラミングにおいて、クラスの振る舞いを再利用するために用いられるメソッドの集合である[1][2][3][4]。
概要
[編集]トレイトは、多重継承が持つ柔軟性を提供しつつ、菱形継承問題といった問題を解決することを目的としている[5]。
クラス定義にトレイトを合成すると、そのトレイトが持つメソッドが、あたかもクラス自身で定義されたかのように利用可能になる[6]。
Mixinと似ているが、トレイトは以下の点で異なる特徴を持つ[5]。
- 状態を持たない: トレイトは基本的に振る舞い(メソッド)のみを提供し、状態(フィールドやインスタンス変数)を持つことはできない。
- 競合解決: 複数のトレイトが同じ名前のメソッドを持つ場合、クラス側で明示的にどちらを使用するか、あるいはどのように組み合わせるかを明示的に定義する必要がある。
サポートする言語
[編集]トレイト、またはロール (Role) のような類似の概念をサポートする言語には以下のようなものがある。
トレイトを採用
- Smalltalk - 最初のトレイトは Smalltalk 処理系のひとつである Squeak を使ってベルン大学のソフトウェア合成グループによって実装が試され[7]、その有効性が実証された[8]。Squeak にはその後、公式リリースにもトレイトが組み込まれ標準で利用可能となった。Squeak から派生した Pharo も同様。
- PHP - 5.4.0 からサポート[9]。
- Raku -「ロール」。Perl 5 では Moose モジュールで利用可能。なおロールの限定的な用途のみ「トレイト」と呼称し紛らわしい。
- JavaScript の Joose フレームワーク
- Ruby のモジュールのmix拡張(試作のみ)[10] - Ruby 2.0 向けの新機能として計画された[11]が運用上の問題が見つかり放棄された[12]。
トレイトの類似品/派生品を採用
- Rust - トレイトを有し、型変数に対する制約をトレイトで指定したり、ユーザー定義型の演算子に対する振る舞いを設定するのに利用されるが、その運用に際しそもそも衝突を許さないので(Orphan rule)、メソッドの集合という意味を除きSchärliの想定した使われ方はされず、トレイトとしては別物(実装の記述できるインタフェース程度)と考える方が良い。
- Fortress
- Scala[14][15]
- Groovy[16]
脚注
[編集]- ^ 「Traits: Composable Units of Behaviour」『ECOOP 2003 — Object-Oriented Programming』、Springer Berlin Heidelberg、2003年、248-274頁
- ^ 「Traits: A mechanism for fine-grained reuse」『ACM Transactions on Programming Languages and Systems (TOPLAS)』28巻、2号、ACM、2006年、331-388頁
- ^ Nathanael Schärli、Stéphane Ducasse、Oscar Nierstrasz、Andrew P. Black 共著、Traits: Composable Units of Behaviour. Proceedings of the European Conference on Object-Oriented Programming (ECOOP). Lecture Notes in Computer Science 誌、2743巻、Springer-Verlag、2003年、pp. 248-274
- ^ Stéphane Ducasse、Oscar Nierstrasz、Nathanael Schärli、Roel Wuyts、Andrew P. Black 共著: Traits: A mechanism for fine-grained reuse. ACM Trans. Program. Lang. Syst. 誌、28(2): 331-388 (2006)
- ^ a b 「Traits: A mechanism for fine-grained reuse」『ACM Transactions on Programming Languages and Systems (TOPLAS)』28巻、2号、ACM、2006年、331-388頁
- ^ 「Traits: Composable Units of Behaviour」『ECOOP 2003 — Object-Oriented Programming』、Springer Berlin Heidelberg、2003年、248-274頁
- ^ Nathanael Schärli, Stéphane Ducasse, Oscar Nierstrasz, and Andrew P. Black. Traits: Composable Units of Behavior. Technical Report -2, Institut für Informatik, Universität Bern, Switzerland, November 2002
- ^ Andrew P. Black, Nathanael Schärli, and Stéphane Ducasse. Applying Traits to the Smalltalk Collection Hierarchy. Technical Report -2, Institut für Informatik, Universität Bern, Switzerland, November 2002
- ^ Marr, Stefan. “Request for Comments: Horizontal Reuse for PHP”. The PHP.net wiki. The PHP Group. 2011年1月31日閲覧。
- ^ http://marc.info/?l=ruby-cvs&m=130685857122161
- ^ https://www.rubyist.net/~matz/20100617.html
- ^ https://ruby-trunk-changes.hatenablog.com/entry/20111003/ruby_trunk_changes_33379_33380
- ^ “Mixins and Traits in Swift 2.0”. 2022年2月10日閲覧。
- ^ https://www.scala-lang.org/node/126 A Tour of Scala: Traits
- ^ https://www.ibm.com/developerworks/java/library/j-scala04298.html The busy Java developer's guide to Scala: Of traits and behaviors
- ^ http://docs.groovy-lang.org/next/html/documentation/core-traits.html Groovy Language Documentation
関連項目
[編集]外部リンク
[編集]- http://www.iam.unibe.ch/~scg/Research/Traits/
- https://traitsjs.org traits.js - Traits for JavaScript