OberonCore
https://forum.oberoncore.ru/

Побочные эффекты функций
https://forum.oberoncore.ru/viewtopic.php?f=27&t=3738
Страница 1 из 2

Автор:  Илья Ермаков [ Понедельник, 26 Декабрь, 2011 10:51 ]
Заголовок сообщения:  Побочные эффекты функций

Тема отделена отсюда: viewtopic.php?p=68903#p68903

alexus писал(а):
Что мешает сделать этапы логическими функциями? Тогда было бы просто...
Код:
IF <этап0> AND <этап1> AND <этап3> ... THEN....


Мешает, пожалуй, только правило "Функции не должны иметь побочных эффектов"... В случае локальных фукнций, специально введённых для такого оформления поведения, можно, конечно, на это забить.
Но функциональщики будут кусать за пятки :)

Я бы придерживался более слабого правила - функция с побочным эффектом может быть только локальной.

Автор:  ilovb [ Понедельник, 26 Декабрь, 2011 13:01 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Я для себя с некоторых пор стал различать функции и процедуры-функции (в собственном смысле).
Не то чтобы я это где-то вычитал. Этакое изобретение моей больной фантазии :)
Отличаются они тем, что результат работы функции - это собсна то, что она возвращает. (ну и без побочных эффектов ессесна)
А результат работы процедуры-функции как у обычной процедуры, с той лишь разницей, что она еще сообщает (возвращая булево), сделала ли она то, что от нее требовалось.

Трудность тут в том что и та и другая могут возвращать булево. Я в своем коде такие случаю четко различаю. А вот кодер со стороны может не врубиться.

p.s. А вообще понятие побочного эффекта по большому счету и на процедуры должно распространяться.

