我是OO编程的初学者,这个问题是关于在特定设计中处理数据验证。我已经阅读过关于类似问题的this thread,我喜欢第二个解决方案,它建议重新设计构造函数接口,使得无效值无效,但我想知道这个想法是否也适用于我的情况。所以我在下面概述了我的想法,并想知道人们是否同意我的想法。
我有一个Die
类,它是通过传递概率向量构建的。所有概率必须是非负的,并且必须加起来为1.0。
class Die
{
public:
Die(/* Probability vector. */);
int Roll();
}
我可以考虑实现数据验证的几个选项:
Die
构造函数受到保护并接受std::vector<double>
。然后有一个执行数据验证的静态公共方法,如果成功则返回指向新Die
对象的指针,否则返回NULL
。
创建一个包含ProbabilityVector
的{{1}}类,并在那里实现数据验证(使用上面的受保护构造函数+公共静态方法)。然后std::vector<double>
构造函数接受(指向a)Die
的指针。
在ProbabilityVector
上使用静态方法实现单独的ProbabilityVectorValidation
类,返回std::vector<double>
。然后,在必要时,在将bool
传递给std::vector<double>
构造函数之前使用此方法。
(1)的缺点是每次创建Die
时都会执行验证,即使这可能不是必需的。 (2)解决这个问题,但我不确定受保护的构造函数+静态公共方法是否优雅,因为它涉及原始指针。 (3)看起来像一个有吸引力的选择,但似乎不如(1)和(2)那么强大?