在学习Java时编写了一些较小的程序,我设计程序的方式是使用Model-View-Control。使用MVC我在模型中有大量的getter方法供视图使用。 感觉当我使用MVC时,每增加一个新增值,我必须在模型中添加两个新方法,这些方法很快就会被getter& setter方法。
所以我在想,也许我应该使用带参数的notifyObserver方法。但是自己发送每个值都不会觉得很聪明,所以我想,也许我发送一种带有所有值的容器,最好只发送实际改变的那些值。 这将实现的是,不是拥有大量的getter方法,我可以在模型中使用一个方法将所有相关值放在容器中。 然后在视图中我将有一个从更新调用的方法,它从容器中提取值并将它们分配给正确的字段。
我有两个问题。
首先:这实际上是一种可行的方法。你会建议我按照这些方针做点什么吗?
其次:如果我使用这个计划,我不想继续发送实际没有改变的字段。如果不必使用if语句检查每个值的值是否为null,我将如何处理?
答案 0 :(得分:1)
我对MVP范例更为熟悉,但希望它们足够类似于评论。虽然getter(和setter)本身并不一定是邪恶的,但它们有时表明你的子系统耦合太强。解耦这个问题的一个非常好的方法是使用事件总线:请参阅Best practices for architecting GWT apps。这样,视图就可以拍摄事件,以便控制器在发生重要事件时进行监听,并且视图可以在模型中发生与更新视图相对应的某些更改时监听事件。理想情况下,您甚至不需要将模型传递给视图,如果您可以将任何更改分解为增量部分,只需告诉视图更改此部分,然后再更改此部分。
答案 1 :(得分:1)
如果你觉得你的模型类中有太多的getter(和setter),那么你可能会有太多的字段。是否有可能在模型中隐藏了几个不同的类?如果将这些提取到单独的类中,可能会使您的模型更易于管理。
OTOH您正在考虑的相关容器也可行 - 但为什么要复制所有数据?您可以直接在模型中使用关联容器来存储您可以想到的所有属性。你也可以通过它来观察者获取更新(当然最好包装在一个不可修改的容器中) - 尽管在这个设置中你不需要。
通常,Java是一种冗长的语言,希望您将所有这些getter和setter(以及更多)放在适当位置。但是,任何体面的IDE都可以通过一些按键为您生成这些。另请注意,您只需要编写一次,然后您将阅读并多次调用它们。详细也意味着易读。
答案 2 :(得分:0)
如果你有太多的吸气剂,那没关系。但你不应该需要二传手。该视图应该仅读取/查询模型。
MVC模式应该促进不对称的东西:控件通过调用嵌入逻辑的模型中的方法来更新模型并相应地更新状态;这尊重encapsulation。视图通过getter读取/查询模型。这有点反对information hiding,但这就是MVC的工作方式。
我不会亲自传递活动中的所有信息。这对我来说听起来很复杂:要么你最终得到的东西不是静态类型(例如你传递散列图),要么是过多的类型化事件。我会坚持一些简单的东西,并且在模型中有(可能很多)吸气剂。