設計で直面している問題と非常によく似ているため、さまざまな形式の実数を検証する問題を検討しています。
実数は、さまざまな形式の組み合わせで提供されます。たとえば、次のようになります。1.先頭に符号がある/ない2.小数点がある/ない(小数点がない場合は、小数点以下の桁数を事前に合意できます)3.基数10またはベース16
各組み合わせを許可する必要があるため、2x2x2=8の組み合わせがあります。新しい条件が課されるたびに、複雑さが指数関数的に増加することがわかります。
オブジェクト指向デザインでは、通常、数値形式ごとにクラスを割り当て(たとえば、この場合は8つのクラスがあります)、各クラスには個別の検証関数があります。ただし、新しい条件ごとに、必要なクラスの数を2倍にする必要があり、すぐに悪夢になります。
手続き型プログラミングでは、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ステートメントとフラグで雑然となると、複雑さはすぐに手に負えなくなります。
私はあなたが以前にこの性質の設計問題に出くわしたと確信しています-振る舞いの違いをもたらす多くの独立した違い。コードを完全に保守不可能にすることなく、どのようにしてソリューションを実装できたのか、非常に興味があります。
ブリッジパターンのようなものが役に立ちましたか?