OOP 设计 - 在何处/何时验证属性?

2022-08-30 22:14:50

我读过几本关于OOP DDD/PoEAA/Gang of Four的书,但似乎都没有涵盖验证的主题 - 似乎总是假设数据是有效的。

我从这篇文章的答案(OOP设计问题 - 验证属性)中收集到客户端应该只尝试在域对象上设置有效的属性值。

这个人问了一个类似的问题,但仍然没有答案:http://bytes.com/topic/php/answers/789086-php-oop-setters-getters-data-validation#post3136182

那么,如何确保它是有效的呢?您是否在每个获取器和 setter 旁边都有一个“验证器方法”?

  • isValidName()
  • setName()
  • getName()

我似乎缺少一些关于OOP数据验证的关键基础知识 - 你能给我指出一本详细介绍这个主题的书吗?- 即。涵盖不同类型的验证/不变量/处理反馈/使用异常或不使用异常等


答案 1

根据我的经验,验证发生在有人工/用户输入的地方。这通常发生在你允许通过你的方法改变某些东西的地方。在您的示例中,我将对该方法进行验证:

setName()

因此,当您允许输入值/设置值时,就会发生这种情况,结果证明这是设置器方法。


答案 2

区分域对象的不变量(必须始终满足)意义上的有效和某些人所说的“上下文验证”非常重要。例如,具有负银行账户的客户是否“无效”?否,但他们可能未被授权执行某些类型的交易。这是上下文验证,与“每个客户实体必须具有非空 ID”相反,后者完全是不同类型的验证。

强制实施不变量的一种有效技术是将表示用户输入的类与域对象区分开来,并且不会在域对象上公开不受限制的赋值函数(例如,简单的集合访问器)。

例如,如果您有一个域对象,请不要直接在用户界面中操作它。您的视图不是创建实例,而是创建实例,这些实例对构造有效域对象所需的内容进行建模。StudentStudentStudentBuilderStudent

接下来,您将拥有验证构建器实例是否符合域对象的不变量的类,以及一个接受接受构建器并将其转换为有效域对象的工厂。(您还可以在此步骤中根据需要引入上下文验证策略。


推荐