需要有关类建模的帮助

时间:2010-11-25 18:59:37

标签: design-patterns class

我正在研究一些OO概念,比如设计模式,干净的代码和其他一些东西,我仍然对如何继续有一些疑问。例如,让我们来看看我的例子。

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

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

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

的新类
class ValidatePerson {}

并且该类具有以下方法:“validateAge()”和“validateName()”以及我需要的每个vallidation都必须实现一个新方法。

方法二: 我创建了一个名为的抽象类:  ValidatePerson {}将有一些commum方法进行所有验证,我会:

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

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

事情是,我对这一切感到困惑,因为我是编程的新手,我希望看到一些帮助和解释。我还读过,应该关闭类以便进行更改,但是可以打开以进行扩展(或类似的东西)。

1 个答案:

答案 0 :(得分:1)

没有具体的正确答案。设计应始终位于问题域和业务环境的上下文中。所以这里有各种选项

选项1 Person类有一个vailidate()方法,你可以调用它来执行当前状态的所有验证。

赞成

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

缺点

  • 在调用validate()方法之前,人员可能处于无效状态,因此没有快速失败
  • 不能为不同的上下文设置不同的验证规则

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

赞成

  • 更好的封装
  • 更改已本地化为1个单一类
  • 失败快速行为,即Person对象永远不会是无效状态

缺点

    根据上下文
  • 可能过度。
  • 不能为不同的上下文设置不同的验证规则

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

赞成

  • 您已将验证外部化为构建器类,因此您可以针对不同的上下文使用不同的验证规则
  • Construnction逻辑与域对象分离
  • 人类在构建后可以变为不可变的

缺点

  • 在某些情况下可能会出现过度杀伤

您的选项2不正确,因为ValidatePersonAge与ValidatePerson不同。您没有完全验证此人,只是验证他的年龄。所以它们在语义上是不同的。