1

特定のモデルに関する情報を知る必要があるドキュメントベースのアプリケーションに、ネストされたオブジェクトのレイヤーがいくつかある状況があります。

具体的には、NSTextView、NSLayoutManager、および NSTypesetter があり、それぞれが正しくレンダリングするためにドキュメント モデルに関する特定のプロパティを知る必要があります。

現在、各クラスをサブクラス化し、モデルへの参照を持つプロパティを与えています。参照はドキュメント コントローラーからサブクラス化された NSLayoutManager に渡され、サブクラス化された NSTypesetter に渡されます。

@implementation MyLayoutManager : NSLayoutManager {
    @private
    MyModel *model;
}
@property (retain) MyModel *model;
-(id)initWithModel:(MyModel *)model;
@end

@implementation MyTypesetter : NSATSTypesetter {
    @private
    MyModel *model;
}
@property (retain) MyModel *model;
-(id)initWithModel:(MyModel *)model;
@end

モデルは Controller->MyLayoutManager->MyTypesetter から渡されます。これは少し冗長なようで、密結合しすぎている可能性があります。

デリゲート パターンの方がよいでしょうか。もしそうなら、それを設定する最良の方法は何ですか? Typesetter にはデリゲートがありませんが、LayoutManager には既にデリゲートがあります。Typesetter にデリゲートを追加してから、LayoutManager でデリゲートをオーバーライドする必要がありますか? それとも、モデルのインターフェースを継承することに固執する方がよいのでしょうか?

任意の洞察をいただければ幸いです。ありがとう。

4

1 に答える 1

1

一般に、モデルとの通信をコントローラーのみに分離することをお勧めします。コントローラーは、関連する他のオブジェクトにタスクを委任します (必要に応じて関連情報を提供します)。

よりOOで正しいですが、常に最も美しいとは限りません. ただし、一般的には維持するのが最も簡単です。

Model ===> Controller ===> View
               ||
               ||
               \/
          Other Objects
于 2010-11-18T18:40:46.810 に答える