MVC设计问题

如何解决MVC设计问题

| 请注意,我是MVC的新手。 我正在尝试使我的代码尽可能地分离和可测试。 我有一个带有文本框和按钮的视图。 我要在输入新文本并遵守某些条件时启用该按钮。 理想情况下,我希望使用这种逻辑来确定按钮是否在视图之外启用,以便可以对其进行单元测试。 我对MVC的理解是这样的: 在我看来,我有一个关于我的控制器的参考。 在我的控制器中,我引用了我的模型。 在我的模型中,我引用了我的视图。 你能告诉我以下是否是一个好的设计。 我在模型buttonEnabled中添加一个布尔值。 事件的顺序是这样的: 在文本框中输入文本,该文本框具有一个侦听器。侦听器在Controller上调用textChanged方法,控制器对是否启用按钮进行检查,然后通过setButtonEnabled访问器设置Model的buttonEnabled。 访问器更改buttonEnabled的值,并在视图上调用buttonEnabledChanged()(公开该方法) 这个想法是视图是模型的特定观察者,模型是可观察的,理论上可以有多个视图,并且可以在所有视图上调用buttonEnabledChanged()。 请让我知道你在想什么。     

解决方法

这是对一个哲学问题的哲学回答:) 您的建议可能是正确的。但是真正的问题是,
buttonEnabled
是否真的适合您的模型。这纯粹是gui的事情,在那里没有任何意义。真正特定于接口的东西属于视图,而没有其他地方。 现在可能有一个禁用按钮的原因(例如,输入无效)。然后,您可以在模型中给它起另一个名字(
isValid
)。从
!isValid
!buttonEnabled
的转换将成为控制器甚至视图本身的一部分。 但是我猜测,在您的情况下,在没有内容的情况下阻止按钮的唯一原因是使用户不太可能发送空白表单。在这种情况下,为了用户方便起见,我将完全执行签入视图(如果是Web则使用javascript)。在模型中,如果空字符串仍然到达该位置,则抛出一个异常(可能会出现
IllegalArgumentException
)。 如果您要对模型进行单元测试,则测试它是否会抱怨一个空字符串会更有意义,然后检查模型是否将
buttonEnabled
设置为false。如果您真的要测试gui功能,则可以使用针对该功能的解决方案(对于Web,硒是最重要的)。     ,从MVC的角度来看,您的建议过于复杂,我认为这是错误的。 控制器不应检查是否启用按钮,这是模型的任务。 该模型不应在视图上调用任何方法。 您的方法太具体了。这种只更新特定内容的愿望,例如buttonEnabledChanged()会使将来的事情变得过于复杂,因为组件之间通过某种业务逻辑相互依赖。 您需要的是将此文本框的值绑定到模型值,也许是通过控制器。因此,更改文本框的值将更改模型的值。然后,它应该在视图上调用更新。该视图知道,在模型中有一些属性可以确定是否应启用按钮。不应将其称为isButtonEnabled(),因为它与视图无关。应该将其称为isTextMatchingCriteria或其他名称。基于该属性的值,视图决定是否启用按钮。 这条路: 控制器只能控制。它是捕获和委托,更新,但对业务逻辑没有任何决定。 该模型与视图无关。 View没有可以单独调用的任何特定方法。唯一可以做的就是根据模型的当前状态呈现正确的表示。它还指定屏幕上模型的一种或另一种状态是什么-禁用的按钮或错误消息。该模型不应该这样做。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?