OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 20 Сентябрь, 2019 02:04

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 145 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 8  След.
Автор Сообщение
СообщениеДобавлено: Воскресенье, 14 Февраль, 2010 23:22 

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 14 Февраль, 2010 23:27 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9140
Откуда: Россия, Орёл
Нет, с чего Вы взяли? Есть локальные процедуры.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 14 Февраль, 2010 23:36 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
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 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9140
Откуда: Россия, Орёл
А. Синт. разбор. Понятненько.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 14 Февраль, 2010 23:50 
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 14 Февраль, 2010 23:54 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
Илья Ермаков Генадию Тышову писал(а):
У Вас получается самый обычный

Код:
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 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Berserker писал(а):
Лучше больше времени потратить на создание кода, чем отладку или доработку в будущем. Вполне возможно, что если взять за правило структурный стиль , то через какое-то время это войдёт в привычку.
Попробуйте. Если взять соответствующий язык, который не даст расслабляться, то 100% через некоторое время Вы обнаружите, что так и есть.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 15 Февраль, 2010 06:22 

Зарегистрирован: Понедельник, 25 Февраль, 2008 08:42
Сообщения: 125
Илья Ермаков писал(а):
Выделено: 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 такую свинью подкладываете. Нарушаете свойства объемлющей конструкции.

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 15 Февраль, 2010 09:44 
Аватара пользователя

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1040
Откуда: Россия, Чебоксары
Я согласен с ain!
Конструкция if cond1 then exit(A);... топологически (и алгоритмически) эквивалентна цепочке if cond1 then elseif ..., но читается не в пример легче.
Можно, конечно, привыкнуть, что цепочка elseif всегда будет написана правильно, но полагаться на эту привычку как-то не очень весело...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 15 Февраль, 2010 10:18 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4302
Откуда: Россия, Орёл
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 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9140
Откуда: Россия, Орёл
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 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Код:
if cond1 then Exit(A);
...
Result := D;
Уточните (для меня) Exit(A) и Result := D - это случаем не RETURN A и RETURN D в КП? ... последнее что я про делфи/ТП помню -- Exit вроде без параметров была.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 15 Февраль, 2010 11:08 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8174
Откуда: Троицк, Москва
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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 15 Февраль, 2010 11:11 
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 15 Февраль, 2010 11:15 
Модератор
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 15 Февраль, 2010 11:23 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 15 Февраль, 2010 11:45 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Рэйлвэй Каген писал(а):
Такое имелось в виду?
А что, для записи без 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 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 15 Февраль, 2010 11:58 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Для изображения функции разницы нет.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 15 Февраль, 2010 12:11 

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 145 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 8  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB