« やる夫がデザインパターンをやるようです 第18回 | メイン | Google Dynamic Feed Control »



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

やる夫がデザインパターンをやるようです 第19回をはてなブックマークに追加 やる夫がデザインパターンをやるようです 第19回をdel.icio.usに追加  Yahoo!ブックマークに登録 やる夫がデザインパターンをやるようです 第19回をGoogle Bookmarksに追加 やる夫がデザインパターンをやるようです 第19回をtwitterにポスト
≪第18回第20回≫

やる夫で学ぶデザインパターンとは何の関係もありませんが、このポストで300エントリになりました。結構書いてるなー。mojalogは始めてから丁度1年くらいになるのでおよそ1日に1回くらいはポストしている割合になります。読み返すとほんっとにくだらないポストばかりしていますが、見に来ていただいてる方には心より感謝申し上げます。ありがとうございます。(うれしいですと言いたいだけです。)

と言うわけで、今回はイテレータパターンで解決に向かいたいと思います。
public void listAbilityCollection(){

    // 潜在能力コレクションの取得・・・
    // 魔法コレクションの取得・・・

    ArrayList ptntItems = potentialCollection.getAbiiltyItems();
    AbilityItem[] mgcItems = magicCollection.getAbiiltyItems();

    // 潜在能力コレクションはArrayListを返すのでキャストしてリスト
    for( int idx = 0; idx < ptntItems.size(); idx++ ){
        AbilityItem abiItem = (AbilityItem)ptntItems.get( idx );
        System.out.println( abiItem.getName() );
        // ・・・
    }

    // 魔法コレクションは配列をそのまま返すので直接参照してリスト
    for( int idx = 0; idx < mgcItems.length; idx++ ){
        AbilityItem abiItem = mgcItems[ idx ];
        System.out.println( abiItem.getName() );
        // ・・・
    }

コードを見ると
PotentialCollectionのgetAbiiltyItems()も
MagicCollectionのgetAbiiltyItems()も
返す型さえ違わなければ、後はほとんど同じ動きをするクラスだお。。。
     ____
   /      \
  /  ─    ─\
/    (●)  (●) \
|       (__人__)    |
/     ∩ノ ⊃  /
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ / 





         |
     \  __  /
     _ (m) _
        |ミ|
      /  `´  \
   てことはとりあえずMagicCollectionのほうを
   ArrayListにして合わせちゃえば問題は解決するお。
       ____
     /⌒  ⌒\
   /( ●)  (●)\
  /::::::⌒(__人__)⌒::::: \
  |     |r┬-|     |
  \      `ー'´     / 











   / ̄ ̄\
 /  _ノ   \   おいおい。ちょっとまて。
 |   ( ●)(●)l 今は返す型が配列とArrayListだけだから
. |    (__人__) |どっちかに倒せばいいと思ってるようだが、
  |    ` ⌒´ | 今後、Vectorでコレクションを実装してる
.  |         } なんてのが見つかったらどうすんだ?
.  ヽ        }
   ヽ     ノ
   /    く
   /     ヽ





// 忍術は魔法と違う扱い
public class NinpoCollection implements Collection {
    Vector abilityItems;
    // Vectorでアビリティを扱う。
    public Vector getAbiiltyItems(){
        return abilityItems;
    }
}
         ___
       / ⌒  ⌒\
      / (○)  (○) \  え。いけなかったのかお。。。
    /   ///(__人__)/// \
     |   u.   `Y⌒y'´    |
      \       ゙ー ′  ,/
      /⌒ヽ   ー‐    ィヽ
      / rー'ゝ       〆ヽ
    /,ノヾ ,>      ヾ_ノ,|
    | ヽ〆        |´ | 





 ・・・オマエ、その日の気分で好き勝手に実装してるだろ。
 今は忍術を潜在能力や魔法と全く違う扱いで動かしてるが
 どうせそのうち企画がブースト機能とか言い出すんだから
 とっとと手を打っとけ。
   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)





    for( int idx = 0; idx < ptntItems.size(); idx++ ){
        AbilityItem abiItem = (AbilityItem)ptntItems.get( idx );

    for( int idx = 0; idx < mgcItems.length; idx++ ){
        AbilityItem abiItem = mgcItems[ idx ];

うーん。違うのは
1.走査の判定にsizeを返すかlengthを返すかと
2.要素の取得にget( idx )メソッドを使うか配列の添え字[ idx ]を使うかだけだお。。
         ____
       /      \
      /  ─    ─\
    /    (●)  (●) \
    |       (__人__)    | ________
     \      ` ⌒´   ,/ .| |          |
    ノ           \ | |          |
  /´                 | |          |
 |    l                | |          |
 ヽ    -一ー_~、⌒)^),-、   | |_________|
  ヽ ____,ノγ⌒ヽ)ニニ- ̄   | |  | 






   つまり、カプセル化したいのは
   1.「走査の判定」と
   2.「要素を返す」だお。
        / ̄ ̄ ̄\
        /        \
     /   ─   ─  ヽ
      |   (●)  (●)  | 
     \   (__人__) __,/
      /_______\   



要は、
    while( 走査の判定 ){
        要素を返す
    }

ができればいいんだお。インターフェイスは確定だお!!
public interface Iterator {
    boolean hasNext();  // 次はあるのか
    Object next();      // 次の要素を返す
}
          ____
       / \  /\  キリッ
.     / (ー)  (ー)\
    /   ⌒(__人__)⌒ \
    |      |r┬-|    |
     \     `ー'´   /
    ノ            \
  /´               ヽ
 |    l              \
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))







   / ̄ ̄\
 /   _ノ  \  よくわかってんじゃねーか。そのとおりだ。
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)






