【发布时间】:2009-06-30 09:42:31
【问题描述】:
我正在考虑验证各种格式的实数的问题,因为这与我在设计中面临的问题非常相似。
实数可能有不同的格式组合,例如: 1.前面有/没有标志 2.带/不带小数点(如果没有小数点,那么小数位数可以事先约定好) 3. base 10 或 base 16
我们需要考虑每个组合,所以有 2x2x2=8 个组合。您可以看到,随着每个新条件的施加,复杂性呈指数级增长。
在 OO 设计中,您通常会为每种数字格式分配一个类(例如,在这种情况下,我们有 8 个类),并且每个类都有一个单独的验证函数。但是,对于每个新条件,您都必须将所需的课程数量增加一倍,这很快就会变成一场噩梦。
在过程编程中,您使用 3 个标志(即 has_sign、has_decimal_point 和 number_base)来识别您正在验证的实数的属性。您有一个用于验证的函数。在那里,您将使用标志来控制其行为。
// This is part of the validation function
if (has_sign)
check_sign();
for (int i = 0; i < len; i++)
{
if (has_decimal_point)
// Check if number[i] is '.' and do something if it is. If not, continue
if (number_base = BASE10)
// number[i] must be between 0-9
else if (number_base = BASE16)
// number[i] must be between 0-9, A-F
}
同样,复杂性很快就会失控,因为函数中充满了 if 语句和标志。
我确信您之前遇到过这种性质的设计问题——许多独立的差异会导致行为差异。我很想知道您是如何在不使代码完全无法维护的情况下实现解决方案的。
桥模式之类的东西会有帮助吗?
【问题讨论】:
标签: c++ oop software-design procedural-programming