假设您有一个可以完成某种工作的子系统。它可能是任何东西。显然,在这个子系统的入口点上,输入会有一定的限制。假设这个子系统主要由GUI来调用。子系统需要检查它收到的所有输入以确保它是有效的。如果输入无效,我们不想FireTheMissles()。 UI也对验证感兴趣,因为它需要报告出错的地方。也许用户忘了指定一个目标或者在启动板本身瞄准导弹。当然,你可以返回一个空值或者抛出一个异常,但是这并不能告诉用户什么地方出错了(当然,除非你为每个错误编写一个单独的异常类,如果if这是最佳做法)。在输入验证中避免重复的代码
当然,即使有例外,你也有问题。用户可能想知道输入是否有效,然后单击“Fire Missles!”按钮。你可以编写一个单独的验证函数(当然IsValid()并没有真正的帮助很多,因为它不会告诉你什么出了问题),但是你会从按钮点击处理函数中调用它,然后再从FireTheMissles中调用它( )函数(我真的不知道这是如何从一个模糊的子系统变成一个引火计划)。当然,这并不是世界的尽头,但似乎很愚蠢的是连续调用两次相同的验证函数而没有任何改变,特别是如果这个验证函数需要计算1GB文件的散列值。
如果函数的前提条件是清晰的,GUI可以进行自己的输入验证,但是我们只是复制了输入验证逻辑,而其中的更改可能不会反映在另一个中。当然,我们可以在GUI上添加一张支票以确保导弹目标不在盟国内,但如果我们忘记将它复制到FireTheMissles()例程中,那么当我们切换到时会意外炸毁我们的盟友一个控制台界面。
因此,简而言之,你如何实现以下目标:
- 输入验证,告诉你不只是出事了,但具体是什么地方出了错。
- 能够在不调用依赖它的函数的情况下运行此输入验证。
- 没有双重验证。
- 没有重复的代码。
另外,我只是想到了这一点,但错误消息不应该写在FireTheMissles()方法中。 GUI负责选择适当的错误消息,而不是GUI调用的代码。
MVC比输入验证要多得多。当它到达输入验证本身时,你所建议的与Binary Worrier提出的有什么不同?如果是这样,怎么样?如果没有,那么为了实现这种错误处理方法,是否真的有必要做MVC? (并不是说最终的应用程序肯定不会是MVC,但我甚至没有考虑过GUI,除非知道它将需要从我的导弹发射子系统中得到什么。) – 2009-05-19 13:07:43
+1简而言之:模型定义它的任何部分是有效的,任何人都必须确保他们听从这些限制。 – 2009-05-19 14:20:22