Я рассматриваю проблему проверки действительных чисел различных форматов, потому что это очень похоже на проблему, с которой я сталкиваюсь в дизайне.
Вещественные числа могут иметь различные комбинации форматов, например:
1. с / без знака на передней панели
2. с / без десятичной точки (если нет десятичной точки, то, возможно, число десятичных знаков может быть согласовано заранее)
3. основание 10 или основание 16
Нам нужно учесть каждую комбинацию, поэтому есть 2x2x2 = 8 комбинаций. Вы можете видеть, что сложность увеличивается экспоненциально с каждым новым наложенным условием.
В ОО-дизайне вы обычно выделяете класс для каждого числового формата (например, в этом случае у нас есть 8 классов), и у каждого класса будет отдельная функция проверки. Однако с каждым новым условием вам нужно удваивать количество необходимых классов, и вскоре это становится кошмаром.
В процедурном программировании вы используете 3 флага (то есть has_sign, has_decimal_point и number_base), чтобы идентифицировать свойство действительного числа, которое вы проверяете. У вас есть одна функция для проверки. Там вы будете использовать флаги для управления его поведением.
// This is part of the validation function</p>
<p>if (has_sign)
check_sign();</p>
<p>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</p>
<pre><code>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 и флагами.
Я уверен, что вы уже сталкивались с проблемами дизайна подобного рода - рядом независимых отличий, которые приводят к различиям в поведении. Мне было бы очень интересно услышать, как вы смогли реализовать решение, не делая код полностью не поддерживаемым.
Помогло бы что-нибудь вроде схемы моста?