タグ

inheritanceに関するkiyo_hikoのブックマーク (20)

  • 継承は禁止するべき

    キチガイに刃物、ゴミプログラマに継承。危険なものは取り上げるべきだ。 オブジェクト指向プログラミングにおける継承は強力な手法であるが、これを正しく使えるプログラマは残念なことに極めて少ない。たいていの場合、継承を使うことで却ってプログラムの保守を困難にしてしまう。継承のアンチパターンの最たるものは、単なるメソッドやメンバ変数の共有のために継承を使うパターンだ。これを行うとデータが密結合になってバグの原因になり、プログラムを把握することも極めて困難になる。 そもそも、熟達したプログラマの感覚では、業務で書くアプリケーションの実装に継承を使うべき局面などほとんど無い。ライブラリ等のより低レベルな処理で仕様が確定しているものについては、継承が効果的となる場合もあるが、複雑なアプリケーションのロジックに継承を使うのはほとんどの場合、時期尚早な抽象化となる。 また、凡庸なプログラマが継承で実現したい

    継承は禁止するべき
    kiyo_hiko
    kiyo_hiko 2020/10/22
    変数名で既に糞なコードと闘ってて高尚な話に思える。あとif-elseが50個ぐらい繋がってるアメリカの貨物列車みたいな長大コードとか、その入れ子… / 継承はstrategyやstateぐらいで使う / 追記:130分岐に出会った。狂ってる
  • 【Java】 継承とコンストラクタ super( )の意味 | 一番かんたんなJava入門

    継承時のメソッドや変数の挙動についてはだいたい分かってもらえたと思いますが、コンストラクタについてはちょっとややこしい事になっていますので、説明したいと思います。 継承についてよく分かっていない人は先に継承って何?を読んで下さい。 またコンストラクタについてよく分からない人は先にコンストラクタって何? this( )の意味を読んで下さい。 まず例としてHumanクラスを作ります。 Human.java public class Human { Human(){ System.out.println("人間誕生"); } } コンストラクタを書くことで、Humanクラスをインスタンス化する際には「人間誕生」と標準出力に出るようにしています。 このHumanクラスを継承したProgrammerクラスを書きます。 Programmer.java public class Programmer e

    kiyo_hiko
    kiyo_hiko 2020/04/13
    Javaかなり忘れてたので助かった
  • 最近、反出生主義の奴増えすぎだよな?

    そういう気分になることもあるけど、一時的な考えを通り越して自分に根付くとは思えない そこまでは思えないわ、て感じ

    最近、反出生主義の奴増えすぎだよな?
    kiyo_hiko
    kiyo_hiko 2017/06/28
    だって資本がどんどん偏在化してくし、労働分配も申しわけ程度を指向するようになる。だからいい門地じゃないと生まれたら負けって世界がぼくらを呼んでる // 人生をカジュアルにリセマラできないかな。
  • Railsでコントローラを継承して階層化すると効率よく開発できる - さかなチキンぱん。

    コントローラの階層化 Railsで開発を行う場合に、コントローラを継承して階層化することで ずいぶん楽に開発を進められるようになるのですが、意外と知られていないようなので紹介します。 (タイトルにRailsと銘打っているけれど、恐らくRailsからのPHP派生フレームワークcakephpやsymfonyでも同じハズ) コントローラの継承のさせ方を簡単に図にしてみた。 なぜ継承させると開発が楽になるのか? Railsの入門向け書籍などには、一番の大元になるApplicationControllerに対して 共通のロジックを書くことでDRYに書けるよ!と、あったりするんですが、 実際にはRails等フレームワークを使うような開発の場合(規模がそれなりに大きい事が多いため)、 「データをメンテする管理画面」と「ユーザーが参照するための公開画面」の2つに大きく分けられます。 しかし

    kiyo_hiko
    kiyo_hiko 2015/10/22
    Padrinoで似たような事やりたくなり、検索から。参考にしたい。
  • Martin Fowler's Bliki in Japanese - CallSuper

    http://martinfowler.com/bliki/CallSuper.html 親メソッド呼び出しは、オブジェクト指向フレームワークのなかで 不吉な匂い(アンチパターンと言っても良いでしょう)を出しています。 その症状は簡単に見つけることができます。 フレームワークを使うために、スーパークラスを継承しているとしましょう。 ドキュメントには、おそらくこのようなことが書かれているでしょう。 「サブクラスを作成して処理メソッドをオーバーライドしてください。 ただし、メソッドの先頭でスーパークラスの呼び出しを行ってください。」 例えばこんな感じです。 public class EventHandler ... public void handle (BankingEvent e) { housekeeping(e); } public class TransferEventHandler

  • protected属性のコンストラクタについて - あるソースを見ていたところコンストラクタがprotected属性で定義されていてまし... - Yahoo!知恵袋

    http://www.kab-studio.biz/Programing/Codian/Cpp/06.html 良い感じの解説サイトがあったから、これ読んでみることをオススメする。 要は、そのクラスを継承専用のクラスってことにして、 外部の関数から直接インスタンスを生成してほしくない時に使う。 #include <iostream> class Base{ protected: Base(){ std::cout << "Base C" << std::endl; } }; class Sub : public Base{ public: Sub(){ std::cout << "Sub C" << std::endl; } }; int main(){ //Base ins_base; Sub ins_sub; return 0; } 例えばこんな感じ。 Base base;の部分のコメ

    protected属性のコンストラクタについて - あるソースを見ていたところコンストラクタがprotected属性で定義されていてまし... - Yahoo!知恵袋
    kiyo_hiko
    kiyo_hiko 2014/12/15
    うおー …。:...:;;・ω・)
  • 関数オブジェクトの継承 - Google 検索

    2023/09/14 · 継承された関数は、上で見せたようなプロパティの隠蔽(この場合はメソッドのオーバーライドの形)を含め、他のどのプロパティとも同じように動作します。

  • 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
    めんどくさそう
  • IBM Developer

    IBM Developer is your one-stop location for getting hands-on training and learning in-demand skills on relevant technologies such as generative AI, data science, AI, and open source.

    IBM Developer
  • 第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
    「継承のリスク - 外部に対しては、情報隠蔽されていても、親子間では情報隠蔽がゆるいのです.実装継承を動機とした継承ではなおさらです.子供は親(の実装)に一般的に強く依存しがちです」
  • JavaやC#の常識が通用しないRubyのprivateメソッド - give IT a try

    衝撃を受けたできごと 最近Rubyを勉強しています。 JavaやC#でオブジェクト指向プログラミングの基はマスターしてるから、Rubyもそのあたりは楽勝〜!・・・と思っていたら、JavaやC#の常識が全く通用しない振る舞いに遭遇してかなり衝撃を受けました。それは、 privateメソッドはサブクラスからも呼び出せる ・・・ということです!!がーん。 たとえば、JavaやC#だと自分のクラス内でprivateメソッドが使われていない場合、不要なメソッドとして削除できます。(リフレクションを使って呼び出される可能性はここでは無視ね) しかし、Rubyでは誰かがサブクラスを作って呼び出している可能性があるので、privateメソッドを削除する場合は注意が必要です。メソッド名を変更する場合も同様ですね。 また、知らずに親クラスと同名のprivateメソッドを定義すると、予期せず親クラスの実装をオ

  • 戻り値の異なるメソッドの多重定義はできないのですか?

    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