0

私のコンストラクターが純粋な引数からプロパティへのセッターである場合、クラスが適切に機能するために必要な他のコードをどこに置くべきかわかりません。

たとえば、JavaScript では、オブジェクトのイベントWindowMessageControllerを処理するプログラムをプログラミングしています。messagewindow

これを機能させるには、ハンドラーをどこかにアタッチする必要があります。

var controller = this;
this.applicableWindow.addEventListener("message", function(event) {
    controller.messageAction(event.data);
} 

このようなものはどこに正しく属していますか?

  1. コンストラクターで
  2. .initialize() メソッドで - 一時的な結合を導入します
  3. WindowMessageControllerFactory.create(applicableWindow) で-非常に中心的なコードのかなり離れた場所です。これは、そのような小さなクラスでも 2 つに分割されることを意味します。
  4. コンポジションルート自体で-これを常に行うと、そのサイズが倍増します
  5. このコードを使用して、コンストラクターというメソッドを 1 つだけ持つ他のクラス WindowMessageRouter で

編集

通常、このようなコントローラーのインスタンスはアプリ内に 1 つしかないため、このケースは特殊なようです。しかし、より一般化されたケースでは、何らかの DOM要素Buttonをラップするクラスのインスタンスを作成していた場合の答えは何でしょうか? <button />突然

button = buttonFactory.create(domButtonEl);

はるかに便利なようです。

4

3 に答える 3

2
  1. コンストラクターに実際の作業を入れないでください。コンストラクターはほとんどモックできません。メソッドとも呼ばれるシームはモック可能であることを忘れないでください。継承とモッキングのため、コンストラクターはモッキングできません。

  2. 初期化は、一般的に禁止されている言葉です。

  3. たぶん、しかし、多くのクラスが怖い場合は、ファクトリをクラスの静的メソッドとして実装することもできます ,)

  4. コンポジションルートは単なる工場です。あなたのアプリにはおそらく1つのエントリポイントしかないため、1つだけであることを除いて、)

  5. 一般的に、Javascript を使用しています。ファクトリ メソッドが 1 つだけ必要な場合、なぜクラスが必要なのですか? 関数はファースト クラス オブジェクトであることを忘れないでください。

そして編集用。独自のライフサイクルを制御しない限り、シングルトンには特別なことはありません。

黄金律: 常に (ほぼ) アプリの配線とアプリのロジックを分離します。工場は配線しています。配線するだけで、ロジックがないため、テストする必要はありません。

于 2012-03-22T20:45:20.890 に答える
1

このコードをinitialize(window)メソッドに配置しますが、このメソッドをWindowMessageControllerのパブリック API の一部にすることはできません。直接のユーザー(つまり、コンポジション ルートとテスト) によってのみ表示され、呼び出される必要があります。したがって、DI コンテナーがWindowMessageControllerインスタンスを返す場合、 initializeメソッドが呼び出されたのはコンテナーの責任です。

編集への返信: はい、この工場は私にとって最良の方法のようです. ところで。ファクトリにはおそらくdisposeメソッドが必要であることを忘れないでください(つまり、ボタンの場合にイベントハンドラーをアンバインドします)...

于 2012-03-20T12:23:26.890 に答える
0

イベント配信を担当するRouterクラスを作成する必要があると思います。このルーターは、すべてのイベントをサブスクライブし、それらをコントローラー間で配布する必要があります。コンストラクターに挿入された、ある種のメッセージコントローラーマップを使用できます。

于 2012-03-22T16:32:24.727 に答える