OberonCore
https://forum.oberoncore.ru/

Почему программа должна быть структурной
https://forum.oberoncore.ru/viewtopic.php?f=82&t=2348
Страница 3 из 8

Автор:  Александр Шостак [ Воскресенье, 14 Февраль, 2010 23:22 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

Согласен. Лучше больше времени потратить на создание кода, чем отладку или доработку в будущем. Вполне возможно, что если взять за правило структурный стиль , то через какое-то время это войдёт в привычку.
К сожалению, определённым дублированием всё же приходится расплачиваться. В иерархическом коде, где на каждом шаге функция N-го уровня может вернуться ошибку, после каждого действия идёт блок:
IF NOT Ошибка THEN ... END;
Что несколько портит читабельность. Хотя, с другой стороны, близко к человеческому мышлению (сделай А, если без проблем, то Б, если всё хорошо, то С...).

Имхо, стоит всё-таки собрать доказательства и набор небольших доступных примеров и пропагандировать такой подход. У части людей, к коим отношусь и я, есть постоянное желание найти более безопасный, удобный, эффективный стиль программирования. И очевидно, что с неба выводы (откровения) не падают.
А выгода от "истинно-структурного" подхода всё же есть. Уверенность в линейности кода, возможность свободно (отчасти) комбинировать блоки и дорабатывать программу с любого места (без предварительного анализа всех break/return-ов и содержимого их ветвей). Проще разбить большие участки на более мелкие механически и т.д.

Кстати, в Обероне ведь отказались от локальных процедур? Если да, то зря. Вынос на уровень модуля подфункций, нужных только одной процедуре, приводит к загрязнению первого.

Автор:  Илья Ермаков [ Воскресенье, 14 Февраль, 2010 23:27 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

Нет, с чего Вы взяли? Есть локальные процедуры.

А про ошибки - откуда в прикладном коде (не взаимодействующем с внешней средой) такая проблема?
Может, ASSERT-ы надо просто тыкать?

Автор:  Александр Шостак [ Воскресенье, 14 Февраль, 2010 23:36 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

ASSERT-ы нужны, когда ошибка логическая и её в обычной ситуации быть не должно. А бывает, что ошибки вполне предусмотрены и содержат полезную информацию. Сегодня переписал несколько функций без опасных операторов и вышло следующее:

Код:
...........
RESULT:=Self.GetNextItem(Item);
   WHILE (RESULT = Gen.ERR_OK) AND (Item <> NIL) DO BEGIN
      RESULT:=ProcessItem(Item);
      IF RESULT = Gen.ERR_OK THEN BEGIN
         RESULT:=Self.GetNextItem(Item);
      END; // .if
   END; // .while
   IF (RESULT = Gen.ERR_OK) AND (ChainInd > 0) THEN BEGIN
      RESULT:=ERR_SUBEXPRDISBALANCE;
   END; // .if
   IF RESULT <> Gen.ERR_OK THEN BEGIN
      TExprItem(SubExprChain[0]).Free;
   END // .if
   ELSE BEGIN
      Res:=SubExprChain[0];
   END; // .else
................

Функция получения очередного элемента выражения может вернуть ошибку. Функция обработки этого элемента тоже может вернуться ошибку. Если цикл кончился, а скобки не уравновешены (например: "3+5)))") - снова ошибка. До структуризации подфункций не было и это был цикл с break-ами, освобождением памяти в случаях ошибки и т.д.

Автор:  Илья Ермаков [ Воскресенье, 14 Февраль, 2010 23:44 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

А. Синт. разбор. Понятненько.

Автор:  Димыч [ Воскресенье, 14 Февраль, 2010 23:50 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

Berserker писал(а):
Имхо, стоит всё-таки собрать доказательства и набор небольших доступных примеров и пропагандировать такой подход. У части людей, к коим отношусь и я, есть постоянное желание найти более безопасный, удобный, эффективный стиль программирования. И очевидно, что с неба выводы (откровения) не падают.

Собственно, это была вторая мысль после "Вау!", собрать это все где-то в одном месте.
Но, прежде чем собрать, это надо обдумать.

Автор:  Александр Шостак [ Воскресенье, 14 Февраль, 2010 23:54 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

Илья Ермаков Генадию Тышову писал(а):
У Вас получается самый обычный

Код:
WHILE условие & условие & .... условие DO
   IF условие THEN
      действие
  END
END;
(* И действия по окончанию цикла: *)
IF .. THEN
 
ELSIF ... THEN


END;



Как видите, никаких break. Но текстом выглядит громоздко, т.к. после цикла приходится повторять некоторые проверки условий...


Ничего страшного в множестве условий нет, имхо. Есть два пути. Первый - вынос их всех в одну функцию. Второй - альтерзапись:

Код:
WHILE
   Cond1 AND
   Cond2 AND
   Cond3 AND
   Cond4
DO BEGIN
...
END; // .while

Автор:  Евгений Темиргалеев [ Понедельник, 15 Февраль, 2010 01:17 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

Berserker писал(а):
Лучше больше времени потратить на создание кода, чем отладку или доработку в будущем. Вполне возможно, что если взять за правило структурный стиль , то через какое-то время это войдёт в привычку.
Попробуйте. Если взять соответствующий язык, который не даст расслабляться, то 100% через некоторое время Вы обнаружите, что так и есть.

Автор:  ain [ Понедельник, 15 Февраль, 2010 06:22 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

Илья Ермаков писал(а):
Выделено: viewtopic.php?p=42549#p42549

Вы использовали следующую композицию:

if cond1 then A;
if cond2 then B;
if cond3 then C;



Зачем вы сделали подмену?
У меня совсем иная конструкция.
Код:
if cond1 then Exit(A);
if cond2 then Exit(B);
if cond3 then Exit(C);
Result := D;


Илья Ермаков писал(а):
Анализ поведения данной конструкции требует знания внутреннего устройства A, B и С.

Разумеется и всё просто. Если некоторое условие истинно, нужно выполнить определенное действие и выйти.

Илья Ермаков писал(а):
Из свойств конструкции охраны я делаю вывод, что будет выполнено 0 или более блоков A..C, для которых истинна охрана.

Поскольку вы вместо моей поставили свою конструкцию, то для вашей - да.
НО в моей конструкции гарантированно будет выполнен один блок.

Илья Ермаков писал(а):
А Вы мне во внутреннем устройстве этих A, B, C такую свинью подкладываете. Нарушаете свойства объемлющей конструкции.

Очень распространенный приём
Сперва изменим конструкцию, а потом это дело порвем на части!

Илья Ермаков писал(а):
Программа - это не литературный текст, извините. Оправдания вида "ну, вы читайте подряд - всё понятно ведь" не принимаются. Основная операция над программой - её развитие. Поэтому следует использовать строгий набор преобразований, который строгим образом меняет свойства (выход от постановки задачи на реализацию путём чётких шагов-схем).

Раз вы так легко запутались в четырех строчках моей конструкции, что не смогли даже правильно переписать, то …

Автор:  Alexey_Donskoy [ Понедельник, 15 Февраль, 2010 09:44 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

Я согласен с ain!
Конструкция if cond1 then exit(A);... топологически (и алгоритмически) эквивалентна цепочке if cond1 then elseif ..., но читается не в пример легче.
Можно, конечно, привыкнуть, что цепочка elseif всегда будет написана правильно, но полагаться на эту привычку как-то не очень весело...

Автор:  Борис Рюмшин [ Понедельник, 15 Февраль, 2010 10:18 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

Alexey_Donskoy писал(а):
Я согласен с ain!
Конструкция if cond1 then exit(A);... топологически (и алгоритмически) эквивалентна цепочке if cond1 then elseif ..., но читается не в пример легче.
Можно, конечно, привыкнуть, что цепочка elseif всегда будет написана правильно, но полагаться на эту привычку как-то не очень весело...

Может я конечно чего-то не понимаю в вашей беседе... но чем "совсем иная конструкция" (причем в самом исходном варианте)
ain писал(а):
Код:
if cond1 then Exit(A);
if cond2 then Exit(B);
if cond3 then Exit(C);
Result := D;


отличается от
Код:
IF cond1 THEN a()
ELSIF cond2 THEN b()
ELSIF cond3 THEN c()
ELSE d();
END

Если под Exit подразумевается выход из... а из чего, кстати?
Где проблема с удобочитаемостью на самом деле?

Автор:  Илья Ермаков [ Понедельник, 15 Февраль, 2010 10:35 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

ain писал(а):
Илья Ермаков писал(а):
Выделено: viewtopic.php?p=42549#p42549

Вы использовали следующую композицию:

if cond1 then A;
if cond2 then B;
if cond3 then C;



Зачем вы сделали подмену?
У меня совсем иная конструкция.
Код:
if cond1 then Exit(A);
if cond2 then Exit(B);
if cond3 then Exit(C);
Result := D;



Я? Подмену??

Я подставил переменную вместо конкретного элемента.

По синтаксису имеем "if" boolean_expr "then" block.

То, что у Вас там частный случай, когда block состоит из одной операции Exit - это как раз Ваши проблемы. Единой отдельной конструкции if then Exit в языке нет.

Может быть, я сбил с толку тем, что обозвал всё так же A, B, C? (хотя у вас там маленькие буквы). Замените на X, Y, Z - несущественно. Речь о том, что эти X, Y, Z не имеют права влиять на верхний блок управления, в который они встроены. Т.е. наличие и использование Exit - нелегально, с точки зрения проектной культуры.

Автор:  Евгений Темиргалеев [ Понедельник, 15 Февраль, 2010 10:58 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

Код:
if cond1 then Exit(A);
...
Result := D;
Уточните (для меня) Exit(A) и Result := D - это случаем не RETURN A и RETURN D в КП? ... последнее что я про делфи/ТП помню -- Exit вроде без параметров была.

Если так, то сравниваются не равноценные понятия -- способ записи (мат.) функции и способ построения алгоритма из блоков...

Автор:  Info21 [ Понедельник, 15 Февраль, 2010 11:08 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

Alexey_Donskoy писал(а):
... Конструкция if cond1 then exit(A);... топологически (и алгоритмически) эквивалентна цепочке if cond1 then elseif ..., но читается не в пример легче.
Не понял, что читается легче?

ain писал(а):
Код:
if cond1 then Exit(A);
if cond2 then Exit(B);
if cond3 then Exit(C);
Result := D;



Код:
IF    cond1 THEN A
ELSIF cond2 THEN B
ELSIF cond3 THEN C
ELSE D
END;
RETURN

Автор:  Alexey_Donskoy [ Понедельник, 15 Февраль, 2010 11:11 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

Борис Рюмшин писал(а):
Если под Exit подразумевается выход из... а из чего, кстати?
Где проблема с удобочитаемостью на самом деле?
Выход из текущего "блока". Например, процедуры. Или цикла (тогда Exit=Break).
Удобочитаемость - ИМХО, в Exit и Break всё-таки более явно содержится маршрут, чем в if/elseif. В первом случае сразу ясно, куда, и отслеживать специально не надо. Во втором неизбежно надо искать следующий elseif...

Противоречие: правильное требование структурности программы не всегда приводит к улучшению читаемости. Имхо же.

Автор:  Евгений Темиргалеев [ Понедельник, 15 Февраль, 2010 11:15 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

Alexey_Donskoy писал(а):
Борис Рюмшин писал(а):
Если под Exit подразумевается выход из... а из чего, кстати?
Где проблема с удобочитаемостью на самом деле?
Выход из текущего "блока". Например, процедуры. Или цикла (тогда Exit=Break).
Удобочитаемость - ИМХО, в Exit и Break всё-таки более явно содержится маршрут, чем в if/elseif. В первом случае сразу ясно, куда, и отслеживать специально не надо. Во втором неизбежно надо искать следующий elseif...

Противоречие: правильное требование структурности программы не всегда приводит к улучшению читаемости. Имхо же.
Неверно. Чем поиск следующего elseif сложнее поиска объемлющей конструкции, чтобы понять Exit из цикла или из процедуры, и в какую он точку?

Автор:  Рэйлвэй Каген [ Понедельник, 15 Февраль, 2010 11:23 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

ain писал(а):
Код:
if cond1 then Exit(A);
if cond2 then Exit(B);
if cond3 then Exit(C);
Result := D;
Такое имелось в виду?
Вложение:
Новый_2.png
Новый_2.png [ 5.35 КБ | Просмотров: 9421 ]
Илья Ермаков писал(а):
..Т.е. наличие и использование Exit - нелегально, с точки зрения проектной культуры.
Ну, коряво код примера записан, но зачем же всю проектную культуру под нелегальщину подводить?

Автор:  Евгений Темиргалеев [ Понедельник, 15 Февраль, 2010 11:45 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

Рэйлвэй Каген писал(а):
Такое имелось в виду?
А что, для записи без Exit будет другая схема? :)
Код:
IF cond1 THEN Result := A
ELSIF cond2 THEN Result := B
ELSIF cond3 THEN Result := C
ELSE Result := D
END;
RETURN Result

Автор:  Рэйлвэй Каген [ Понедельник, 15 Февраль, 2010 11:49 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

Я на то и намекаю.
Другое дело, когда объемлющая конструкция - цикл, а не "заголовок-выход". Там-то нелегальщина и попрёт :).

Автор:  Евгений Темиргалеев [ Понедельник, 15 Февраль, 2010 11:58 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

Для изображения функции разницы нет.

А в общем -- про что речь идёт -- кусок шампур-блока, изображающий IF-ELSIF-END без Exit/RETURN можно спокойно воткнуть в любую валентную точку. Т.к. у него один вход и один выход.

Автор:  Рэйлвэй Каген [ Понедельник, 15 Февраль, 2010 12:11 ]
Заголовок сообщения:  Re: Почему программа должна быть структурной

Конечно, можно.
Однако из-за этого ain-овскую запись нельзя называть проектной ошибкой. Она даже более эргономична, чем Ваша, т.к. не надо искать границу объемлющего if'a, а сразу виден выход(что и заметил Alexey_Donskoy).
Другое дело, что ain-овская запись неуниверсальна - было бы некорректно втыкать её в любую "валентную точку" линейной текстовой записи.

Страница 3 из 8 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/