Behaviourを読んでサマリーを書きたかった人生だった。Behaviourを読んでサマリーを書きたかった人生だった。プログラミングを学ぶ際に、プログラミング言語に関する論文を読む。いう概念を最近学んだので、いい感じにいい感じなやつを教えてもらって読みました。メモ書き程度ですが、簡単に面白かったところを紹介します。すぎて大変だったのでやめておくことにしました。理解してないと要約を書くのは難しいですね。́・_・`)trait読んだのはこちら。http://scg.unibe.ch/archive/papers/Scha03aTraits.pdftraitが提案された論文で、traitが生まれた経緯と狙いについて書いてあります。いう方におすすめです。0⊖0)論文では、単一継承や多重継承、mixin継承の問題点やtraitでは、それらがどう克服されているかが紹介されていますが、今回はmixinとtraitの違いに焦点を当てて紹介したいと思います。クラスという単位が再利用の単位として最適ではないケースが頻繁にあることも問題だそうです。論文ではクラスには2つの主要な役割があるとされています。reuse(再利用の単位)です。インスタンス生成を遂行するためには、クラスは完全である必要があります。それ単体で動作する必要があります。再利用の単位としては、できるだけ小さくまとめたいという要求があります。難しいというケースがあるそうです。(って友人が言ってました。wikipediaを作ったのがmixinです。mixinでは多重継承のようなことが出来ますが、その継承は線形化されます。論文にのっている例(Fig2のところ)を紹介します。Rectangleクラスに対して、MColorと、MBorderの持っている機能を付けたいとします。MColorにMBorderをmixinします。MBorderのような関係ができあがります。オーバーライドされているので、呼び出し時に混乱しないよね(・ω<)といった効果が得られます。rubyで書くとこんな感じです。一気にmixin継承を行っているが、mixin継承に順番がつけば良い。Blue!"しかしtraitmixin最強!ヤッタ―!と思いきや、最強ではありませんでした。いったケースの際に困ったことになります。他にも、たくさんmixinしたいい感じのクラスを作ってしまうと、依存しているmixinクラスのうちの一つにメソッドを追加したり削除した際に問題になります。いった不安定な挙動に悩まされる危険性があります。以上のような問題点を踏まえて、traitが考案されました。何traitは単純なメソッドの集合です。traitはclassや別のtraitに含ませる(useする)ことができます。以下の様な特徴を持っています。traitがクラスでuseされていても、それはクラス階層に影響を与えません。trait経由でメソッドが定義されていても、それはクラスに直接定義してあるものと区別されません。traitをuseするtraitがあっても、それらは階層を構築せずフラットな状態になります。(後述)クラス階層に影響を与えないのはmixinやinterfaceと大幅に異なる点だと思います。みんな大好きPHPで書くとこんな感じです。どのtraitのメソッドを使うのかを明示的に宣言して解決します。(これをしないとメソッドが重複しているというエラーになる。Manualの例をちょっと変えた物を紹介します。A衝突の解決後、traitはフラットな構造になります。自分の中で実装されているものと同じ扱いになります。「線形化されてるけど一個前のメソッドが使いたいんだよね〜」といったな悩みが解消されます。(そもそも線形化されていないので、このtraitの物を使います!と宣言可能。メソッドが削除されてもエラー(bigTalkはAのやつを使うって言ってるけど無いやんけ!みたいなエラー)がちゃんと出てくれます。このような特性を持ったtraitを用いることで、メソッドの実装をクラスの階層構造と切り離して考えられるようになります。コードの再利用性を向上させることができるようになるそうです。traitを使おうtrait同士の連携部分や状態の管理などはクラスに残りますが、コードの再利用の単位としてtraitを採用することで、重複が少なく階層が複雑化しないコードが書けるようになりそうです。他の関連するアイデアの紹介があります。そちらは読んでいません。́・_・`)本記事ではmixinの問題点のみを指摘しましたが、traitが最強でmixinは雑魚というわけではありません。traitは状態を持つことができない・クラスの構造に組み込めないので型をどうすればよいか、といった制約や疑問が存在します。traitが克服しようとした問題点を理解することによって、traitを利用したより効率的なプログラミングにつながるのではないかと思いました。»プロフィール間違ったことが書いてあったら@matsu_charaまでご連絡ください。Languageに入門(3)はてなブログをはじめよう!matsu_charaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。