web-dev-qa-db-ja.com

これはiOS MVCパターンの適切な実装ですか?

Apple docsを参照した後、MVCパターンのこのサンプルに遭遇しました:

mvc

NSNotificationCenterを使用し、KVOを使用しない場合、以下のこの図はMVCパターンの正しい実装を表していますか?そうでない場合、何が問題で、どのように修正または改善できますか?

mvc example

  1. アプリは左のライトがオンに設定された状態で始まり、右のライトがオフになっています。一度に点灯できるライトは1つだけです。
  2. ユーザーが右のスイッチを押すと、ターゲットアクションがビューコントローラーに送信されます。
  3. ビューコントローラーはメッセージを受信し、適切なライトデータモデルにメッセージを送信します。
  4. 右ライトはNSNotificationCenterを使用して、右ライトが変更されたことをコントローラーに通知します。
  5. コントローラはメッセージを受信し、次のメソッドを実行します

    BOOL rightLightOn = [rightLightData on]; if( rightLightOn ) { [rightLightImage setImage:onImage]; [leftLightSwitch setOn:NO]; } else { [rightLightImage setImage:offImage]; }

  6. スイッチの変更により、UISwitchはコントローラーのメソッド「leftSwitchChanged」を呼び出します。

  7. コントローラはメッセージを受信し、メッセージを左ライトデータモデルに送信します。
  8. 左ライトはNSNotificationCenterを使用して、左ライトが変更されたことをコントローラーに通知します。
  9. コントローラはメッセージを受信し、上記と同じ方法を再度実行しますが、適切なライト用に変更されています。

さらに、システムがスイッチを使用せず、代わりにテキスト「Turn On」または「Turn Off」を表示するUIButtonを使用していた場合はどうなりますか。スイッチはそれ自体のテキストを更新してから「rightSwitchChanged」を呼び出すのですか、それともrightSwitchChangedをすぐに呼び出してビューコントローラーがテキストを変更するのを待つのでしょうか?

4
TigerCoding

はい、パターンに適合します。だが...

私はiOSの通知のファンではありません。実際、多くの場合、それらは美化された後藤として使用されます。

[model setLightOn]を呼び出すと、ライトがオンになっているという通知をモデルが返す必要があるのはなぜですか?ついた!

もう1つの限定的なコメント:setLightOnは不適切な名前です。 setLightOn:NO-ライトをオフにしますか、それともメッセージを無視しますか?

4
steve_sch

要件を満たしていますか?

MVCは、そのようなすべてのソフトウェアパターンと同様に、進化します。 「正しい」または「適切な」方法はありません。

たとえば、JavaScriptライブラリをASP.NET MVCに追加して、Model-View-ViewModelを作成することができます。この場合、クライアントアクションのほとんどは実際にブラウザーで行われます。これは「より純粋な」アプローチであり、この方法で行うことには特定の利点があると主張する人もいます。

建築の宇宙飛行士になったり、誰かの「正しい道」の考えに縛られたりしないでください。うまくいきます。

1
Robert Harvey