Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 需要类建模方面的帮助吗_Design Patterns_Class - Fatal编程技术网

Design patterns 需要类建模方面的帮助吗

Design patterns 需要类建模方面的帮助吗,design-patterns,class,Design Patterns,Class,我一直在研究一些面向对象的概念,比如设计模式、干净的代码和其他一些东西,但我仍然对如何继续存在一些疑问。例如,让我们看一看我的示例 我有一个Person类,它是一个模型。我想给一个人添加一些验证,比如检查年龄是否与出生日期一致,姓名是否包含有效字符 我有两种方法,但我不知道该用哪一种 方法一: 我创建了一个名为: class ValidatePerson {} 这个类有方法:“validateAge()”和“validateName()”,我需要的每一个vallidation都必须实现一个新方

我一直在研究一些面向对象的概念,比如设计模式、干净的代码和其他一些东西,但我仍然对如何继续存在一些疑问。例如,让我们看一看我的示例

我有一个Person类,它是一个模型。我想给一个人添加一些验证,比如检查年龄是否与出生日期一致,姓名是否包含有效字符

我有两种方法,但我不知道该用哪一种

方法一: 我创建了一个名为:

class ValidatePerson {}
这个类有方法:“validateAge()”和“validateName()”,我需要的每一个vallidation都必须实现一个新方法

方法二: 我创建了一个抽象类,名为: ValidatePerson{}将有一些commum方法用于所有验证,i将有:

class ValidatePersonAge extends ValidatePerson { validate();} 
class ValidatePersonName extends ValidatePerson {validate();} 
我想选择方法二,因为我必须添加的每个新验证规则都将是一个新类,并且不会影响其他类。比如,如果我需要修改commum方法中新规则需要的内容,我可以直接覆盖它。在第一种方法中,我必须添加另一个方法,然后创建另一个方法,或者修改已经为其他方法工作的方法,这可能会导致崩溃


问题是,我对这一切有点困惑,因为我是编程新手,我想看到一些帮助和解释。我还读到,类应该关闭以进行更改,而应该打开以进行扩展(或类似的事情)。

没有具体的正确答案。设计应该始终在您的问题域和业务上下文中进行。这里有各种选择

选项1 Person类有一个vailidate()方法,您可以调用该方法对其当前状态执行所有he验证

专业人士

  • 更好的封装
  • 更改被本地化为一个类
  • 在设置所有属性后执行验证
缺点

  • 在调用validate()方法之前,Person可能处于无效状态,因此不会出现fail fast
  • 不能为不同的上下文使用不同的验证规则
选项2 每个属性在Person类中都有自己的validatexx()方法。每个setXXX()方法都将调用相应的validateXXX()方法

专业人士

  • 更好的封装
  • 更改被本地化为一个类
  • 快速失效行为,即Person对象永远不会处于无效状态
缺点

  • 基于上下文,这可能有点过头了
  • 不能为不同的上下文使用不同的验证规则
选项3 您可以拥有包含这些验证检查的PersonBuilder。构建器将在构建Person对象之前执行这些验证。这样,一旦构建Person对象,它就会满足所有验证和不变量

专业人士

  • 您已经将验证外部化到构建器类,因此可以针对不同的上下文使用不同的验证规则
  • 构造逻辑与域对象分离
  • Person类可以在构造后保持不变
缺点

  • 在某些情况下,这可能是一种过度杀伤力


您的选项2不正确,因为ValidatePersonAge与ValidatePerson不同。你不是在完全肯定这个人,而是在肯定他的年龄。所以它们在语义上是不同的

不清楚你在问什么。你到底在找什么帮助?