4

私は約 1 年半前に iOS 開発者として働き始めましたが、ソフトウェアのアーキテクチャと構成に問題があります。私は Apple が推奨する Model-View-Controller パラダイムを使用しており、私のコードは通常非常に階層的です。たとえば、画面に HUD、コントロール パネル、および表示領域がある場合、画面用のメイン コントローラーとサブ コントローラーがあります。 HUD、コントロール パネル、および表示領域のコントローラー。通常、サブコントローラーは隣接するコントローラーを認識せず、メインコントローラーのメソッドを使用してそれらと対話します。

ただし、特にゲームでは、このモデルではエレガントに解決できない階層破壊の問題に遭遇することがよくあります。たとえば、コントロール パネル領域にコインがあり、HUD に飛んでいくアニメーションを作成したいとします。元のコインを新しい位置にアニメーション化することもできます。これには、コントロール パネルのサブコントローラーで animateCoinToPosition: のようなメソッドが必要になり、メイン コントローラーで getPositionForFinalCoinPositionInHUD のようなメソッドが必要になります。または、元のコインを非表示にして、メイン コントローラーまたは HUD コントローラーで複製コインを作成することもできます。これには、animateCoinToHUDFromStartingPosition: のようなデリゲート メソッドが必要です。コントローラーにそのような奇妙に固有のメソッドがあるのは好きではありません。それらは実際には 1 つの問題を解決するためだけに存在し、さらに階層を公開するためです。私の理想的な解決策は、animateCoinToHUD と呼ばれる単一のメソッドを持つことですが、これには階層全体をフラット化し、3 つのコントローラーを 1 つにマージする必要があり、明らかに価値がありません。(または、サブコントローラーに兄弟へのアクセスを許可しますが、それは本質的に同じ効果があります。サブコントローラーは相互に依存関係を持ち、メインコントローラーの代わりに単一の乱雑なクモの巣コントローラーを作成し、3 つのほとんど独立したサブコントローラーを作成します。コントローラー。)

そして、それはしばしば悪化します。コインを動かすときに全画面アニメーションやパーティクル効果を表示したい場合はどうすればよいですか? コインが単純なスプライトよりもはるかに複雑で、多くのサブビューと詳細があり、animateCoinToHUDFromStartingPosition: を使用して複製コインを作成するのが効率的でない場合はどうすればよいでしょうか? コインが HUD に飛んだ後、コントロール パネルに戻ってきた場合はどうなりますか? コイン ビューをメイン コントローラーに「貸与」し、アニメーションが完了したら、元の位置/Z オーダーなどを保持して元に戻しますか? それらを復元できるように一時変数に?もう 1 つ: 論理的には、複数のサブコントローラーに関係するコードはメイン コントローラーに属しますが、これらの相互作用が一般的である場合、メイン コントローラーは何千行もの長さに成長します。

コードやアセットの重複を必要とせず、コントローラーを肥大化させず、サブコントローラー間でオブジェクトをエレガントに共有できる、これらの階層を壊す効果とアクションを処理する一貫した方法はありますか? それとも、完全に間違ったアプローチを使用していますか?

4

1 に答える 1

1

ですから、文字通り、階層を「決して上がらない」ことを考えているのではないかと思います。

親が何であるかを具体的に知らないという考えだと思いますが、プロトコルを定義して、親オブジェクトが何であれ、そのプロトコルに応答することを知ることができます。理想的には、コードをテストして、そのプロトコルに応答することを確認します。次に、プロトコルを使用して、コインオブジェクトを親オブジェクトに渡し、親オブジェクトに画面からHUDにアニメーション化させる一般的な方法でメッセージを送信します。

サブコントローラーにはid<parent_protocol> parent;インスタンス変数があり、それらの初期化メソッドはそれらの1つをパラメーターとして受け取ります。あなたの説明を考えると、あなたはすでにこのようなものを持っているか、少なくとも「サブコントローラーは通常、隣接するコントローラーの知識がなく、メインコントローラーのメソッドを使用してそれらと対話する」のに十分です。

したがって、設計の観点からは、コインのピックアップは表示パネルで行われ、親オブジェクトには、ピックアップされたコインで適切なpickupCoin:処理を実行するメソッドがあることがわかっています。ディスプレイパネルは、それがHUDに送られることなどを認識していません。拾ったコインが、親コントローラーのメソッドによって処理されるだけです。pickupCoin:

ここでのOOP設計哲学は、親のすべての知識がプロトコル定義にカプセル化されることです。これにより、子と親の結合が緩くなり、そのプロトコルを実装した親を入れ替えても、子は正常に機能します

使用できるカップリングは緩いものがありますが(グローバルに投稿された通知によると)、説明する場合は、私が概説したようなものがおそらくより適切で、おそらくよりパフォーマンスが高いと思います。

それは役に立ちますか?

于 2012-09-14T17:44:12.143 に答える