« PencilRebelが目を放した隙に新しくなってました! | メイン | やる夫がデザインパターンをやるようです 第19回 »



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

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

コレクションのカプセル化

≪第17回第19回≫

  やる夫。オマエが以前デザインしていた
  マジックコレクションと言うクラスがあるだろう。
   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)





  あるお。魔法を配列で管理しているクラスデザインだお。
  魔法をアビリティクラスで表現したやつだお。
      ____
    /_ノ   ヽ_\
   /( ●) ( ●)\
 / ::::::⌒(__人__)⌒:::::\
 |        ̄      |
 \              / 
やる夫は以前ニコニコクロニクルの魔法管理クラスを実装していました。
魔法クラスはAbilityItemという汎用データストアクラスを利用して表現し、魔法として実装上のラベルをつけて扱っています。
public class AbilityItem {
    String name;    // アビリティ名
    String description;    // 説明
    double effectiveValue;    // アビリティ効果値
    public AbilityItem( String name, String description, double effectiveValue ){
        this.name = name;
        this.description = description;
        this.effectiveValue = effectiveValue;
    }
    // プロパティアクセサメソッド・・・
}

  この汎用アビリティアイテムを魔法1つ1つとして表現したお。
       ____
     /⌒  ⌒\
   /( ―)  (―)\
  /::::::⌒(__人__)⌒::::: \
  |              |
  \               / 
出来上がった魔法群をマジックコレクションクラスにロードして、魔法を一元管理するという手法をとっています。
public class MagicCollection implements Collection {
    static final int MAX_ITEMS = 6;
    int numberOfItems = 0;
    AbilityItem[] abilityItems;
    // 配列でアビリティを扱う。
    public AbilityItem[] getAbiiltyItems(){
        return abilityItems;
    }
}
  このソースはアビリティアイテムを扱う
  マジックコレクションクラスだお。
  魔法は全部で6種類あったから配列の最大値を6として
  スタティックに切ったお。
       ____
     /⌒  ⌒\
   /( >)  (<)\
  /::::::⌒(__人__)⌒::::: \ 
  |    /| | | | |     |
  \  (、`ー―'´,    /






  ああ。わかっている。ニコニコクロニクルプロジェクトに
  入りたての頃に作ったクラスだな。
  で、最近オマエが作った潜在能力クラスPotentialCollectionだが、
   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)




  潜在能力クラスPotentialCollectionは
  魔法を使えないキャラクターの魔法代替能力だお。
  相変わらず企画はわけの分からん仕様を打ち出してくるお。
  ポテンシャルに「邪鬼眼」ていったい何がしたいんだお。
        / ̄ ̄ ̄\
        /        \
     /   ─   ─  ヽ
      |   (●)  (●)  | 
     \   (__人__) __,/
      /_______\   







  魔法が使えないキャラクターの魔法代替能力だと言うことは
  一応わかってんじゃねーか。
  だから、同じようにこのPotentialCollectionとやらを
  使えるかと思ったんだが、
   / ̄ ̄\
 /  _ノ   \
 |   ( ●)(●)l
. |    (__人__) |
  |    ` ⌒´ |
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く    なんだこれは。こっちは
   /     ヽ    ArrayListで返してくんじゃねーか。

public class PotentialCollection implements Collection {
    ArrayList abilityItems;
    // 配列でアビリティを扱う。
    public ArrayList getAbiiltyItems(){
        return abilityItems;
    }
}





   そうだお。ArrayListは便利だお。
   こっちを使うときはキャストして使えお。
      ____
    /⌒  ⌒\
   /(● ) (● )\
 /:::⌒(__人__)⌒:::: \
 |   mj |┬-|     |
 \ 〈__ノ`ー'´    /
  /ノ  ノ ‐‐‐‐一´\






   やる夫。仕様変更のメールは見たか?
   潜在能力は魔法の代替ではなくなった。
   つまり、魔法も使えて潜在能力も持てる
   キャラクターを実現することになる。
   / ̄ ̄\
 /  _ノ   \
 |   ( ●)(●)l
. |    (__人__) |
  |    ` ⌒´ |
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   /     ヽ 






   そんなメール
        ____
    /::::::─三三─\
  /:::::::: ( ○)三(○)\
  |::::::::::::::::::::(__人__)::::  |  _____
   \:::::::::   |r┬-|  ,/ .| |        
   ノ::::::::   `ー'´  \ | |        





      全然知らないお
       ____
     /:∪::─ニ三─ヾ
   /:::::::: ( ○)三(○)\
  (:::::∪:::::::::: (__人__)::::: i| ____
   \:::::::::    |r┬-| ::::ノ  | |      
   リ::::::::    `ー'´  ::\  | |       





  邪鬼眼も、ベギラモも使えるキャラクターが出てくる様な
  仕様じゃゲームバランスが崩れて
  発売3日でワゴンに放り込まれるようになるお。。。。
       ______ 
     /:∪::─ニjjニ─ヾ
   /:::li|.:( ○)三 (○)\
  (:::||!.:∪::::: (__人__)):::: i| ____
    ):::::::::::::   |r┬-| li::::/  | |      
  /:::::::::::::::   `ー ' ::::::ヽ  | |      







        / ̄ ̄\     2週間前には故障表と一緒に
      /       \   仕様変更メールが行ってるだろ
      |::::::        |
     . |:::::::::::     |
       |::::::::::::::    |          ....,:::´, .
     .  |::::::::::::::    }          ....:::,,  ..
     .  ヽ::::::::::::::    }         ,):::::::ノ .
        ヽ::::::::::  ノ        (:::::ソ: .
        /:::::::::::: く         ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
         |:::::::::::::::|ヽ、二⌒)━~~'´ 







 キャラクタークラスで保持している
 魔法コレクションと、潜在能力コレクションをリスト表示する
 メソッドがあるだろう。listAbilityCollection()だな。
 魔法とか潜在能力以外にも
 アビリティコレクションがさらに追加されたらどうすんだ?
   / ̄ ̄\
 /  _ノ   \
 |   ( ●)(●)l
. |    (__人__) |
  |    ` ⌒´ |
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   /     ヽ 





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() );
        // ・・・
    }

         ____
       /      \  ・・・・ど、ど、
      /  ─    ─\
    /    (●)  (●) \
    |       (__人__)    | ________
     \      ` ⌒´   ,/ .| |          |
    ノ           \ | |          |
  /´                 | |          |
 |    l                | |          |
 ヽ    -一ー_~、⌒)^),-、   | |_________|
  ヽ ____,ノγ⌒ヽ)ニニ- ̄   | |  | 






         __ ____
      //   ̄  \\   ど、どう、どし、ど
     //--.--  -─\\    どう、どうし、どしうよう
   //  (● ●) ((●(●) \
 .| |.|    ( . ((_人_人__)    | _ _== =
     \\    ⌒ ` /,/ | |    ̄ ̄ ̄  ̄| ||
    ノ         \\| | | |           ||
  /´                 | |          | |
 |    l                | |          |||
 ヽ    -一ー_~、⌒)^),-、   | |_________| |
  ヽ ____,ノγ⌒ヽ)ニニ- ̄   | |  | = 
2つの異なるアビリティ表現を持ってしまったことにより、このような問題がでてきてしまいました。さらに別の実装を持つコレクション(リスト、ハッシュテーブル、スタックなどなど)が出てきてしまった場合、3つ、4つとループを持つことになってしまいます。次回はこれをデザインパターンで解決していきたいと思います。

≪第17回第19回≫

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


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


[ スポンサードリンク ]

トラックバック

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

コメントを投稿

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

open all | close all

リファラから検索


サイト内検索