NNCardDeck version0.4(4)
またもや、同じようなコードをだらだらと書いてしまったソースファイル。こういうのをきっと「センスが悪い」と言うのでしょう(笑)。
という訳で、ソースを整理します。
まず思いつくのは、似たようなコードをメソッド(あるいは関数)に纏めてしまう方法。基本ですな(笑)。
NNCardオブジェクトに渡す値を保持するNSArrayインスタンスそれぞれを定数で初期化するメソッドを追加して、それを呼び出すことにすればいい、ということにしましょうか。
例えば、NSArray *stdValues;の場合。
- (id)makeStdValues { NSMutableArray *tempArray; int i; tempArray = [[NSMutableArray alloc] initWithCapacity:53]; for (i=0; i < 53; i++) { id object; object = [[NSNumber alloc] initWithInt:initialStdValues[i]]; [tempArray addObject:object]; } return tempArray; }
intFlagsの場合はこう。
- (id)makeIntFlags { NSMutableArray *tempArray; int i; tempArray = [[NSMutableArray alloc] initWithCapacity:53]; for (i=0; i < 53; i++) { id object; object = [[NSNumber alloc] initWithInt:0]; [tempArray addObject:object]; } return tempArray; }
こういうのを用意しておき、必要に応じて呼び出してやればいいわけです。
と、ここまで考えたのですが、そこでふと思いついたりして(笑)。このNSArrayを初期化するメソッドで、引数があればその引数で初期化し、引数が「nil」ならば内部定数で初期化する、という方法はどうだろうかと。そうすると、上の-(id)makeStdValuesは、こうなります。
- (id)makeStdValues:(NSArray *)sValues { NSMutableArray *tempArray; int i; if (sValues == nil) { tempArray = [[NSMutableArray alloc] initWithCapacity:53]; for (i=0; i < 53; i++) { id object; object = [[NSNumber alloc] initWithInt:initialStdValues[i]]; [tempArray addObject:object]; } } else { tempArray = [[NSMutableArray alloc] initWithArray:sValues]; } return tempArray; }
するとどうなるか。
派生初期化メソッド(パラメータの少ない初期化メソッド)はその実装においてプリミティブ・メソッドを呼び出すのですが(そうすれば、サブクラスにおいてプリミティブ・メソッドのオーバーライドだけで派生初期化メソッドが使用可能になる)、その際に内部定数で初期化するものについては「nil」を渡せばいい、ということになります。
<例>
- (id)initWithStdValues:(NSArray *)sValues altValues:(NSArray *)aValues { deckValue = 1; jokerValue = 1; return [self initWithStdValues:sValues altValues:aValues valueFlags:nil boolFlags:nil intFlags:nil deckValue:deckValue jokerValue:jokerValue]; }
これで、あっちでもこっちでもいちいち同じようなコードを書く必要がなくなりました。
ところで、この「nil」を渡す方法をとることで、NSArrayインスタンスを初期化するメソッドはプリミティブ・メソッドから呼び出すだけで済むようになりました。つまり、わざわざ別のメソッドにしても、ソースコードの量は変わらず、かえってプリミティブ・メソッドに組み込んでしまった方がいいような気が(笑)。
「別メソッドに」とあれこれ考えた結果、プリミティブ・メソッド内で充分だという結論が出てしまったわけで(笑)。
どうです。ちゃんと試行錯誤してるでしょう(笑)。(つづく)