Предыдущая схема извлечена из следующего кода:
Код:
ok := FALSE;
LOOP
ch := s [ix];
IF ch = 0X THEN ok := TRUE; EXIT;
ELSIF ('0' <= ch) & (ch <= maxdig) THEN dig := ORD (ch) - ORD ('0');
ELSIF ch # Common.region.tickMark [0] THEN EXIT END;
IF ch # Common.region.tickMark [0] THEN i := i * base + dig END;
INC (ix);
END;
Для начала отформатируем блок, чтобы была видна структура:
Код:
ok := FALSE;
LOOP
ch := s [ix];
IF ch = 0X THEN
ok := TRUE;
EXIT;
ELSIF ('0' <= ch) & (ch <= maxdig) THEN
dig := ORD (ch) - ORD ('0');
ELSIF ch # Common.region.tickMark [0] THEN
EXIT
END;
IF ch # Common.region.tickMark [0] THEN
i := i * base + dig;
END;
INC (ix);
END;
Дана строка s с записью числа по основанию base (2..10). В строке могут встречаться разделители групп разрядов tickMark, которые нужно проигнорировать (например: "1'000'000", tickMark = апостроф). maxdig - максимальный допустимый в записи числа символ = CHR (ORD ('0') + base - 1). Все используемые переменные проинициализированы ранее, здесь этот код не приводится. Требуется расшифровать число и поместить в переменную i типа INTEGER.
Привожу данный пример постольку, поскольку преобразованный код считаю не только более лаконичным, но и гораздо более читабельным:
Код:
ch := s [ix];
WHILE (ch # 0X) & (('0' <= ch) & (ch <= maxdig) OR (ch = Common.region.tickMark [0])) DO
IF ch # Common.region.tickMark [0] THEN
i := i * base + ORD (ch) - ORD ('0');
END;
INC (ix);
ch := s [ix];
END;
ok := ch = 0X;
В заголовке цикла сразу видно:
1) строка заканчивается символом 0X,
2) перечень допустимых символов описан единым достаточно простым условием: интервал + один особый символ.
В теле цикла чётко видно:
1) что делать со всеми символами, кроме одного особого,
2) шаг итерации - берём следующий символ.
После цикла видно, что ok - это признак достижения конца строки, то есть успешная расшифровка. Не нужно выискивать присваивания ok в теле цикла (даже если бы они там были, конечное значение однозначно задано после цикла).
Первоначальный и конечный варианты оба состоят из 9 строк, но в первом случае краткость достигнута нарушениями стиля, препятствующими пониманию структуры, а во втором - нормальной структурой.
Избавились от вспомогательной переменной dig (в коде после рассмотренного фрагмента она не использовалась, поэтому сохранять её значение за пределами цикла не было смысла).