类应该验证自己还是创建另一个类来验证它?

siv*_*udh 20 oop

假设我有一个类:

class NavigationData
{
  float roll;
  float pitch;
  double latitude;
  double longitude;
}
Run Code Online (Sandbox Code Playgroud)

如果我想创建一个方法:

const bool validate() const;
Run Code Online (Sandbox Code Playgroud)

这基本上验证了4个字段是否包含有效值.

validate()应该是NavigationData类的一部分,还是应该创建一个类似于NavigationDataValidator的东西,它包含一个validate(const NavigationData&)方法.

我只是给出一个简单的例子,显然我的真正的课程比这复杂得多.我正在寻找良好的OO原则.

换句话说:给定一个方法,我们如何知道它应该属于该类,还是属于一个单独的类?

Joh*_*lla 23

通常,类是自己的责任,以确保它保持逻辑上一致和有效的内部状态.例如,Person如果Person没有这些数据,操作就没有意义,可能有一个需要名字和姓氏的构造函数.

但是,"逻辑上一致且有效""在域中有意义"不同,因此有时外部类的责任是确保遵守域规则.例如,PersonValidator可能要求Person具有在美国的电话号码.但是,Person不一定需要知道a PhoneNumber是否在美国.

一个好的经验法则是,除了已经属于类的数据之外,如果需要类外部的状态或域规则,则需要考虑进行外部验证.如果类的实例的状态可能来自多个源(例如,数据库,Web表单,文件等),您可能还希望将验证集中在外部类中.


che*_*vim 7

正确的答案是:这取决于.

放置这种对象逻辑的自然场所在于对象本身.有时虽然验证规则可能依赖于规则引擎或某种更大的"框架"来验证内容.您不希望在对象内部进行验证的另一种情况是验证属于另一层,层或应用程序(例如视图层).