このままだとFlipside.xcodeprojで同じような動作を確認しようと思った場合、ChimpanzeeGameAppDelegate、ChimpanzeeGameViewControllerが必要になるわけですよ。
だいたい、ChimpanzeeGameAppDelegateやChimpanzeeGameViewControllerが利用できるようにする設定を考えるだけでややこしそう。
もちろん、Objective-Cのメッセージ機構のおかげでsetCalculatorにFlipsideAppDelegateインスタンスを指定し、FlipsideAppDelegateにcalcButtonSizeメソッドを実装して、その中で計算をすべて完結させれば(ChimpanzeeGameAppDelegateやChimpanzeeGameViewControllerでやってる計算をおこなう)上記クラスは必要なくなるんだけど、これだと同じ実装が二カ所に存在してしまうことになり、calcButtonSizeの実装を変更するたびにChimpanzeeGameAppDelegate、ChimpanzeeGameViewControllerとFlipsideAppDelegateの実装をシンクロさせなければいけなくなる。
めんどくせえからFlipside.xcodeprojやめちゃうか?
とか、考えないように。
ChimpanzeeGameAppDelegate、ChimpanzeeGameViewControllerは必須ですとかもな~。
そういうの駄目だから。
大規模開発ではその選択肢無いから。
ロボコン0点だから。
こういう場合、大人は重複する部分をあらたに一つのクラスとして抽出する。ファクタライズ、つまり因数分解ですな。
ちゅーことで、
ChimpanzeeLayouter
というクラスを用意し、これにcalcButtonSizeを持たせます。インターフェース定義はChimpanzeeGameAppDelegate.hのものを使い、実装はChimpanzeeGameAppDelegate.m、ChimpanzeeGameViewController.mのcalcButtonSizeを合成したものになります。
あと、こいつはビューでもビューコントローラでもないので、ビューの横幅、高さを設定するメソッドも用意しないと駄目ですな。
-(void)setViewSize:(int)inWidth height:(int)inHeight;
こんな感じ。
作成するには、ファイル>新規ファイル...メニューでNSObject(subclass)を選びます。
ソースの配置は、Flipsideフォルダと同じ階層にLayoutていう名のフォルダを用意して、その中に
ChimpanzeeLayouter.m
ChimpanzeeLayouter.h
としましょう。
ソースの再配置なんかは、「iPhoneアプリ開発、その(50)」を参考に。
Flipside.xcodeprojではこのChimpanzeeLayouterインスタンスをFlipsideAppDelegateで作成管理し、FlipsideViewに渡して利用してもらうようにする。
ChimpanzeeGame.xcodeprojでは、このChimpanzeeLayouterインスタンスをChimpanzeeGameAppDelegateで作成管理し、ChimpanzeeGameViewControllerに渡して利用してもらうようにする。
これで、Flipside.xcodeprojはLayoutフォルダだけに依存することになり、ChimpanzeeGameAppDelegateやChimpanzeeGameViewControllerからは解放される。ChimpanzeeGame.xcodeprojの方も、このクラスを使うことで、同じ実装が二カ所に存在することもなくなる。
ChimpanzeeGameViewControllerは
-(void)setSize:(int)inHCount vCount:(int)inVCount
での自力計算をやめ、あらたに
- (void)setSize:(double)inSizeRatio
としてChimpanzeeLayouterを使ってボタン矩形を計算するように変更。
これを期にChimpanzeeGameAppDelegateのbuttonSizeIndex変数は廃止し、double型の変数としてbuttonSizeRatioを用意。
は
とし(あ、なんかデジャヴ)
は
とします。
最後に、せっかくなんでObjective-Cのメッセージ機構の実験。
FlipsideView.m、FlipsideView.hをまったく触らず
は
に変えるだけで動かしてみやしょう。
ま~、見た目はChimpanzee-16から特に変化無いけどね。
ファイルの構成という点で、重要な変更なわけです。
Flipside.xcodeprojもFlipsideAppDelegateにChimpanzeeGameAppDelegateでやったような処理を加えることで実行できるようになっとりますよ。
んじゃまた。
------------
サンプルプロジェクト:Chimpanzee-17.zip
だいたい、ChimpanzeeGameAppDelegateやChimpanzeeGameViewControllerが利用できるようにする設定を考えるだけでややこしそう。
もちろん、Objective-Cのメッセージ機構のおかげでsetCalculatorにFlipsideAppDelegateインスタンスを指定し、FlipsideAppDelegateにcalcButtonSizeメソッドを実装して、その中で計算をすべて完結させれば(ChimpanzeeGameAppDelegateやChimpanzeeGameViewControllerでやってる計算をおこなう)上記クラスは必要なくなるんだけど、これだと同じ実装が二カ所に存在してしまうことになり、calcButtonSizeの実装を変更するたびにChimpanzeeGameAppDelegate、ChimpanzeeGameViewControllerとFlipsideAppDelegateの実装をシンクロさせなければいけなくなる。
めんどくせえからFlipside.xcodeprojやめちゃうか?
とか、考えないように。
ChimpanzeeGameAppDelegate、ChimpanzeeGameViewControllerは必須ですとかもな~。
そういうの駄目だから。
大規模開発ではその選択肢無いから。
ロボコン0点だから。
こういう場合、大人は重複する部分をあらたに一つのクラスとして抽出する。ファクタライズ、つまり因数分解ですな。
ちゅーことで、
ChimpanzeeLayouter
というクラスを用意し、これにcalcButtonSizeを持たせます。インターフェース定義はChimpanzeeGameAppDelegate.hのものを使い、実装はChimpanzeeGameAppDelegate.m、ChimpanzeeGameViewController.mのcalcButtonSizeを合成したものになります。
あと、こいつはビューでもビューコントローラでもないので、ビューの横幅、高さを設定するメソッドも用意しないと駄目ですな。
-(void)setViewSize:(int)inWidth height:(int)inHeight;
こんな感じ。
作成するには、ファイル>新規ファイル...メニューでNSObject(subclass)を選びます。
ソースの配置は、Flipsideフォルダと同じ階層にLayoutていう名のフォルダを用意して、その中に
ChimpanzeeLayouter.m
ChimpanzeeLayouter.h
としましょう。
ソースの再配置なんかは、「iPhoneアプリ開発、その(50)」を参考に。
Flipside.xcodeprojではこのChimpanzeeLayouterインスタンスをFlipsideAppDelegateで作成管理し、FlipsideViewに渡して利用してもらうようにする。
ChimpanzeeGame.xcodeprojでは、このChimpanzeeLayouterインスタンスをChimpanzeeGameAppDelegateで作成管理し、ChimpanzeeGameViewControllerに渡して利用してもらうようにする。
これで、Flipside.xcodeprojはLayoutフォルダだけに依存することになり、ChimpanzeeGameAppDelegateやChimpanzeeGameViewControllerからは解放される。ChimpanzeeGame.xcodeprojの方も、このクラスを使うことで、同じ実装が二カ所に存在することもなくなる。
ChimpanzeeGameViewControllerは
-(void)setSize:(int)inHCount vCount:(int)inVCount
での自力計算をやめ、あらたに
- (void)setSize:(double)inSizeRatio
としてChimpanzeeLayouterを使ってボタン矩形を計算するように変更。
これを期にChimpanzeeGameAppDelegateのbuttonSizeIndex変数は廃止し、double型の変数としてbuttonSizeRatioを用意。
buttonSizeIndex = [defaults integerForKey:kButtonSize];
は
buttonSizeRatio = [defaults doubleForKey:kButtonSize];
if (buttonSizeRatio > 1.0) // 旧バージョンへの対応
buttonSizeRatio = 1.0;
とし(あ、なんかデジャヴ)
[defaults setInteger:buttonSizeIndex forKey:kButtonSize];
は
[defaults setDouble:buttonSizeRatio forKey:kButtonSize];
とします。
最後に、せっかくなんでObjective-Cのメッセージ機構の実験。
FlipsideView.m、FlipsideView.hをまったく触らず
[flipsideView setCalculator:self];
は
[flipsideView setCalculator:layouter];
に変えるだけで動かしてみやしょう。
ま~、見た目はChimpanzee-16から特に変化無いけどね。
ファイルの構成という点で、重要な変更なわけです。
Flipside.xcodeprojもFlipsideAppDelegateにChimpanzeeGameAppDelegateでやったような処理を加えることで実行できるようになっとりますよ。
んじゃまた。
------------
サンプルプロジェクト:Chimpanzee-17.zip