请注意,我是MVC的新手。

我正在尝试使我的代码尽可能地分离和可测试。
我有一个带有文本框和按钮的视图。
我要在输入新文本并遵守某些条件时启用该按钮。

理想情况下,我希望使用这种逻辑来确定按钮是否在视图之外启用,以便可以对其进行单元测试。

我对MVC的理解是这样的:
在我看来,我有一个关于我的控制器的参考。
在我的控制器中,我引用了我的模型。
在我的模型中,我引用了我的视图。

你能告诉我以下是否是一个好的设计。
我在模型buttonEnabled中添加了一个布尔值。
事件的顺序是这样的:
在文本框中输入文本,该文本框具有一个侦听器。侦听器在Controller上调用textChanged方法,控制器对是否启用按钮进行检查,然后通过setButtonEnabled访问器设置Model的buttonEnabled。
访问器更改buttonEnabled的值,并在视图上调用buttonEnabledChanged()(公开该方法)
想法是视图是模型的特定观察者,并且模型是可观察的,理论上可以具有多个视图,并且可以在所有视图上调用buttonEnabledChanged()。

请让我知道你的想法。

最佳答案

这是对一个哲学问题的哲学回答:)

您的建议可能是正确的。但是真正的问题是buttonEnabled是否真的适合您的模型。这纯粹是gui的事情,在那里没有任何意义。真正特定于接口的东西属于视图,而没有其他地方。

现在可能有一个禁用按钮的原因(例如,输入无效)。然后,您可以在模型中给它起另一个名字(isValid)。从!isValid!buttonEnabled的转换将成为控制器甚至视图本身的一部分。

但是我猜测,在您的情况下,在没有内容时阻止按钮的唯一原因是使用户不太可能发送空白表单。在这种情况下,为了方便用户,我将完全执行签入视图(如果是Web则使用javascript)。在模型中,如果空字符串仍然到达该位置,则抛出异常(可能出现IllegalArgumentException)。

如果要对模型进行单元测试,则测试它是否会抱怨空字符串,然后检查模型是否将buttonEnabled设置为false更为有意义。如果您真的要测试gui功能,则可以使用针对该功能的解决方案(对于Web,硒是最重要的)。

10-01 03:29