假设我有一个类:
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表单,文件等),您可能还希望将验证集中在外部类中.
正确的答案是:这取决于.
放置这种对象逻辑的自然场所在于对象本身.有时虽然验证规则可能依赖于规则引擎或某种更大的"框架"来验证内容.您不希望在对象内部进行验证的另一种情况是验证属于另一层,层或应用程序(例如视图层).