ぎゃひひ!おいらに任せとけば全てがうまくいくお!
          ____
        /_ノ  ヽ、_\
 ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒)
| / / /     |r┬-|    | (⌒)/ / / //
| :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/
|     ノ     | |  |   \  /  )  /
ヽ    /     `ー'´      ヽ /    /
 |    |   l||l 从人 l||l      l||l 从人 l||l
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒)) 







           ____ 
        /⌒  ⌒\ 
.      /( ―)  (―)\   ふん、ふーん。
     / ::::::⌒(__人__)⌒::::: \ ふ、んー。
    |      |r┬-|     |  
     \       `ー'´     / 
    ノ            \ 
  /´               ヽ                 カ 
 |    l   l||l 从人 l||l      l||l 从人 l||l   カ    タ 
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.     タ 
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒)) 
     ┌┬┬┐┌┬┬┬┐┌┬┬┬┐┌┬┬┬┐ 
  ,. - ''"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ρ ̄`l 
   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ノ ̄ 






       ____
     /⌒  ー、\
   /( ―)  (―)\
  /::::::⌒(__人__)⌒:::::\  んー?
  |     |r┬-/ '    |
  \      `ー'´     / 





         ____
      /::::::─三三─\  ん・ん・んー?
    /:::::::: ( ○)三(○)\
    |::::::::::::::::::::(__人__)::::  | ________
     \:::::::::   |r┬-|  / | |          |
    ノ::::::::::::  `ー'´   \ | |          | 





           ___
     ____,./      \   すみません。
    ノ   /         \  既存のコードにインプリメントしたら
  /   /            \ドカドカ変更が入ってしまいましたお。
 |     |::..           ...::::| 
 ヽ    `一ー――――-、;;;;::/`一ー―-、
  ヽ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))

public class MagicCollection implements Collection, Iterator {
    static final int MAX_ITEMS = 6;
    int numberOfItems = 0;
    AbilityItem[] abilityItems;

    // mod yaruo 何も返さない。使うな
    public AbilityItem[] getAbiiltyItems(){
//      mod yaruo
//        return abilityItems;
        return null;
    }

    // add yaruo
    boolean hasNext(){
        // 配列の走査判定
    }

    // add yaruo
    Object next(){
        // 次の要素を返す
    }
}





