≪ 第3回・
第5回 ≫
前回の失敗でスパヒロ大戦のプロジェクトからはずされたやる夫は、現在、携帯向けアプリケーションの「ニコニコクロニクル2.0(ロールプレイングゲーム)」の開発に携わっています。

やる夫の担当は、武器アイテムの管理です。ニコニコクロニクル1.0のリリース時には、今ほどリッチなクライアントではなく、武器も非常に限られていて右記のようなクラス図で実現されていました。
しかし、昨今の携帯の高機能化により、ニコニコクロニクル2.0ではこれまでの単純な武器アイテムの管理に加えて、「指輪」や「腕輪」、「髪飾り」などを勇者が持つことにより、武器の破壊力を強化できるシステムになりました。(ワタシはゲーム開発をお仕事でやっておりません。携帯が高機能だから云々は話を進めるためにとってつけたものです。)
やる夫はこれらの強化アイテムも武器管理デザインとしてシステムに組み込む必要が出てきました。

やる夫が作成したクラス図は右記のようなものです。
<やる夫>
___
____,./ \
ノ / \ 継承が大爆発しちゃったお
/ / \
| |::.. ...::::|
ヽ `一ー――――-、;;;;::/`一ー―-、
ヽ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
____
/ \
/ _ノ ヽ、_ \きっとアーキテクトにフルボッコにされるお
/ o゚⌒ ⌒゚o \
| (__人__) |
\ ` ⌒´ /
____
/⌒ ⌒\
/( ●) (●)\
/::::::⌒(__人__)⌒::::: \ でも動けば文句ないんだお!
| |r┬-| | きっとちゃんと動くお!
\ `ー'´ / 頑張ったことは認めてくれるはずだお!
____
/ ⌒ ⌒ \
./( ―) ( ●) \
/::⌒(_人_)⌒::::: | チラッ
| ー .|
\ /
<アーキテクト>
/ ̄ ̄\
/ \
|:::::: | それ(ry
. |::::::::::: | 常(ry
|:::::::::::::: | ....,:::´, .
. |:::::::::::::: } ....:::,, ..
. ヽ:::::::::::::: } ,):::::::ノ .
ヽ:::::::::: ノ (:::::ソ: .
/:::::::::::: く ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
|:::::::::::::::|ヽ、二⌒)━~~'´
____
/ ⌒ ⌒ \
./( ―) ( ○) \
/::⌒(_人_)⌒::::: | ・・・聞き取れないお。。。
| ー .|
\ /
やる夫が作成したサブクラス群は、武器×アイテムのマトリクスを総当りでクラスに書き出したものです。この場合、強化アイテムがひとつ増えただけで、武器数分のクラスを改めて作る必要が出てきてしまいます。また、既存の強化アイテムの強化値が変更された場合、同様に武器数分のクラスを見て回る必要があります。
これから強化アイテムをいくつか追加する予定があるが
その分のクラスを作りてぇなら作れ。
さもなくば、今のクラス群をとっととCVSからリムーブしてデザインしなおせ
/ ̄ ̄\
/ \
|:::::: |
. |::::::::::: |
|:::::::::::::: | ....,:::´, .
. |:::::::::::::: } ....:::,, ..
. ヽ:::::::::::::: } ,):::::::ノ .
ヽ:::::::::: ノ (:::::ソ: .
/:::::::::::: く ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
|:::::::::::::::|ヽ、二⌒)━~~'´
____
/ \
/ ─ ─\ わかりました。
/ (●) (●) \ さらにクラスをつくtt
| (__人__) |
/ ∩ノ ⊃ /
( \ / _ノ | |
.\ “ /__| |
\ /___ /
/ ̄ ̄\
/ノ( _ノ \ いいからCVSからソース消しとけや
| ⌒(( ●)(●)
.| (__人__) /⌒l
| ` ⌒´ノ |`'''|
/ ⌒ヽ } | |
/ へ \ }__/ / / ̄ ̄\
/ / | ノ ノ / ●)) ((●\’, ・
( _ ノ | \´ _ ( (_人_)’∴ ),
| \_,, -‐ ''"  ̄ ゙̄''―---└'´ ̄`ヽ て
.| ______ ノ (
ヽ _,, -‐ ''" ノ ヽ r'
\ , '´ し/.. | J
\ ( / |
\ \ し- '^`-J
というわけで、やる夫は武器と強化アイテムのデザインをしなおすことになりました。
class Weapon {
String description;
// 強化アイテムのブール値
boolean isBracelet;
boolean isMantle;
boolean isHairOrnament;
boolean isRing;
getDescription();
getPower();
hasBracelet();
setBracelet();
hasMantle();
setMantle();
hasHairOrnament();
setHairOrnament();
hasRing();
setRing();
}
これは、やる夫が作成しなおしたスーパークラスWeaponです。それぞれの強化アイテムのブール値を保持し、スーパークラスのgetPowerメソッドで強化された値を全て計算します。サブクラスとなる武器はgetPowerをオーバーライドし、その武器の強化値を独自に計算し、後にスーパークラスのgetPowerを呼び出すという寸法です。
<やる夫>
これで、ニコニコクロニクル1.0から
クラスもそれほど増えずに強化アイテムを含めた管理ができるお
どう考えても天賦の才だお!
___
/ ⌒ ⌒\
/ (⌒) (⌒) \
/ ///(__人__)/// \
| u. `Y⌒y'´ |
\ ゙ー ′ ,/
/⌒ヽ ー‐ ィヽ
/ rー'ゝ 〆ヽ
/,ノヾ ,> ヾ_ノ,|
| ヽ〆 |´ |
<アーキテクト>
・・・「同じ強化アイテムを2つ以上重ねがけできる」仕様はどうすんだ?
/ ̄ ̄\
/ \
|:::::: |
. |::::::::::: |
|:::::::::::::: | ....,:::´, .
. |:::::::::::::: } ....:::,, ..
. ヽ:::::::::::::: } ,):::::::ノ .
ヽ:::::::::: ノ (:::::ソ: .
/:::::::::::: く ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
|:::::::::::::::|ヽ、二⌒)━~~'´
<やる夫>
___
/ ⌒ ⌒\ メンバを配列に・・・・
/ (○) (○) \ ・・いや・・・その仕様は拒否するお
/ ///(__人__)/// \
| u. `Y⌒y'´ |
\ ゙ー ′ ,/
/⌒ヽ ー‐ ィヽ
/ rー'ゝ 〆ヽ
/,ノヾ ,> ヾ_ノ,|
| ヽ〆 |´ |
ワタシも滅茶苦茶な仕様は拒否したいものですが、今回のやる夫のケースはそうは行きません。
ではどのようなデザインであればよかったのでしょうか。第5回に続きます。
やる夫で学ぶデザインパターンを串刺しで見たい場合はタグのほうからどうぞ。(まだ1パターンしか完結してません。フヒヒ)
≪ 第3回・
第5回 ≫