私は約 1 年半前に iOS 開発者として働き始めましたが、ソフトウェアのアーキテクチャと構成に問題があります。私は Apple が推奨する Model-View-Controller パラダイムを使用しており、私のコードは通常非常に階層的です。たとえば、画面に HUD、コントロール パネル、および表示領域がある場合、画面用のメイン コントローラーとサブ コントローラーがあります。 HUD、コントロール パネル、および表示領域のコントローラー。通常、サブコントローラーは隣接するコントローラーを認識せず、メインコントローラーのメソッドを使用してそれらと対話します。
ただし、特にゲームでは、このモデルではエレガントに解決できない階層破壊の問題に遭遇することがよくあります。たとえば、コントロール パネル領域にコインがあり、HUD に飛んでいくアニメーションを作成したいとします。元のコインを新しい位置にアニメーション化することもできます。これには、コントロール パネルのサブコントローラーで animateCoinToPosition: のようなメソッドが必要になり、メイン コントローラーで getPositionForFinalCoinPositionInHUD のようなメソッドが必要になります。または、元のコインを非表示にして、メイン コントローラーまたは HUD コントローラーで複製コインを作成することもできます。これには、animateCoinToHUDFromStartingPosition: のようなデリゲート メソッドが必要です。コントローラーにそのような奇妙に固有のメソッドがあるのは好きではありません。それらは実際には 1 つの問題を解決するためだけに存在し、さらに階層を公開するためです。私の理想的な解決策は、animateCoinToHUD と呼ばれる単一のメソッドを持つことですが、これには階層全体をフラット化し、3 つのコントローラーを 1 つにマージする必要があり、明らかに価値がありません。(または、サブコントローラーに兄弟へのアクセスを許可しますが、それは本質的に同じ効果があります。サブコントローラーは相互に依存関係を持ち、メインコントローラーの代わりに単一の乱雑なクモの巣コントローラーを作成し、3 つのほとんど独立したサブコントローラーを作成します。コントローラー。)
そして、それはしばしば悪化します。コインを動かすときに全画面アニメーションやパーティクル効果を表示したい場合はどうすればよいですか? コインが単純なスプライトよりもはるかに複雑で、多くのサブビューと詳細があり、animateCoinToHUDFromStartingPosition: を使用して複製コインを作成するのが効率的でない場合はどうすればよいでしょうか? コインが HUD に飛んだ後、コントロール パネルに戻ってきた場合はどうなりますか? コイン ビューをメイン コントローラーに「貸与」し、アニメーションが完了したら、元の位置/Z オーダーなどを保持して元に戻しますか? それらを復元できるように一時変数に?もう 1 つ: 論理的には、複数のサブコントローラーに関係するコードはメイン コントローラーに属しますが、これらの相互作用が一般的である場合、メイン コントローラーは何千行もの長さに成長します。
コードやアセットの重複を必要とせず、コントローラーを肥大化させず、サブコントローラー間でオブジェクトをエレガントに共有できる、これらの階層を壊す効果とアクションを処理する一貫した方法はありますか? それとも、完全に間違ったアプローチを使用していますか?