Владимир Паронджанов писал(а):
Шампур -- фундаментальное понятие Дракона. Нет шампура -- нет и Дракона.
Мне кажется, не стоит злоупотреблять понятием фундаментальности... Действительно фундаментальным является представление алгоритма в виде ориентированного графа, и только. А вот шампур (как частный случай графа, плюс набор определённых правил) следовало бы назвать хорошо зарекомендовавшей себя эмпирикой, на основе которой построен Дракон (если это действительно так).
В случае моделирования цикла while мы получаем
противоречие между двумя обоснованными эргономическими требованиями:
1) непрерываемость шампура в большом (в масштабе всей ветки);
2) непрерываемость шампура в малом (в масштабе цикла).
Пункт 2 требует пояснения. Раз уж мы пишем цикл, мы подразумеваем, что тело цикла, как правило, выполняется хотя бы один раз. При этом тело цикла соответствует "главному пути" на данном участке алгоритма.
Следовательно, то, что тело цикла while болтается где-то справа, в стороне от шампура, не есть хорошо. Это сбивает с толку и может служить источником непонимания.
Ситуация усугубляется тем, что
появляются две формы одного и того же цикла, причём мелкая и несущественная по сути разница между ними (проверять условие до или после) оборачивается существенной разницей в их визуальном представлении.
Как всегда, решать возникшее техническое противоречие можно разными путями. Классический путь - компромиссный выбор меньшего зла... Осуществить такой выбор целесообразно, например, методом экспертной оценки, взвесив все плюсы и минусы обоих вариантов. Подозреваю, что в целевой функции, описывающей критерии такого сравнения, обязательно появится множитель, характеризующий вероятность, частоту, наезженность оцениваемого пути. Если тело цикла выполняется N раз, а выход из цикла - всегда один раз, то
приоритет эргономического требования №2 будет в N раз выше, поэтому следует предпочесть этот вариант. Что я и предлагаю.
Кроме всего сказанного, существует и ещё один серьёзный аргумент против варианта №1 - это
существование нагруженной дуги графа в виде обратной петли (там, где идёт тело цикла). Если в цикле until мы имеем просто маршрутную стрелку, идущую только вверх (с чем вполне можно примириться), то в цикле while мы имеем много действий, целый "шампурчик". который вдруг неожиданно поворачивает и идёт обратно!
Данный аргумент полагаю более серьёзным. Так, если "наезженность пути" входит в целевую функцию с весовым коэффициентом 1, то для обратной петли я бы поставил вес не менее 3.
Существует, однако, другой путь решения технического противоречия. Кто знаком, уже наверняка среагировал на термин "техническое противоречие" и понял, что я говорю про ТРИЗ... Здесь можно коротко заметить, что решение обычно находится в другой плоскости (вренее, в другом измерении). Надо придумать не просто так, чтобы и волки были сыты, и овцы целы; но так,
чтобы самого противоречия не возникало. В данном случае решением может быть
другая форма отображения...