やる夫がデザインパターンをやるようです 最終回

やる夫がデザインパターンをやるようです 最終回をはてなブックマークに追加 やる夫がデザインパターンをやるようです 最終回をdel.icio.usに追加 Yahoo!ブックマークに登録 やる夫がデザインパターンをやるようです 最終回をGoogle Bookmarksに追加

このエントリは、なんと最終回だというのに下書きのまま数ヶ月放置していて、私は公開済みであると勘違いしていたものです。。。ので、いろいろと忘れ去られているかと思いますが一応公開しておきます。(次のやる夫ネタを練りながらエントリいじってて発覚した)

←第20回

やる夫のような天才プログラマは
いつもクズSEに足を引っ張られて成功を掴み損ねるお。
      ____
    /_ノ   ヽ_\
   /( ●) ( ●)\
 / ::::::⌒(__人__)⌒:::::\
 |        ̄      |
 \              /
コンポジットだかポンコジットだか知らないけど
デザパタの勉強はクズSEに思想教育されてるみたいでヤダお!
        ノ L____
       ⌒ \ / \
      / (○) (○)\
     /    (__人__)   \
     |       |::::::|     |
     \       l;;;;;;l    /l!| !
     /     `ー'    \ |i
   /          ヽ !l ヽi
   (   丶- 、       しE |そ  ドンッ!!
    `ー、_ノ       ∑ l、E ノ <
               レY^V^ヽl
いいかやる夫。これまで俺が教えてきた考え方は
素晴らしいプログラムの組み方というよりは作法だ。
つまり、プログラマ向けの躾みたいなもんだから
お前がなっちゃいねーとこっちが恥かくんだボケ。
   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く 
   |     \
    |    |ヽ、二⌒)
ドシー!悪口でおいらの心が折れる前に
とっととポンコジットパターンを教えるお!
      ____
     /_ノ ' ヽ_\
   /(≡)   (≡)\
  / /// (__人__) ///\
  |     |r┬-|      |
  \     ` ー'´    /
いいだろう。
        / ̄ ̄\
      /       \
      |::::::        |
     . |:::::::::::     |
       |::::::::::::::    |          ....,:::´, .
     .  |::::::::::::::    }          ....:::,,  ..
     .  ヽ::::::::::::::    }         ,):::::::ノ .
        ヽ::::::::::  ノ        (:::::ソ: .
        /:::::::::::: く         ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
         |:::::::::::::::|ヽ、二⌒)━~~'´
Compositeパターンとはいわばツリー構造の構成を指します。フォルダ階層を思い浮かべればわかりやすいのですが、階層全体も、とある階層のフォルダも、あるファイルもひとつのオブジェクトとして扱うことができます。

前回の話から例えて話すと、あるコレクション―――たとえば魔法コレクションの中にさらにコレクションを保持したとしても、扱い(型)を変えることなく利用できる構造をコンポジットパターンといいます。

・・・ということだ。
   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く 
   |     \
    |    |ヽ、二⌒)
     ?
         |:;:;:;;:;:;:;:;:i;:;::::;:;|
         |;:;:_:_;:;_:;:l:;_:_;:_;|
         |___|__|
        /   ・    ・ \
      /    (●)  (●) \  
      |       (__人__)    | 
      \________/
         /|├┤├┤|\
(理解してんだかしてねーんだか
わかんねぇリアクションは頼むからやめてくれ)
・・・・・・・。
   / ̄ ̄\
 /   _ノ  \
 |    ( ○)(○)
. | u   (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く 
   |     \
    |    |ヽ、二⌒)
ディレクトリ構造だってことは理解したお
おいらのお宝ディレクトリへのパスは頭に
たたきこんであるお。
どこにいようと相対パスで手繰れるほどだお。
ディレクトリ構造は得意だお。
         ____
       /      \
      /  ─    ─\
    /    (●)  (●) \
    |       (__人__)    | ________
     \      ` ⌒´   ,/ .| |          |
    ノ           \ | |          |
  /´                 | |          |
 |    l                | |          |
 ヽ    -一ー_~、⌒)^),-、   | |_________|
  ヽ ____,ノγ⌒ヽ)ニニ- ̄   | |  |
