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); Уточните (для меня) Exit(A) и Result := D - это случаем не RETURN A и RETURN D в КП? ... последнее что я про делфи/ТП помню -- Exit вроде без параметров была.... Result := D; Если так, то сравниваются не равноценные понятия -- способ записи (мат.) функции и способ построения алгоритма из блоков... |
Автор: | 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... Противоречие: правильное требование структурности программы не всегда приводит к улучшению читаемости. Имхо же. |
Автор: | Рэйлвэй Каген [ Понедельник, 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 [ 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/ |