Model view controller Java设计:太多的getter

Model view controller Java设计:太多的getter,model-view-controller,getter,Model View Controller,Getter,在学习Java时编写了几个较小的程序之后,我用模型视图控件设计了这些程序。通过使用MVC,我在模型中有过多的getter方法供视图使用。 感觉上,当我开始使用MVC时,对于每一个新增加的价值,我必须在模型中添加两个新方法,它们很快就会被getter和setter弄得乱七八糟 所以我在想,也许我应该使用notifyObserver方法来接受一个论点。但是单独发送每个值也不是很明智,所以我想,如果我发送一种包含所有值的容器,最好只发送那些实际更改的值。 这将实现的是,我可以在模型中使用一个方法,将所

在学习Java时编写了几个较小的程序之后,我用模型视图控件设计了这些程序。通过使用MVC,我在模型中有过多的getter方法供视图使用。 感觉上,当我开始使用MVC时,对于每一个新增加的价值,我必须在模型中添加两个新方法,它们很快就会被getter和setter弄得乱七八糟

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

关于这一点,我有两个问题

第一:这实际上是一种可行的方法吗。你能推荐我按照这些思路做点什么吗


第二:如果我使用这个计划,我不想继续发送实际上没有改变的字段。如果不使用if语句来检查每个值的值是否为null,我将如何处理该问题?

如果getter太多,则可以。但是你不应该需要二传手。视图应该只读取/查询模型

MVC模式应该促进一些不对称的东西:控件通过调用模型中嵌入逻辑的方法来更新模型,并相应地更新状态;这方面的问题。视图通过getter读取/查询模型。这有点违背了MVC的工作原理


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

我更熟悉MVP范式,但希望它们足够相似,可以发表评论。虽然getter(和setter)本身并不一定是邪恶的,但它们有时是子系统耦合太强的标志。一个非常好的解耦方法是使用事件总线:请参阅。这允许视图在发生重要事件时只发送事件供控制器侦听,并且视图可以在与更新视图相对应的模型中发生更改时侦听事件。理想情况下,您甚至不需要将模型传递给视图,前提是您可以将任何更改分解为增量部分,然后告诉视图先更改此部分,然后再更改此其他部分。

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

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


一般来说,Java是一种冗长的语言,它希望您将所有这些getter和setter(以及更多)放在适当的位置。然而,任何像样的IDE都可以通过几次按键为您生成这些。还要注意的是,你只需要写一次,而且你会阅读和调用它们很多次。冗长也意味着易于阅读。

很抱歉,我对setter有点不清楚。我有从控件调用的setter,我认为这是唯一的方法。但我不太喜欢这样,我必须一直调用那么多getter。视图需要显示模型。在本例中,您本质上需要getter来访问要显示的信息。对我来说,这证明了这些必要的获取者的存在。我觉得试图移除getter会导致比getter的存在更复杂的事情。你要的是推荐信,这是我的。但让我们看看其他人怎么说。一个关于Getter的务实讨论:“Getter Eradictor”最后一句话:你当然可以在每个事件中传递一点点信息。但正如我所写的,从概念上讲,最终的结果是DTO,这意味着许多类或非类型化结构。如果演示文稿和模型之间有网络边界,这有时是必要的,并且可以正常工作。但这比有能手要复杂得多。第一个问题是:如果不了解你的项目,很难回答。对于第二种情况:与其使用模型的整个新状态调用单个方法,不如使用多个方法侦听对特定部分的更改。如果某个部分没有被更改,它的侦听器方法就永远不会被调用。当你说listener时,你指的是用Java实现的侦听器类型吗?您还可以从JavaBean
PropertyChangeListener
:)中获得一些灵感。但是您必须知道,它不是100%类型安全的:您将属性的名称作为字符串传递。即使模型在几个类之间分割,我也有一个巨大的视图。我可能有几个视图,比如一个较小的视图扩展了JPanel并将自己添加到mainView/容器中。@dege对此不确定-我觉得从长远来看,它会使视图过于复杂。但是如果你觉得它是可行的,就尝试一下——只有你才能决定它是否适合你。关于你的案子我掌握的这一点信息,我当然不能。