我读过几本关于OOP、DDD/PoEAA/“四人帮”的书,似乎没有一本书涉及验证的主题--似乎总是假定数据是有效的。
我从这个帖子(OOP设计问题-验证属性)的答案中得知,客户端应该只尝试在域对象上设置一个有效的属性值。
这个人问了一个类似的问题,这个问题还没有答案:http://bytes.com/topic/php/answers/789086-php-oop-setters-getters-data-validation#post3136182
那么你如何确保它是有效的呢?您是否在每个getter和setter旁边都有“验证器方法”?
我似乎遗漏了一些关于OOP数据验证的关键基本知识--你能告诉我一本详细介绍这个主题的书吗?涵盖不同类型的验证/不变量/处理反馈/是否使用异常等
发布于 2010-04-09 18:55:39
根据我的经验,验证发生在有人工/用户输入的地方。这种情况通常发生在你允许通过你的方法来改变一些事情的地方。在您的示例中,我将对该方法进行验证:
setName()因此,它发生在允许输入值/设置值的地方,结果是setter方法.。
发布于 2010-04-09 19:22:51
区分域对象的不变量意义上的有效(必须始终满足)和一些人所称的"上下文验证。“是一个银行账户为负的客户“是”无效“很重要,但它们可能没有被授权执行某些类型的事务。这是上下文验证,而不是”每个客户实体都必须有一个非空ID“,这是一种完全不同的验证类型。
执行不变量的一种有效技术是区分表示用户输入的类和域对象,并且不要在域对象上公开无限制的变量(例如,简单的集访问器)。
例如,如果您有一个Student域对象,请不要在用户界面中直接操作它。视图创建的不是创建Student实例,而是创建构建有效Student域对象所需的模型的StudentBuilder实例。
接下来,您拥有验证构建器实例符合域对象不变量的类,以及接受构建器并将其转换为有效域对象的工厂。(您还可以在这个步骤中酌情引入上下文验证策略。)
发布于 2010-04-09 18:57:17
每个对象都应该确保其内部状态是一致的,所以最好在修改内部状态之前-在对象的setter方法中进行验证。
https://stackoverflow.com/questions/2610013
复制相似问题