把握したなら
それを踏まえてコードを書いてみろ。
        / ̄ ̄\
      /       \
      |::::::        |
     . |:::::::::::     |
       |::::::::::::::    |          ....,:::´, .
     .  |::::::::::::::    }          ....:::,,  ..
     .  ヽ::::::::::::::    }         ,):::::::ノ .
        ヽ::::::::::  ノ        (:::::ソ: .
        /:::::::::::: く         ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
         |:::::::::::::::|ヽ、二⌒)━~~'´
// まず抽象コンポーネントを用意するお
public abstract class YaruoComponent {
// 操作の定義 追加・削除・子ノードの取得
public void add( YaruoComponent param ){}
public void remove( YaruoComponent param ){}
public YaruoComponent getChild( int idx ){}
// ビジネスロジック定義
public String getName(){}
public String getDescription(){}
public double getEffectiveValue(){}
public void print(){}
}
// アビリティ1つを表現する
public class AbilityItem extends YaruoComponent {
String name;    // アビリティ名
String description;    // 説明
double effectiveValue;    // アビリティ効果値
public AbilityItem( String name, String description, double effectiveValue ){
this.name = name;
this.description = description;
this.effectiveValue = effectiveValue;
}
// ビジネスロジックのオーバーライド
public String getName(){ return name; }
public String getDescription(){ return description; }
public double getEffectiveValue(){ return effectiveValue; }
public void print(){
System.out.println( getName() );
System.out.println( getDescription() );
System.out.println( getEffectiveValue() );
}
}
// アビリティコレクションを表現する
public class AbilityCollection extends YaruoComponent {
ArrayList abilityComponents = new ArrayList();
String name;    // アビリティ名
String description;    // 説明
public AbilityCollection( String name, String description ){
this.name = name;
this.description = description;
}
public void add( YaruoComponent param ){
abilityComponents.add( param );
}
public void remove( YaruoComponent param ){
abilityComponents.remove( param );
}
public YaruoComponent getChild( int idx ){
return (YaruoComponent)abilityComponents.get( idx );
}
// ビジネスロジックのオーバーライド
public String getName(){ return name; }
public String getDescription(){ return description; }
public void print(){
System.out.println( getName() );
System.out.println( getDescription() );
}
}
         ___
       / ⌒  ⌒\ ざっとこんなもんだお
      / (⌒)  (⌒) \  
    /   ///(__人__)/// \    
     |      `Y⌒y'´    |  ________
      \      ゙ー ′  ,/  | |          |
    ノ           \  | |          |
  /´                  | |          |
 |    l                 | |          |
 ヽ    -一ー_~、⌒)^),-、    | |________|
  ヽ ____,ノγ⌒ヽ)ニニ-   ̄  | |  |
 これでアビリティ内アビリティを延々と
 表現できるでおJAL
         |:;:;:;;:;:;:;:;:i;:;::::;:;|
         |;:;:_:_;:;_:;:l:;_:_;:_;|
         |___|__|
        /   ・    ・ \
      /    (●)  (●) \  
      |       (__人__)    | 
      \________/
         /|├┤├┤|\
(なんだこの自由すぎるキャラは)
そのとおりだ。おおむね間違っていないが、
前回学んだイテレータが生かされてないのと
AbilityItemがノードの操作をできてしまうから
抽象クラスでは例外を投げるようにするのが普通だ。
   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く 
   |     \
    |    |ヽ、二⌒)
public abstract class YaruoComponent {
// 操作の定義 追加・削除・子ノードの取得
public void add( YaruoComponent param ){
throw new UnsupportedOperationException();
}
// 以下のメソッドに例外を埋め込んでく
}
// アビリティコレクションを表現する
public class AbilityCollection extends YaruoComponent {
ArrayList abilityComponents = new ArrayList();
// 中略
public void print(){
System.out.println( getName() );
System.out.println( getDescription() );
// イテレータで実装
Iterator itr = abilityComponents.iterator();
while( itr.hasNext() ){
YaruoComponent ability = (YaruoComponent)itr.next();
ability.print();
}
}
}
 これでどうかお。完璧すぎてこわいお。
           ____
        /⌒  ⌒\
.      /( ―)  (―)\   ふん、ふーん。
     / ::::::⌒(__人__)⌒::::: \ ふ、んー。
    |      |r┬-|     |  
     \       `ー'´     /
    ノ            \
  /´               ヽ                 カ
 |    l   l||l 从人 l||l      l||l 从人 l||l   カ    タ
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.     タ
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))
     ┌┬┬┐┌┬┬┬┐┌┬┬┬┐┌┬┬┬┐
  ,. - ''"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ρ ̄`l
   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ノ ̄
 そのとおりだ。
 これで俺からのデザパタ講義は完了だ。
 ほかにも教えなきゃいかんことがたくさんあるが
 しばらく一人でやってみろ。
        / ̄ ̄\
      /       \
      |::::::        |
     . |:::::::::::     |
       |::::::::::::::    |          ....,:::´, .
     .  |::::::::::::::    }          ....:::,,  ..
     .  ヽ::::::::::::::    }         ,):::::::ノ .
        ヽ::::::::::  ノ        (:::::ソ: .
        /:::::::::::: く         ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
         |:::::::::::::::|ヽ、二⌒)━~~'´
 やる夫はまだまだ知りたいことがたくさんあるお
 次は暗号技術について知りたいから
 やる夫で学ぶシリーズかけるくらいになっとけお。
       ____
     /⌒  ⌒\
   /( ―)  (―)\
  /::::::⌒(__人__)⌒::::: \
  |              |
  \               /
 っっっっ!!
    ___
    /    \       ___
  /ノし   u;  \   ;/(>)^ ヽ\; あぶぶ
  | ⌒        ) ;/  (_  (<) \;
  |   、       );/   /rェヾ__)⌒:::  ヾ;
  |  ^       | i   `⌒´-'´  u;  ノ;;
  |          | \ヽ 、  ,     /;
  |  ;j        |/ \-^^n ∠   ヾ、
  \       / ! 、 / ̄~ノ __/ i;
  /      ⌒ヽ ヽ二)  /(⌒    ノ
 /       r、 \ /  ./   ̄ ̄ ̄/
ということでやる夫で学ぶデザインパターンは終了です。ありがとうございました!私はやる夫がすきなのでまたテケトーに技術関連のエントリを書く事があるかと思いますのでそのときはまた読みにきて頂けると嬉しいです。
ほいたらそのときはまたよろしくお願いします。

コメント / トラックバック6件

  1. kin より:

    最近デザインパターンを勉強していたので、楽しく読ませてもらいました。

  2. ひげもじゃ より:

    kinさんこんにちは。
    おおー!ありがとうございます。勉強にはわかりにくいところも沢山あったと思いますが、楽しんで頂けたならとても嬉しいです!

  3. rin1024 より:

    デザインパターン、覚えなきゃと思いつつ全然理解しきれてなかったのですが、
    こちらのエントリみつつ勉強させていただきました。
    面白かったです、ありがとうございます。

  4. ひげもじゃ より:

    rin1024さんこんにちは。
    コメントありがとうございます。つたない説明も沢山あったと思いますが、最後まで読んで頂いてとても嬉しく思います!ありがとうございます。

  5. ishihara より:

    はじめまして.

    やる夫の馬鹿さ加減のやらない夫の苦悩のやり取りで,エントリーを1回から最終回まで一気に楽しく読ませていただきましたw
    サンプルコードも載っていて勉強になりました.

    何度かまた読み直したいと思います.
    ありがとうございました!

  6. higemoja より:

    ishiharaさん。
    こんにちは。ありがとうございます!
    そういっていただけるととても嬉しいです。
    やる夫はとても好きなキャラクターなのでまたどこかのエントリで使うかもしれません。
    最後まで読んでいただいてありがとうございました!

コメントをどうぞ