Автор:  ilovb [ Понедельник, 26 Декабрь, 2011 13:16 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

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

Автор:  igor [ Понедельник, 26 Декабрь, 2011 14:01 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Илья Ермаков писал(а):
Я бы придерживался более слабого правила - функция с побочным эффектом может быть только локальной.
То есть, по Вашему, лишь глобальные функции должны быть без побочного эффекта? В этом случае получается вот что. Так как глобальные функции в общем случае могут содержать в себе вызовы других функций (в том числе и локальных!), то отсутствие побочного эффекта для них не гарантируется.

Автор:  Valery Solovey [ Понедельник, 26 Декабрь, 2011 20:18 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Локальная функция называется локальной потому, что работает с локальными данными.

Автор:  Владислав Жаринов [ Вторник, 27 Декабрь, 2011 19:46 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

ilovb писал(а):
...
p.s. А вообще понятие побочного эффекта по большому счету и на процедуры должно распространяться.
Типа как здесь описано? Или что-то более глубинное есть?..

Автор:  igor [ Вторник, 27 Декабрь, 2011 21:17 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

ilovb писал(а):
p.s. А вообще понятие побочного эффекта по большому счету и на процедуры должно распространяться.
Если процедура, которая не обязана возвращать никакого значения, ещё и не будет обладать "побочным эффектом", то зачем она вообще тогда нужна? То, что для функций является побочным эффектом, для процедур наоборот, является их полезным действием, то есть тем, ради чего процедура и пишется.

Автор:  ilovb [ Вторник, 27 Декабрь, 2011 22:14 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

То, что процедура изменяет, должно быть в списке ее параметров

Автор:  ilovb [ Вторник, 27 Декабрь, 2011 22:20 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Я просто хочу сказать, что если речь заходит о побочных эффектах, то есть два варианта:
1. Их нет (функцианальщина)
2. Их есть (императивщина)

Причем, во втором случае функции вообще исчезают в их изначальном смысле. А есть только процедура, которая кладет что-то в AX (и т.д.)

Ну, то бишь:

PROCEDURE foo(VAR A: INTEGER);
BEGIN
A := A * 2;
END;

эквивалентно

PROCEDURE foo(A): INTEGER;
BEGIN
RETURN A * 2;
END;

Не знаю короче как еще выразиться. В общем, в императивном языке требовать от функций чистоты большого смысла не имеет. Это дело вкуса.

Автор:  igor [ Среда, 28 Декабрь, 2011 05:58 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

ilovb писал(а):
То, что процедура изменяет, должно быть в списке ее параметров

По Вашему получается, что процедура без параметров - это зло: внутри себя что-то мутит, а в параметрах результат не "светит". Так можно далеко зайти в своих рассуждениях. Например, прийти к выводу, что нужно убрать из КП команды, положить их на полку где-то между GOTO и передачей параметров по имени. :)

Автор:  ilovb [ Среда, 28 Декабрь, 2011 09:21 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Пихать все в параметры или не пихать зависит от контекста, степени понятности кода, степени взаимопонимания в коллективе и много еще от чего. Все это дело вкуса.
Если чистые процедуры и функции это стиль вашей архитектуры, то используйте по возможности только их.
Если из названия/контекста очевидно какие переменные будут изменены при выполнении процедуры, то убирайте их из параметров нафик (тем более во вложенных процедурах)

Автор:  ilovb [ Среда, 28 Декабрь, 2011 09:25 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

И еще раз повторю. Либо мы разрешаем побочные эффекты и для процедур и для функций, либо запрещаем.

В императивном языке между процедурой и функцией разница только психологическая :D

Автор:  Илья Ермаков [ Четверг, 29 Декабрь, 2011 07:32 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Не совсем.

Функцию (в идеологии Оберона) можно рассматривать как специальный случай процедуры, предназначенный для использования в выражениях. Т.е. функция - это процедура, расширяющая состав операций, применимых в выражениях. (Вызывать функцию не из выражения в Обероне запрещено).
Далее, в идеологии Оберона между выражениями и действиями есть твёрдая граница (в отличие от Си), которая нигде не нарушается.
Наконец, есть железное правило - вычисление выражения не должно давать побочных эффектов.
Отсюда и правило проецируется на функции.

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

Автор:  igor [ Четверг, 29 Декабрь, 2011 07:58 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Илья Ермаков писал(а):
есть железное правило
Точнее, "бумажное правило".

Автор:  Илья Ермаков [ Четверг, 29 Декабрь, 2011 08:54 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

"Писанное кровью" :) Если речь про выражения, невырожденные (т.е. не случай IF Fun() THEN, а реальные вычисления).

Автор:  igor [ Четверг, 29 Декабрь, 2011 08:59 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Илья Ермаков писал(а):
"Писанное кровью" :)
Согласен :) . Причём, цензор сидит не в компиляторе, а в голове.

Автор:  Илья Ермаков [ Четверг, 29 Декабрь, 2011 09:06 ]
Заголовок сообщения:  Re: Побочные эффекты функций

Тоже интересный вопрос - что вешать на язык/компилятор.

Есть проверки "первого рода" - это то, что есть вероятность нарушить неосознанно (допустить ошибку по невнимательности). Очень важно это проверять. Особенно, если вероятность ошибки высока, а искать трудно (как порча памяти. А уже инициализация переменных даёт ошибку в логике, при этом легко обнаружимую; поэтому на весах "ранее обнаружение | эффективность" у Вирта перевесило второе).
Есть проверки "второго рода" - того, что неосознанно сделать неправильно никак нельзя. Нельзя неосознанно, из-за "усталости", сделать функцию с побочным эффектом... Поэтому это уже не столь критично. Хотя со временем эволюция. видимо, будет в сторону введения подобных правил в язык. Как и, например, индентации (что Info21 включил в школьную сборку).

Автор:  igor [ Четверг, 29 Декабрь, 2011 10:35 ]
Заголовок сообщения:  Re: Побочные эффекты функций

Илья Ермаков писал(а):
Нельзя неосознанно, из-за "усталости", сделать функцию с побочным эффектом...
Да. Но можно это сделать осознанно, поддавшись какому-нибудь соблазну :!:
Я считаю, что в таком случае компилятор должен надавать по рукам. :mrgreen:

Автор:  Александр Шостак [ Четверг, 29 Декабрь, 2011 13:26 ]
Заголовок сообщения:  Re: Побочные эффекты функций

Цитата:
Отсюда и правило проецируется на функции.

Большинство функций с побочным эффектом возвращают результат. "Побочный эффект" - результат изменчивости внешнего мира. Самый простой вариант - это когда успех в виде флага возвращается.

Автор:  ilovb [ Четверг, 29 Декабрь, 2011 13:41 ]
Заголовок сообщения:  Re: Побочные эффекты функций

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


Я с вами согласен. Но только частично.
Да, в Обероне действительно выражения не предназначены для выполнения последовательности действий.
Но! Ничто не мешает такую последовательность организовать, т.к. выражение вычисляется лениво.
Не нравится, что операторы в одну строку записаны? Ну пишите их вертикально.
Если пораскинуть мозгами, то быстро понимаешь, что проблема заключается в своей собственной подкорке.
И естественно выходит, что ваше "железное правило" мыльный пузырь. (я тут конечно императивный язык имею ввиду)
И ничего уже не проецируется на функции...

Попробуйте доказать обратное! Нет абсолютно никакого смысла запрещать в выражениях побочные эффекты. Забудьте вы вообще про выражения и про само слово "выражение". Назовите для себя это каким нибудь "оператор секьюенс уис гуард" и сразу на душе станет легче. :D

Проблема то есть, но не там куда вы показываете. Проблема в психологии, привычках и т.д. Проблема в человеческом факторе.

Когда пасквилянт пробует кодить на Си, он начинает грязно материться, что действия в выражениях это маразм. А когда лисповец начинает кодить на Паскале, то матерится, что элементарные вещи приходится делать через задницу.

Я вот сейчас на досуге почитываю SICP - это самая сильная книга по программированию по-моему.
Парадоксально, что все, даже самые изысканные примеры можно переписать на CP. Я даже рисую себе в голове такие программы когда читаю примеры на Схеме. Все можно. И тоже будет красиво гибко и расширяемо.

НО! Цена усилий несоизмерима!

Попробуйте переписать ради интереса пример из книги по работе с дробями. И придать ту же гибкость.
У вас это легко получится. Я не сомневаюсь. А потом попробуйте то-же самое в первый раз закодить на Схеме... Ну и далее "но комментс" как говорится!...

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