首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OOP设计--在哪里/何时验证属性?

OOP设计--在哪里/何时验证属性?
EN

Stack Overflow用户
提问于 2010-04-09 18:47:10
回答 7查看 5.5K关注 0票数 18

我读过几本关于OOP、DDD/PoEAA/“四人帮”的书,似乎没有一本书涉及验证的主题--似乎总是假定数据是有效的。

我从这个帖子(OOP设计问题-验证属性)的答案中得知,客户端应该只尝试在域对象上设置一个有效的属性值。

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

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

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

我似乎遗漏了一些关于OOP数据验证的关键基本知识--你能告诉我一本详细介绍这个主题的书吗?涵盖不同类型的验证/不变量/处理反馈/是否使用异常等

EN

回答 7

Stack Overflow用户

发布于 2010-04-09 18:55:39

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

代码语言:javascript
复制
setName()

因此,它发生在允许输入值/设置值的地方,结果是setter方法.

票数 10
EN

Stack Overflow用户

发布于 2010-04-09 19:22:51

区分域对象的不变量意义上的有效(必须始终满足)和一些人所称的"上下文验证。“是一个银行账户为负的客户“是”无效“很重要,但它们可能没有被授权执行某些类型的事务。这是上下文验证,而不是”每个客户实体都必须有一个非空ID“,这是一种完全不同的验证类型。

执行不变量的一种有效技术是区分表示用户输入的类和域对象,并且不要在域对象上公开无限制的变量(例如,简单的集访问器)。

例如,如果您有一个Student域对象,请不要在用户界面中直接操作它。视图创建的不是创建Student实例,而是创建构建有效Student域对象所需的模型的StudentBuilder实例。

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

票数 4
EN

Stack Overflow用户

发布于 2010-04-09 18:57:17

每个对象都应该确保其内部状态是一致的,所以最好在修改内部状态之前-在对象的setter方法中进行验证。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2610013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档