2011-04-15 76 views
1

请注意,我是MVC的新手。MVC设计问题

我试图让我的代码尽可能多地分离和测试。 我有一个文本框和按钮的视图。 我想在输入新文字时启用此按钮并遵守特定条件。

理想情况下,我希望这个逻辑决定按钮是否启用或不在视图之外,以便它可以进行单元测试。

我对MVC的理解如下: 在我看来,我有一个参考我的控制器。 在我的控制器中,我有一个对我的模型的参考。 在我的模型中,我有一个对我的视图的引用。

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

请让我知道您的想法。

+1

另请参见此[回复](http://stackoverflow.com/questions/3072979)。 – trashgod 2011-04-15 13:32:19

+0

在你描述的上下文中,我宁愿使用MVP(P,主持人,将包含启用按钮的逻辑)而不是MVC。 – jfpoilpret 2011-04-18 09:22:58

+0

在我看来,上面的答案是击败了分离的目的,尽管这是一个很好的解释。但是这个例子与GUI紧密结合,以至于无法进行单元测试。 – Charbel 2011-04-18 09:32:10

回答

1

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

什么你的建议可能是正确的。但真正的问题是如果buttonEnabled真的是你的模型的一个很好的候选人。这是一件纯粹的鬼事,在那里毫无意义。真正特定于界面的东西属于视图,而没有其他地方。

现在可能有一个原因,该按钮被禁用(如,条目无效)。然后你可以在模型中给它另一个名字(isValid)。从!isValid!buttonEnabled的翻译将成为控制器的一部分,甚至成为视图本身。

但我猜你的情况下,当没有内容时阻止按钮的唯一原因是使用户发送空白表单的可能性较小。在这种情况下,我会完全查看查看(javascript,如果是网页),只是为了方便用户。在模型中,如果空字符串到达​​那里,就抛出一个异常(IllegalArgumentException似乎很可能)。

如果您要对模型进行单元测试,那么测试它是否会投诉空字符串,然后检查您的模型是否将buttonEnabled设置为false会更有意义。如果你真的想测试gui的功能,有解决方案(网络,硒想到)。

1

你的建议是过于复杂的,在我看来,从MVC的角度来看是错误的。

  • 控制器不应该检查是否启用按钮,它是模型的任务。
  • 该模型不应该在视图上调用任何方法。
  • 你有太具体的方法。这种仅仅更新诸如buttonEnabledChanged()之类的特定内容的愿望将会使事情变得过于复杂,组件之间通过某些业务逻辑相互依赖。

您需要的是将此文本框的值绑定到模型值,可能通过控制器。所以,改变文本框的值会改变模型的价值。然后它应该在视图上调用更新。该视图知道,在模型中有一些属性决定是否启用按钮。它不应该被称为isButtonEnabled(),因为它不可视。它应该被称为isTextMatchingCriteria什么的。根据该属性的值,视图决定是否启用该按钮。

这样:

  • 控制器仅controlls。它是捕获和委托,更新,但不决定任何业务逻辑。
  • 该模型是独立于视图。
  • 查看没有任何可以单独调用的特定方法。它唯一可以根据模型的当前状态呈现正确的表示。它还指定了屏幕上模型的一个或另一个状态 - 一个禁用的按钮或错误消息。该模型不应该这样做。
+0

我试图让我的头绕过你上面写的东西,我有几个问题:“控制器不决定业务逻辑”,我认为它确实,我应该在哪里放置业务逻辑?在模型中?我认为模型只包含数据。你还说过“模型不应该调用任何方法”,当模型改变时我们还能如何更新视图?然后你说“它应该在视图上调用更新”,我以为你在谈论模型,所以模型毕竟在视图上调用更新方法,不是吗? – Charbel 2011-04-18 08:27:48

+0

@Charbel从模型到视图的“链接”通常是通过古老的观察者模式(或相同的Swing监听器)或通过数据绑定完成的。该模型为观察者(视图)提供了注册他们自己的必要方法。因此模型不需要“知道”视图。 – jfpoilpret 2011-04-18 11:03:33