いやいやいや。ちょっとまて。どこに手を入れてやがる。
冒頭のソースでMagicCollectionそのものを走査に使ったか?
クライアントはカプセル化された走査がしたいだけだ。
Iteratorって言うインターフェイスを返すメソッドを追加してやりゃ
既存のコードの修正は数ステップだろが。
   / ̄ ̄\
 /  _ノ   \
 |   ( ○)(○)l
. |    (__人__) |
  |    ` ⌒´ |
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   /     ヽ 
public class MagicCollection implements Collection {
    static final int MAX_ITEMS = 6;
    int numberOfItems = 0;
    AbilityItem[] abilityItems;

//  remove method. sucks
//    public AbilityItem[] getAbiiltyItems(){
//        return abilityItems;
//    }

    // イテレータを返す。
    public Iterator createIterator(){
        return new MagicCollectionItr( abilityItems );
    }
}

MagicCollection用のイテレータはこうだ
配列をパラメータにしたコンストラクタにしてある。
イテレータをimplementsしたクラスに走査処理を委譲してやればいい。
   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)
public class MagicCollectionItr implements Iterator {
    int curPos = 0;
    AbilityItem[] abilityItems;
    public MagicCollectionItr( AbilityItem[] abilityItems ){
        this.abilityItems = abilityItems;
    }

    // 配列の走査判定を行う。
    boolean hasNext(){
        return ( curPos >= abilityItems.length || abilityItems[ curPos ] == null ) ? false : true;
    }

    // 次の要素を返す
    Object next(){
        AbilityItem curAbi = abilityItems[ curPos ];
        curPos++;
        return curAbi;
    }
}



いいかやる夫。既存のコードに対する修正はできるだけ最小限に抑えろ。
仕様変更における既存のコードというものは、
「バグのない適切なコードにするために、多くの時間を費やしたモノ」
と考えるんだ。事実そうじゃなくてもそう思うんだ。

だから既存のコードで振る舞いを変更するみたいなことは極力するな。
今回で言えば、コレクションの走査はもともと
MagicCollectionやPotentialCollectionになかっただろう。
ココに走査するコードを突っ込んだのはオマエの勘違いだとして、
「変更」は最小限にして「拡張」を自由に行うように癖をつけろ。

俺が書いたMagicCollectionItrは、
MagicCollectionからコレクションを取り出して
捜査できるように拡張したコードだ。
今度はこのコードに時間をかけてバグのない適切なコードにするように
デバッグしてコードの品質を積み上げていけ。
   / ̄ ̄\
 /  _ノ   \
 |   ( ●)(●)l
. |    (__人__) |
  |    ` ⌒´ |
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   /     ヽ 






いいかやる夫。
・・・・・・・・
今度はこのコードに時間をかけてバグのない適切なコードにするように
デバッグしてコードの品質を積み上げていけ・・・・?
`――――――――――――○―――――――――――――――’
              O
                o
         ____
       /_ノ   ヽ_\
      /( ●) ( ●)\
    / ::::::⌒(__人__)⌒:::::\
    |        ̄      |
    \              / 






     / ̄ ̄\  えー。単体テストくらいは自分でやってほしいお。
   /       \       ___
   |::::::   U    |    /     \
  . |::::::::::: U   |   /⌒   ⌒  \
    |::::::::::::::    | / (●) (●)   \
  .  |::::::::::::::    }  |    (__人__)     | 
  .  ヽ::::::::::::::  U }  \   ` ⌒´     _/
     ヽ::::::::::  ノ    |           \
     /:::::::::::: く     | |         |  |
 ―――|:::::::::::::::: \――┴┴―――――┴┴―― 

★このコンテンツに目的の情報はありませんでしたか?


[ 最近のエントリーとその関連エントリー ]


[ スポンサードリンク ]

トラックバック

このエントリーのトラックバックURL:
http://mojalog.com/cgi/mt/mt-tb.cgi/301

コメントを投稿

ツリータイプ・カテゴリー

open all | close all

リファラから検索


サイト内検索