1

今日、私はソフトウェアの設計パターンについてリフレッシュしていました。特に、 MVCThree-tier-layer
の違いについて疑問に思っていました。基本的に、ウィキペディアやその他の情報源で読んだことから、2 つの主な違いはコンポーネントの相互作用です。

3 層アーキテクチャの基本的なルールは、クライアント層がデータ層と直接通信しないことです。

一方

...MVC アーキテクチャは三角形です。ビューはコントローラに更新を送信し、コントローラはモデルを更新し、ビューはモデルから直接更新されます。

今:この問題に関するアップルのドキュメントを見ると、次 のことがわかります。


ここに画像の説明を入力

そして、ビューとモデルが直接通信してはならないことを明確にしています:

ビュー オブジェクトは通常、MVC アプリケーションのモデル オブジェクトから切り離されます。

モデル オブジェクトが変更されると (たとえば、ネットワーク接続を介して新しいデータが受信された場合)、コントローラー オブジェクトに通知され、適切なビュー オブジェクトが更新されます。

等々。それで、ここで何が問題なのですか?一般的なものに関係なく、Cocoa は独自の MVC の考え方を採用していますか? それとも、MVC アーキテクチャの一般的な見方に欠けているものがありますか?

4

2 に答える 2

1

MVC の Cocoa バージョンは、MVC の実際の定義の一種のサブセットであると言えますが、それらは別個のエンティティではありません。通常、MVC の Cocoa バージョンは、ビュー (通常はNSWindowおよび/またはNSView)、コントローラー (通常はNSWindowController)、およびモデル レイヤー (単純な配列から Core Data スタックまでのすべて) の使用を中心に展開します。このモデルにおける権限の分離は明確ですが、Wiki が定義する「層」構造のどこにこれらのそれぞれが属するべきでしょうか?

コントローラーとビューはクライアント層の一部であると私は主張します。コントローラーは、モデルとビューの間の委任を担当するだけでなく、ユーザー イベントに応答し、フレームワーク以外のエラー処理中に実行する正しい一連のアクションを決定する責任があります。このアプローチを MVC に適用することで、実際に Cocoa がパターンのより広い定義をどのように満たしているかを確認し始めることができます。

3 層アーキテクチャの基本的なルールは、クライアント層がデータ層と直接通信しないことです。

これはおそらく 3 つの中で最も推論が難しいものであり、パターンのコンテキストで「コミュニケーション」が実際に何を意味するのかを掘り下げる必要があります。コミュニケーションとは、コントローラーがモデルのアクションに直接関与しないことを意味します。これは、コントローラーがモデルの内容の変更を命令できないということではなく、コントローラーがモデル自体の更新方法に関与していないということです。コントローラーはインプリメンターではなくディレクターとして機能するため、データベース層の作成が大幅に簡素化されます。これが、Core Data と SQLite3 が Foundation クラスではなく外部フレームワークとして存在する理由の 1 つです。

ビュー オブジェクトは通常、MVC アプリケーションのモデル オブジェクトから切り離されます。

これは、パターンを使用してプログラミングする際に古くからあるタブーの 1 つを引き起こします: ビューを賢くしすぎることです。コントローラーはモデルとビューの間に強固なバリアを提供し、コントローラーがモデル レイヤーからのコンテンツのディレクタおよびフィルターとして機能するようにします。そのような障壁がなければ、たとえばテーブルビューは、すべてのセルにデータベースからのデータのコピーがあり、変更が別のセルに伝播されたときにいつどのように更新するかを各セルが認識していることを確認する必要があります。ココアでは、これが私たちの場所ですNSWindowControllersそれらはルート ビューの表示を管理し、一部のモデルとそれが管理するビューのコンテンツとの間の障壁として機能します。ただし、Cocoa のコントローラー オブジェクトはビューに偏っていることに注意することが重要です。これは主に、不要な接着剤をかなり使わずに、あらゆる種類のモデル レイヤーに汎用的なアウトレットを提供することがほぼ不可能であるためです。

モデル オブジェクトが変更されると (たとえば、ネットワーク接続を介して新しいデータを受信した場合)、コントローラー オブジェクトに通知され、適切なビュー オブジェクトが更新されます。

上で説明した理由から、そうあるべきです。しかし、あなたが与えたネットワーキングの例に基づいて構築するには、これを考慮してください: データをフェッチする NSOperation と、テーブルビューを管理するコントローラーが与えられた場合、おそらくコントローラーがその太い指を操作に突き刺したくないでしょう。テーブルビューは生NSDataで受信し、貴重なレンダリング時間を結果の処理と表示に費やさなければなりません。

等々。それで、ここで何が問題なのですか?一般的なものに関係なく、Cocoa は独自の MVC の考え方を採用していますか? それとも、MVC アーキテクチャの一般的な見方に欠けているものがありますか?

私がこれから導き出す結論は、MVC と Cocoa がそれを行う方法における権力の分離に関するあなたの定義が間違っているということだと思います。現在、Objective-C コミュニティ内でMVVMに向けた興味深い動きがありますが、Cocoa はこのパターンに固執することにかなり厳格です。

于 2013-05-29T06:51:01.210 に答える
0

ほとんどのココア アプリで実践されている MVC は、教科書で定義されている MVC ではありません。さまざまなフレームワークで採用されている MVC にはさまざまなバリエーションがあります。ビジュアル デザイナーを備えたツールで使用される MVC は、ビジュアル デザイナーの実装に大きく影響されます。XCode を使用すると、ストーリー ボードと nib を使用できます。cocoa ライブラリーと関係の分離方法は、この影響を受けています。これらのツールを利用したい場合は、Xcode によってコンサーンがどのように分離され、このアプローチ内で機能するかを理解することをお勧めします。コードはよりスムーズに共存できます。Apple のドキュメントがこれに役立ちます。

そうは言っても、MVC は関心の分離に関するものです。ソフトウェアの設計と保守において、関心事を分離することは非常に重要です。懸念を適切に分離することで、依存関係を減らし、循環的な複雑さを減らし、コードをよりテストしやすく保守しやすくすることができます。これに注意を払うのは良いことだと思います.MVCをどのように構築するにしても、実装のガイドとして懸念事項を分離する理由を検討する必要があります.

于 2014-09-12T14:17:38.853 に答える