5

ビューにファイル選択ウィジェットがあり、コントローラーがファイル選択のイベントを処理する必要があることを考えると、コントローラーメソッドを作成する必要があります。

public void fileSelected(String filePath){
  //process filePath
}

また

public void fileSelected(){
  String filePath = view.getSelectedFilePath();
  //process filePath
}

最初のアプローチでは、CとVの間の結合が少なくなるようです。Cは、特定のイベントを処理するときに、Cが正確に何を必要とするかを知りません。

getSelectedFileただし、V側と同様の詳細なメソッドを多数作成する必要があります。

一方、2番目のアプローチでは、例よりも複雑なケースでコントローラーメソッドが乱雑になる可能性があります(渡すデータが単なるfilePath)よりもはるかに多くなります。

あなた自身の経験から、あなたはどちらのアプローチを好みますか?

4

4 に答える 4

8

最初のアプローチは私のお気に入りです。唯一の違いは、メソッドに引数を渡すためにオブジェクト(マリオが提案したような)を使用したいということです。このように、引数の一部を追加または削除しても、メソッドのシグネチャは変更されません。結合が少ないことは常に良いことです:)

もう1つ:2番目の解決策を試したい場合は、ViewFactoryを使用してコントローラーからビューロジックを削除することをお勧めします。

于 2012-11-04T17:49:10.493 に答える
6

最初のアプローチは進むべき道です。

public void fileSelected(String filePath){
  //process filePath
}

は、どのように見えるか、またはどのように実装されているControllerかを気にする必要はありません。Viewビューを作成/更新するときに、開発者にとっても、コントローラーのアクションが何を望んでいるかを知ることがはるかに明確になります。また、メソッドのオーバーロードが容易になります。

しかし、私は実際にどのように機能するのかわかりませんString filePath = view.getSelectedFilePath();。ビューコード/マークアップの解析について話しているのですか?

一方、2番目のアプローチでは、例よりも複雑なケースでコントローラーメソッドが乱雑になる可能性があります(filePathだけよりもはるかに多くのデータを渡す)。

MyViewModelその場合、送信する必要のあるすべてのプロパティ(10個のプロパティの場合もあります)を格納するビューモデルクラス(たとえば、名前を付けます)を作成し、それをアクションに渡しますfileSelected(MyViewModel model)。これが使用目的であり、ModelBinderasp.netmvcの*が役立ちます。

于 2012-10-27T07:58:01.593 に答える
2

これを一歩下から見る必要があると思います。

それがどのように入るのかについて心配する必要はなく、検証エラーの発生にもっと関心があります。

明日、要件が変更され、別のアーキテクチャアプローチを介して情報を入手することが要求される可能性があります。[入力/入力オブジェクト]の設定をベースコントローラークラス、または異なるコントローラードメインのいくつかのクラスの1つにリファクタリングできます。

コントローラ内(スクラビング)またはコントローラ外(単体テスト)のいずれであっても、適切な検証に焦点を当てる場合は、ダックタイピングを介してより完全なデカップリングを実行します。

于 2012-11-05T04:05:39.963 に答える
0

私は最初のアプローチで行きます。それは再利用可能であり、懸念を分離します。将来filePathを取得する方法が変更されたとしても、メソッドの機能に影響を与えることはありません。

于 2012-11-05T07:22:31.097 に答える