≪第18回・第20回≫
やる夫で学ぶデザインパターンとは何の関係もありませんが、このポストで300エントリになりました。結構書いてるなー。mojalogは始めてから丁度1年くらいになるのでおよそ1日に1回くらいはポストしている割合になります。読み返すとほんっとにくだらないポストばかりしていますが、見に来ていただいてる方には心より感謝申し上げます。ありがとうございます。(うれしいですと言いたいだけです。)
と言うわけで、今回はイテレータパターンで解決に向かいたいと思います。
やる夫で学ぶデザインパターンとは何の関係もありませんが、このポストで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 } \ ` ⌒´ _/
ヽ:::::::::: ノ | \
/:::::::::::: く | | | |
―――|:::::::::::::::: \――┴┴―――――┴┴――



