ようこそ!浜村拓夫の世界へ

    ブログ内検索

    最近の記事

    ブックマーク数の多い記事

    Blog Translation

    Powered By FC2ブログ

    Powered By FC2ブログ
    ブログやるならFC2ブログ


    FC2ブログ LOGIN

    with Ajax Amazon

    LLのOOP比較

    このエントリーを含むはてなブックマーク はてなブックマーク - LLのOOP比較 あとで読む
    LLOOP機能を比較・考察したブログ記事があった。
    LL選びの参考になった。
    多重継承の作法の違いで、好きなのを選べば良い?

    私が愛するオブジェクト指向とそれを使わない理由 - takuto_hの日記

    5. 多重継承問題

    やってきました、多重継承です。この問題は「クラス」という概念が生まれた時点で自然と付きまとうものです。つまりクラスさえなければ……でもクラスがないと……といった感じで妄想がはかどりますが、それはさておき。

    クラスにはメソッドがまとめられており、時としてこれを再利用したくなります。そこでクラスからクラスへの参照を持たせる、いわゆる継承をするわけですが、ここで問題が生じます。多重継承を許すと継承関係がグラフになるので、メソッドの探索順序を一意に定めにくいのです(なお、C++ではもう一つ、メモリレイアウトにかかわる問題が起きますが、これは省略)。

    これまで様々な言語がこの問題の解決策を提示してきました。

    Java
     実装の多重継承禁止。再利用したければ合成と委譲を使う。

    Python, Perl
     多重継承許可。C3線形化でメソッドの探索順序を一意に定める。

    Ruby, Scala
     ミックスインのための機構を導入。Scalaのトレイトは後述のトレイトとは違い、Rubyのモジュールに近いです。

    Squeak Smalltalk, Perl, PHP
     トレイト(PerlではRoleと呼ばれる)を導入。




    ●トレイト

    Perlなどに実装されているトレイトは、ミックスインとは少々異なるアプローチです。
    トレイトはメソッドの集まりですが、クラスから継承するのではなく、クラスにメソッドを追加することで拡張します。

    真にただのメソッドの集まりであるトレイトを足したり引いたりすることで衝突を解決するさまは、ハッシュテーブルに無名関数を突っ込んだだけの原始的なオブジェクトを操作しているようにも思える趣深いものです。
    ある意味原点回帰ともいえるでしょう。




    トレイト - Wikipedia

    トレイトとはコンピュータープログラミングにおける概念で、構造的にオブジェクト指向プログラミングを行うための簡素な概念モデルとして使われるメソッド群の集まりである。

    合成
    トレイトの合成は対称的であり、衝突するメソッドは合成から除外される。
    入れ子にすることができるが、クラスにとって入れ子はプログラム上の意味はない。
    入れ子されたトレイトは平坦なトレイトと等価である。
    トレイトはミクスインと類似しているが、ミクスインでは継承操作のみによってメソッドを合成させるが、トレイトでは、対称的な足し合せ、メソッド排除、別名化など、より多くの方法でメソッドを合成できる。
    また、トレイトは合成時にメソッドの型指定のみならず実装も与えるという点で、インターフェースとも異なっている。




    ●PHPのトレイト
    php 多重継承 トレイト - Google検索

    PHP: トレイト - Manual

    PHP 5.4.0 以降では、コードを再利用するための「トレイト」という仕組みが導入されました。

    トレイトは、PHP のような単一継承言語でコードを再利用するための仕組みのひとつです。
    トレイトは、単一継承の制約を減らすために作られたもので、 いくつかのメソッド群を異なるクラス階層にある独立したクラスで再利用できるようにします。
    トレイトとクラスを組み合わせた構文は複雑さを軽減させてくれ、 多重継承や Mixin に関連するありがちな問題を回避することもできます。

    トレイトはクラスと似ていますが、トレイトは単にいくつかの機能をまとめるためだけのものです。
    トレイト自身のインスタンスを作成することはできません。
    昔ながらの継承に機能を加えて、振る舞いを水平方向で構成できるようになります。
    つまり、継承しなくてもクラスのメンバーに追加できるようになります。




    trait時代のライブラリ設計を予想してみる #php5_4 - 泥のように

    traitが単なるクラスの多重継承より安全なのは、名前衝突時に別名をつけられたり、そもそもクラスと別概念なのでタイプヒントに悪影響を及ぼさなかったりといった特徴によるものです。




    多重継承まとめ - 西尾泰和のはてなダイアリー

    Pythonはクラスを多重継承できる。
    同じ名前のメソッドを持っている2つのクラスを継承した際にどのメソッドが呼ばれるかはC3線形化を使って決定される。

    RubyはModuleという「なにかを継承することはできなくてインスタンス化もできないもの」だけは多重継承できる。
    Moduleが別のものを継承できないためメソッドの解決は素朴な探索でOK(include A include BしたらBでの実装が優先)

    SmalltalkにはTraitという実装の多重継承ができるしくみがある。
    同じシグネチャのメソッドを持っている2つのTraitを継承した際に、片方を隠して衝突を回避したり、名前を変更して両方呼べるようにしたりできる。

    Perl6からRoleが入る。
    これはSmalltalkのTraitとほぼ同じもの。

    PHPはJava風の単一継承、インターフェイスとかも持っている。
    PHP5.4からTraitが入る。
    これはPerlのRoleとほぼ同じもの。




    ●LL戦争
    【PHP,Python】スクリプト,バトルロワイヤル35【Perl,Ruby】


    ●本日の結論
    ゴチャゴチャ考えて悩むなら、Pythonの一択でOK!

    ついでに言えば、自分が使うフレームワークの中身も見て、何やっているか分かるものを選ぶとイイよね?
    =LLの言語仕様+使用予定のフレームワークをチェック!






    関連記事

    コメント

    コメントの投稿


    管理者にだけ表示を許可する

    トラックバック

    トラックバックURL:
    http://hamamuratakuo.blog61.fc2.com/tb.php/944-755242a0

    FC2Ad