控制器方法应该采用参数?

Pio*_*zyk 5 model-view-controller design-patterns conventions

鉴于视图上有文件选择小部件,控制器需要处理选择文件的事件,我是否应该编写控制器方法:

public void fileSelected(String filePath){
  //process filePath
}
Run Code Online (Sandbox Code Playgroud)

要么

public void fileSelected(){
  String filePath = view.getSelectedFilePath();
  //process filePath
}
Run Code Online (Sandbox Code Playgroud)

第一种方法似乎在C和V之间引入了较少的耦合:C在处理给定事件时不知道C需要什么样的数据.

但它需要创建许多类似于getSelectedFileV方面的详细方法.

另一方面,第二种方法可能导致在比例子更复杂的情况下混乱的控制器方法(要传递的数据要多得多filePath).

根据您自己的经验,您更喜欢哪种方法?

op1*_*kun 8

第一种方法是我最喜欢的.唯一的区别是我宁愿使用一个对象(如Mario建议的)将参数传递给方法.这样,当您添加或删除某些参数时,方法的签名不会更改.较少耦合总是好:)

还有一件事:如果你想尝试第二个解决方案,我建议使用ViewFactory从控制器中删除视图逻辑.


Mar*_*num 6

第一种方法是要走的路;

public void fileSelected(String filePath){
  //process filePath
}
Run Code Online (Sandbox Code Playgroud)

Controller不该在乎怎么View看起来像,或者它如何实现的.在创建/更新视图时,开发人员也可以更清楚地了解控制器中的操作.它还使方法重载更容易.

虽然,我真的不知道如何String filePath = view.getSelectedFilePath();工作.我们是在谈论解析View代码/标记吗?

另一方面,第二种方法可能导致在比例子更复杂的情况下混乱的控制器方法(要传递的数据远远超过filePath).

这时候,你可以创建一个视图模型类(假设我们命名它MyViewModel)来存储你需要发送(可能它是10个属性),然后通过在诉讼的所有属性:fileSelected(MyViewModel model).这就是它的用途,以及ModelBinderasp.net mvc中的*可以帮助你.