4

一般的な MVC 設計に従ってエディターを開発しています。モデルはデータを保持し、コントローラーはデータの変更方法を認識し、ビューの問題はコントローラーを呼び出してモデルのクエリと変更を行います。議論のために、使用しましょう

public class Model {
    public Object getStuff(String id);
    public void setStuff(String id, Object value);    
}    

public interface Controller {
    public void execute(Command command);
    public void redo();
    public void undo();     
    public void save();
    public void load(File f);
}

コントローラーを実際に実装するクラスは、モデルへの参照を保持します。コマンドもそれにアクセスする必要があるため、void execute(Model m);必要な場合にのみこのアクセスを実際に許可するインターフェイスをすべて提供する必要があります。

ただし、ビューは通常、モデルにアクセスする必要があります。ビュー自体を構築するとき、および後で変更をリッスンし、それに応じてビュー自体を更新する場合です。コントローラーに「Model getModel()」呼び出しを追加すると、execute()メカニズムをバイパスする大きな誘惑が生じるのではないかと心配しています。このプロジェクトに取り組んでいる開発者は私だけではありません。このシナリオを考えると、「すべての変更がコントローラーを通過する」ポリシーをどのように適用しますか?

私が検討している2つの選択肢:

  • そのような試みをキャッチする、実際のモデルの代わりに getModel() 呼び出しによって返される「ReadOnlyModel」と呼ばれるインターフェース。
  • 物事を行う正しい方法について、次期開発者の手がかりとなる多くのコメント
4

2 に答える 2

1

モデルへのアクセスを一連のクラスとしてモデル化することをお勧めします。たとえば、ビューで顧客の属性を変更する必要がある場合、更新を実行するために必要なすべての情報をプロパティとして持つ ModifyCustomerCommand クラスがあります。ビューは、値を使用してクラスのインスタンスを構築し、それをコントローラーに戻します。コントローラーは、実際の更新のためにコマンドをモデルに戻します。

このアプローチの利点は、これらのモデル アクセス コマンドのそれぞれが元に戻す動作を実装できることです。これらのコマンドがモデルに送り返されるときに、コントローラーがこれらのコマンドの順序付けられたコレクションを保持している場合、コントローラーは、最後に実行されたコマンドで undo メソッドを呼び出すことにより、一度に 1 つずつ変更を元に戻すことができます。

于 2012-07-19T12:41:31.133 に答える
0

Observer Pattern http://en.wikipedia.org/wiki/Observer_patternを見ると、ビューはモデルからのイベントのみをリッスンします。それが役に立てば幸い。

于 2012-07-19T18:36:24.003 に答える