我正在考虑验证各种格式的实数的问题,因为这与我在设计中面临的问题非常相似。
实数可能有不同的格式组合,例如: 1. 前面有/没有符号 2. 有/没有小数点(如果没有小数点,那么可能可以事先约定小数位数) 3. 以 10 为底或以 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 语句和标志弄得杂乱无章。
我确信您之前遇到过这种性质的设计问题——许多独立的差异导致行为的差异。我很想知道您是如何在不使代码完全无法维护的情况下实现解决方案的。
像桥模式这样的东西会有帮助吗?