2

在学习 Java 时编写了一些较小的程序后,我设计程序的方式是使用 Model-View-Control。通过使用 MVC,我在模型中有大量的 getter 方法供视图使用。感觉虽然我在使用 MVC 方面有所收获,但对于增加的每一个新价值,我都必须在模型中添加两​​个新方法,这些方法很快就会被 getter 和 setter 弄得一团糟。

所以我在想,也许我应该使用带有参数的 notifyObserver 方法。但是单独发送每个值也不是很聪明,所以我想,也许如果我发送一种包含所有值的容器,最好只发送那些实际改变的值。这将完成的是,我可以在模型中只使用一种方法,将所有相关值放入容器中,而不是使用大量的 getter 方法。然后在视图中,我将有一个从更新中调用的方法,该方法从容器中提取值并将它们分配给正确的字段。

我对此有两个问题。

第一:这实际上是一种可行的方法吗?你会建议我按照这些思路做点什么吗?

其次:如果我确实使用了这个计划并且我不想继续发送实际上没有改变的字段。如果不必使用 if 语句来检查每个单个值的值是否不为空,我将如何处理它?

4

3 回答 3

1

我更熟悉 MVP 范式,但希望它们足够相似,可以发表评论。虽然 getter(和 setter)本身并不一定是邪恶的,但它们有时表明您的子系统耦合过强。一种非常好的解耦方法是使用事件总线:请参阅架构 GWT 应用程序的最佳实践。这允许视图在发生重要事件时触发事件供控制器监听,并且视图可以在模型中发生与更新视图相对应的某些更改时监听事件。理想情况下,您甚至不需要将模型传递给视图,如果您可以将任何更改分解为增量部分并告诉视图更改这部分然后再更改另一部分。

于 2010-03-20T20:42:12.670 回答
1

如果你觉得你的模型类中有太多的 getter(和 setter),可能你的字段太多了。您的模型中是否可能隐藏了几个不同的类?如果您将它们提取到单独的类中,它可能会使您的模型更易于管理。

OTOH 您正在考虑的相关容器也可能是可行的 - 但为什么要复制所有数据?您可以直接在模型中使用关联的容器来存储您能想到的所有属性。您还可以将其传递给观察者以获取更新(当然,最好将其包装到不可修改的容器中)-尽管在此设置中您不需要这样做。

一般来说,Java 是一种冗长的语言,它希望您将所有这些 getter 和 setter(以及更多)放在适当的位置。但是,任何体面的 IDE 都可以通过几次按键为您生成这些。另请注意,您只需要编写一次它们,并且您将多次读取和调用它们。详细也意味着易于阅读。

于 2010-03-20T20:51:53.393 回答
0

如果你有太多的吸气剂,那没关系。但你不应该需要二传手。该视图应该只读取/查询模型。

MVC 模式应该促进一些不对称的东西:控制通过调用模型中嵌入逻辑的方法来更新模型并相应地更新状态;这方面的封装。视图通过 getter 读取/查询模型。这有点不利于信息隐藏,但这就是 MVC 的工作方式。

我不会亲自传递事件中的所有信息。这对我来说听起来很复杂:要么你最终得到一些不是静态类型的东西(例如你传递哈希图),要么你得到了过多的类型事件。我会坚持一些简单的东西,并在模型中有(可能有很多)吸气剂。

于 2010-03-20T20:30:33.133 回答