乱反射の光跡 in hatenablog

なみへいのブログです。hatenablogヴァージョン。

制作ノート その15

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インスタンスを初期化するメソッドはプリミティブ・メソッドから呼び出すだけで済むようになりました。つまり、わざわざ別のメソッドにしても、ソースコードの量は変わらず、かえってプリミティブ・メソッドに組み込んでしまった方がいいような気が(笑)。
「別メソッドに」とあれこれ考えた結果、プリミティブ・メソッド内で充分だという結論が出てしまったわけで(笑)。


どうです。ちゃんと試行錯誤してるでしょう(笑)。(つづく)