タグ

OOPとinheritanceに関するkiyo_hikoのブックマーク (11)

  • Google Sites: Sign-in

    Not your computer? Use a private browsing window to sign in. Learn more about using Guest mode

    Google Sites: Sign-in
    kiyo_hiko
    kiyo_hiko 2013/07/04
    めんどくさそう
  • 第2回 mro:次のメソッドはどこ? | gihyo.jp

    モダンなクラス/オブジェクトのあり方は? Perlではそもそもオブジェクトという考え方自体が、Perl 5(Perl 7歳)ではじめて登場した、後付けのものでした。また、その実装も非常におおらかなものだったため、より「格的な」オブジェクト機構を備えた言語のユーザからはしばしば批判されてきました。 ただし、転んでもただでは起きないのがPerlハッカーたちのよいところ。そのような批判を糧に、「⁠モダンPerl」の世界でもっとも激しく、多様に進化してきたのがこの分野です。 今回はそのようなクラス/オブジェクトの進化の一例として、クラスの継承とメソッドの解決順序にまつわる話題をまとめていきます。 継承によるクラスの拡張 伝統的なbaseプラグマを使ってクラスを拡張する場合、継承元と継承先に同名のメソッドがあれば継承先のメソッドだけが優先的に実行されます。 use strict; use warn

    第2回 mro:次のメソッドはどこ? | gihyo.jp
    kiyo_hiko
    kiyo_hiko 2012/05/02
    superを実現するだけでもスーパーめんどくせぇぇぇぇぇぇ
  • 書籍 リファクタリング−プログラマーの体質改善 | 継承の取り扱い | 継承による委譲の置き換え - Tbpgr Blog

    パンくず リファクタリング-プログラマーの体質改善テクニック 継承の取り扱い 継承による委譲の置き換え 内容 リファクタリング名 継承による委譲の置き換え 適用ケース要約 委譲を使っているが、インターフェイス全体のために多数の委譲メソッドを書いている 適用内容要約 委譲先のクラスをモジュールにして、委譲元のクラスでインクルードする 適用詳細 委譲先の全メソッドを利用しているような場合、継承への置き換えを検討します サンプル HTMLタグを表す機能と、Divタグを表す機能を実装します。 サンプルコード リファクタリング前 # encoding: Shift_JIS class HtmlTag attr_accessor:tag_name def initialize(tag_name) @tag_name=tag_name end def output_start_tag() return

    書籍 リファクタリング−プログラマーの体質改善 | 継承の取り扱い | 継承による委譲の置き換え - Tbpgr Blog
    kiyo_hiko
    kiyo_hiko 2012/04/17
    「委譲先の全メソッドを利用しているような場合、継承への置き換えを検討します」
  • 委譲と継承 - カタコト備忘録

    継承と委譲の使い分け。 GoFのデザパタでも簡単ではないと書いてある。 ファウラーの『リファクタリング』では ・委譲による継承の置き換え サブクラスがスーパークラスの一部のインターフェースだけを使っている。あるいはデータを継承したくない。 ・継承による委譲の置き換え 委譲を使っていて、すべてのインタフェースに対する単純な委譲をたくさん書いている。 とあるわけだが、もっと概念的である 程度正しい視点があるのでは? というのも、 みねこあ:憂を買ってみました ではじめて知った 実装継承 という言葉が非常にしっくりきたわけです。 これじゃないかと。 そこで、少しググってみた結果、 よく言われる、「継承よりコンポジション(has)して委譲」するべき場面として、 型ではなく実装の再利用を目的としている 時だと、言ってしまってもわりと正しそうだということがわかったわけなので、ここに宣言します。

    委譲と継承 - カタコト備忘録
    kiyo_hiko
    kiyo_hiko 2012/04/17
    「継承のリスク - 外部に対しては、情報隠蔽されていても、親子間では情報隠蔽がゆるいのです.実装継承を動機とした継承ではなおさらです.子供は親(の実装)に一般的に強く依存しがちです」
  • 戻り値の異なるメソッドの多重定義はできないのですか?

    class Adapter extends Stack { public void push(int a) { ・ ・ } public int pop() { ・ ・ } } ということはできない(※戻り値だけが異なるメソッドを多重定義できない) ので、別の方法を考えよう。 --- ところで、2つのメソッド名(名前) public void push(int) public int pop() を定義しているクラス(またはInterface)は、 何という名前のクラス(またはInterface)だろう? (言い換えると、電卓クラス側からは、 これらメソッドは何というクラス(またはInterface)に 属しているように見えるのか、ということ) adapterパターンを使うというならば、 この点は重要ではないかな? --- 仮に上記2つのメソッドが Name という名前のクラスで定義されて

    戻り値の異なるメソッドの多重定義はできないのですか?
    kiyo_hiko
    kiyo_hiko 2011/11/13
    多重定義というかオーバーライド風味の話。無理やりやるならメンバーに持っておいて委譲だろうか。少なくとも継承でできたらI/Fや抽象クラスはその意味を失っちゃうな http://sundome.cocolog-nifty.com/blog/2009/03/post-b181.html
  • クラス設計に関するメモ

    経験的にこのようにした方がよいと思った点についての記録です。 仕事で大規模(2000クラス超)かつ製品寿命がながいパッケージソフトを作っていた関係で、 ちょっとした設計の間違いが、 あとあとで大変な苦労する羽目になったりすることを経験してきました。 このような規模が大きいアプリケーションを作ることはなかなかないかもしれませんが、 なにかの参考になれば、と思います。 継承する前に委譲を検討する Singleton パターンを使うときの注意 Template Method パターンを使うときの注意 クラス間の依存に関する注意 クラスの粒度 Singleton の問題を回避できるか? 継承する前に委譲を検討する 継承はスーパークラスの仕様をよく理解しておかないと、 バグを作りこみやすいので十分注意する必要があります。 メソッドのオーバーライドをするときも、 public void foo(){

    kiyo_hiko
    kiyo_hiko 2011/10/19
    なるほど:Singletonは「Java のコア API のソースを検索してみれば、 ほとんど使われていない」「継承による機能追加ができなくなります。 つまり、その唯一のクラスに次々に新しいメソッドを追加していくしかない」
  • [VBA]ExcelVBAでオブジェクト指向の継承: zebratchの気まぐれ日記

    [VBAのオブジェクト指向] VBAのオブジェクト指向は、完全オブジェクト指向言語(JavaやC#等)のそれと比べると、 『子クラスのメソッドを経由して親クラスの変数やメソッドにアクセスできない』、 『子クラス内から親クラスの変数やメソッドにアクセスできない』等の制限事項がある。 [多態性(ポリモフィズム)] 『多態性(ポリモフィズム)』の説明で、 『動物』に『鳴く』メッセージを通知する例がよく挙げられる。 以下に、『多態性(ポリモフィズム)』を利用したサンプルコードを示す。 [クラス図] [クラスの説明] ・Mammalクラス 哺乳類を表すクラス。 メソッドとして、Cry()を実装。 ・Dogクラス、Catクラス、Crowクラス イヌ、ネコ、カラスを表すクラス。各々のクラスはMammal(哺乳類)クラスを継承。 メソッドとして、Mammal_Cry()を実装。 ([親クラス名]_[親クラ

    [VBA]ExcelVBAでオブジェクト指向の継承: zebratchの気まぐれ日記
    kiyo_hiko
    kiyo_hiko 2011/07/13
    VBAの継承しんどいな。でも無いよりは全然いいか…
  • いまさらですが、職業Javaプログラマーなら理解しておいてほしい「継承」の意味について - 達人プログラマーを目指して

    正しく意味を理解している方にとっては、まったく常識レベルの話であり、何をいまさらと思われる方々も多いかと思いますが、大規模案件のレガシーコードなど、私が仕事で見かけるJavaのコードを読むと、「このコードを書いたSEやPGの方々は、はたして継承の意味を正しく理解していないのではないか」と思われる設計のコードに出会うことが少なからずあります。現在では改良されましたが(Javaプログラミング能力認定試験の問題がかなり改善されていました - 達人プログラマーを目指して)、以前のJavaプログラム認定試験の問題は、そうした不適切な設計がされている典型的な例となっていたのですが、実際、SI業界ではあのような品質のコードのシステムが今でも現役で多数稼動しているというだけでなく、現在でも新たに生み出されているというのは残念ながら紛れもない事実のようなのです。 確かに新人研修で「哺乳類を継承して犬クラスと

    いまさらですが、職業Javaプログラマーなら理解しておいてほしい「継承」の意味について - 達人プログラマーを目指して
    kiyo_hiko
    kiyo_hiko 2011/06/24
    "Parent parent = child;"この例は一見直感に反するので、理解出来ない人には難しいかもしれないと思いました。自分でも誰かに説明する方法を考えさせられる・・・。
  • こうもり問題 - Wikipedia

    こうもり問題(こうもりもんだい)とは、情報や物品を分類する際に生じる問題の一つである。例えば A にも B にも分類できる場合に、どちらに分類すればいいのか、といった問題である。 すべてのものや情報は、利用される文脈に応じて複数の属性を持ち得る。しかし、階層構造のように、各項目を木構造の末端にあてはめて分類する方式(図書館資料など)では、項目が持つ複数の属性のうちの一つだけに着目しなければならないという制約がある(たとえば「自民党税制調査会の記録は政治と税金のどちらに分類するか」など)。こうもり問題とは、その制約が原因となって生じる諸問題を指す。 身近な例では、以下のようなトラブルがこうもり問題として挙げられる。 ファイルをフォルダ分けして整理する際に、どこのフォルダに入れたらいいか迷う。 ショッピングセンターで買い物をする際に、目的の商品を探し当てるためにいろんなジャンルのコーナーを歩き

    kiyo_hiko
    kiyo_hiko 2011/06/07
    項目を木構造に格納する際に、格納の基準となる属性が1つしかないために起こるジレンマだとか関連する問題。身近な例があまりにもあるあるすぎる。
  • 継承の仕組み - Perl入門ゼミ

    Perl › オブジェクト指向 › 継承の仕組み Perlにおける継承の仕組みを解説します。 1. 継承の仕組み 継承の仕組みは上位クラスに対してメソッドの探索をしているということです。前回のコードをもう一度見てみましょう。 use strict; use warnings; # コンポーネントクラス package Component; sub x { return 5 } # ボタンクラス package Button; # 継承の記述 our @ISA = ('Component'); sub new { bless {}, 'Button' } package main; # ボタンクラスを使用する my $button = Button->new; print $button->x; Buttonクラスには、x というメソッドがないのに、 x というメソッドを呼び出しているのでし

    継承の仕組み - Perl入門ゼミ
    kiyo_hiko
    kiyo_hiko 2011/05/18
    1ファイル内でどうやって継承するか悩んでいたら、use baseでできた。サンプルが見やすいのでブクマさせて頂きます
  • Perlのinstanceof演算子のベストプラクティスは何か - Unknown::Programming

    instanceof演算子 - Islands in the byte stream 確かに遅いですよねぇ。 ただ、一応ベンチとってみたところ、blessed使うのが一番早かったです。 以下、$xがオブジェクトの場合のベンチ。 use Benchmark qw(cmpthese timethese :hireswallclock); my $x = bless {} , 'Foo'; my $class = 'Foo'; cmpthese(100000,{ ref_eval => sub { if ( ref($x) && eval { $x->isa($class) } ) {} }, scalar_util => sub { if ( Scalar::Util::blessed($x) && $x->isa($class) ) {} }, param_util => sub { if

    Perlのinstanceof演算子のベストプラクティスは何か - Unknown::Programming
    kiyo_hiko
    kiyo_hiko 2011/05/18
    Scalar::Util qw/blessed/でクラス名を取得できるという。参考に
  • 1