【问题标题】:Need help with classes modeling在类建模方面需要帮助
【发布时间】:2010-11-26 03:35:00
【问题描述】:

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

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

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

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

class ValidatePerson {}

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

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

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

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

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

【问题讨论】:

  • 不清楚你在这里问什么。您究竟在寻求什么帮助?

标签: design-patterns class


【解决方案1】:

没有具体的正确答案。设计应始终与您的问题域和业务环境相关联。所以这里有各种选择

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

优点

  • 更好的封装
  • 更改已本地化到 1 个类
  • 设置所有属性后进行验证

缺点

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

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

优点

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

缺点

  • 根据上下文可能有点矫枉过正
  • 不能针对不同的上下文有不同的验证规则

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

优点

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

缺点

  • 在某些情况下可能有点矫枉过正

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 2014-02-06
    • 2017-11-02
    • 1970-01-01
    相关资源
    最近更新 更多