Not your computer? Use a private browsing window to sign in. Learn more about using Guest mode
モダンなクラス/オブジェクトのあり方は? Perlではそもそもオブジェクトという考え方自体が、Perl 5(Perl 7歳)ではじめて登場した、後付けのものでした。また、その実装も非常におおらかなものだったため、より「本格的な」オブジェクト機構を備えた言語のユーザからはしばしば批判されてきました。 ただし、転んでもただでは起きないのがPerlハッカーたちのよいところ。そのような批判を糧に、「モダンPerl」の世界でもっとも激しく、多様に進化してきたのがこの分野です。 今回はそのようなクラス/オブジェクトの進化の一例として、クラスの継承とメソッドの解決順序にまつわる話題をまとめていきます。 継承によるクラスの拡張 伝統的なbaseプラグマを使ってクラスを拡張する場合、継承元と継承先に同名のメソッドがあれば継承先のメソッドだけが優先的に実行されます。 use strict; use warn
パンくず リファクタリング-プログラマーの体質改善テクニック 継承の取り扱い 継承による委譲の置き換え 内容 リファクタリング名 継承による委譲の置き換え 適用ケース要約 委譲を使っているが、インターフェイス全体のために多数の委譲メソッドを書いている 適用内容要約 委譲先のクラスをモジュールにして、委譲元のクラスでインクルードする 適用詳細 委譲先の全メソッドを利用しているような場合、継承への置き換えを検討します サンプル 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
継承と委譲の使い分け。 GoFのデザパタ本でも簡単ではないと書いてある。 ファウラーの『リファクタリング』では ・委譲による継承の置き換え サブクラスがスーパークラスの一部のインターフェースだけを使っている。あるいはデータを継承したくない。 ・継承による委譲の置き換え 委譲を使っていて、すべてのインタフェースに対する単純な委譲をたくさん書いている。 とあるわけだが、もっと概念的である 程度正しい視点があるのでは? というのも、 みねこあ:憂鬱本を買ってみました ではじめて知った 実装継承 という言葉が非常にしっくりきたわけです。 これじゃないかと。 そこで、少しググってみた結果、 よく言われる、「継承よりコンポジション(has)して委譲」するべき場面として、 型ではなく実装の再利用を目的としている 時だと、言ってしまってもわりと正しそうだということがわかったわけなので、ここに宣言します。
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 という名前のクラスで定義されて
経験的にこのようにした方がよいと思った点についての記録です。 仕事で大規模(2000クラス超)かつ製品寿命がながいパッケージソフトを作っていた関係で、 ちょっとした設計の間違いが、 あとあとで大変な苦労する羽目になったりすることを経験してきました。 このような規模が大きいアプリケーションを作ることはなかなかないかもしれませんが、 なにかの参考になれば、と思います。 継承する前に委譲を検討する Singleton パターンを使うときの注意 Template Method パターンを使うときの注意 クラス間の依存に関する注意 クラスの粒度 Singleton の問題を回避できるか? 継承する前に委譲を検討する 継承はスーパークラスの仕様をよく理解しておかないと、 バグを作りこみやすいので十分注意する必要があります。 メソッドのオーバーライドをするときも、 public void foo(){
[VBAのオブジェクト指向] VBAのオブジェクト指向は、完全オブジェクト指向言語(JavaやC#等)のそれと比べると、 『子クラスのメソッドを経由して親クラスの変数やメソッドにアクセスできない』、 『子クラス内から親クラスの変数やメソッドにアクセスできない』等の制限事項がある。 [多態性(ポリモフィズム)] 『多態性(ポリモフィズム)』の説明で、 『動物』に『鳴く』メッセージを通知する例がよく挙げられる。 以下に、『多態性(ポリモフィズム)』を利用したサンプルコードを示す。 [クラス図] [クラスの説明] ・Mammalクラス 哺乳類を表すクラス。 メソッドとして、Cry()を実装。 ・Dogクラス、Catクラス、Crowクラス イヌ、ネコ、カラスを表すクラス。各々のクラスはMammal(哺乳類)クラスを継承。 メソッドとして、Mammal_Cry()を実装。 ([親クラス名]_[親クラ
正しく意味を理解している方にとっては、まったく常識レベルの話であり、何をいまさらと思われる方々も多いかと思いますが、大規模案件のレガシーコードなど、私が仕事で見かけるJavaのコードを読むと、「このコードを書いたSEやPGの方々は、はたして継承の意味を正しく理解していないのではないか」と思われる設計のコードに出会うことが少なからずあります。現在では改良されましたが(Javaプログラミング能力認定試験の問題がかなり改善されていました - 達人プログラマーを目指して)、以前のJavaプログラム認定試験の問題は、そうした不適切な設計がされている典型的な例となっていたのですが、実際、SI業界ではあのような品質のコードのシステムが今でも現役で多数稼動しているというだけでなく、現在でも新たに生み出されているというのは残念ながら紛れもない事実のようなのです。 確かに新人研修で「哺乳類を継承して犬クラスと
こうもり問題(こうもりもんだい)とは、情報や物品を分類する際に生じる問題の一つである。例えば A にも B にも分類できる場合に、どちらに分類すればいいのか、といった問題である。 すべてのものや情報は、利用される文脈に応じて複数の属性を持ち得る。しかし、階層構造のように、各項目を木構造の末端にあてはめて分類する方式(図書館資料など)では、項目が持つ複数の属性のうちの一つだけに着目しなければならないという制約がある(たとえば「自民党税制調査会の記録は政治と税金のどちらに分類するか」など)。こうもり問題とは、その制約が原因となって生じる諸問題を指す。 身近な例では、以下のようなトラブルがこうもり問題として挙げられる。 ファイルをフォルダ分けして整理する際に、どこのフォルダに入れたらいいか迷う。 ショッピングセンターで買い物をする際に、目的の商品を探し当てるためにいろんなジャンルのコーナーを歩き
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 というメソッドを呼び出しているのでし
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
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く