2010-11-25 173 views
0

我一直在研究一些面向对象的概念,如设计模式,干净的代码和一些其他的东西,我仍然有一些关于如何进行的怀疑。例如,让我们看看我的例子。需要类建模帮助

我有一个Person类是一个模型。我想为某人添加一些验证,例如检查年龄是否与出生日期相符,并检查名称是否包含有效字符。

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

方法之一: 我创建一个名为新类:

class ValidatePerson {} 

和班级已方法:“validateAge()”和“validateName()”和每一个vallidation,我需要,我将有实施一种新方法。

方法有两个: 我创建了一个叫做抽象类: ValidatePerson {},将有一些commum方法,所有的验证和我将有:

class ValidatePersonAge extends ValidatePerson { validate();} 
class ValidatePersonName extends ValidatePerson {validate();} 

我想选择的方法有两个,原因我将不得不添加的每个新的验证规则都将是一个新类,并且不会影响其他类。就像,如果我需要改变新规则需要的commum方法,我可以覆盖它。在第一种方法中,我将不得不添加另一种方法,然后创建另一种方法或改变已经为其他方法工作的方法,这可能会导致崩溃。

事情是这样一种混淆所有这一切,因为即时通讯编程新,我想看到一些帮助和解释。我也读过类应该关闭更改,但打开扩展(或类似的东西)。

+0

目前还不清楚你在这里问什么。你在寻找什么样的帮助? – Oded 2010-11-25 19:08:02

回答

1

没有特定的正确答案。设计应始终在您的问题领域和业务环境中。因此,这里有各种选项

选项1 Person类有,你可以打电话的当前状态履行他验证一个vailidate()方法。

优点

  • 更好的封装
  • 改变定位于1单级设置的所有属性

缺点

  • 人可能是以后进行
  • 验证处于无效状态b安伏的validate()方法被调用,因此没有失败的快速
  • 不能有不同的验证规则不同的上下文

选项2 每个属性在Person类自身的validateXXX()方法。每个setXXX()方法都将调用相应的validateXXX()方法。

优点

  • 更好的封装
  • 改变定位于1个单班
  • 快速失败行为即Person对象绝不会是一个无效状态

缺点

  • 可能是矫枉过正的基础上下文
  • d不能有不同的验证规则不同的上下文

选项3 你可以有包含这些验证检查一个PersonBuilder。构建器将在构建Person对象之前执行这些验证。这种方式一旦建立了Person对象,它就满足了所有的验证和不变量。

优点

  • 你外在的验证到建筑商类,因此你可以有不同的上下文
  • Construnction逻辑从
  • Person类可以制成不可变的域对象分开不同的验证规则一旦构建

缺点

  • 可能是一个矫枉过正在某些情况下

你的选项2是不正确的,因为ValidatePersonAge不完全一样的ValidatePerson。你不是完全验证这个人,而只是验证他的年龄。所以它们在语义上是不同的。