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? |
Еще интересная штука.... Если я начну в вспоминать какая эволюция и трансформация понятий "процедура" и "функция" в моей голове происходила (с момента знакомства с программированием), забавный материальчик для студентов психфака получится |
Автор: | 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? |
И еще раз повторю. Либо мы разрешаем побочные эффекты и для процедур и для функций, либо запрещаем. В императивном языке между процедурой и функцией разница только психологическая |
Автор: | Илья Ермаков [ Четверг, 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: Побочные эффекты функций |
Илья Ермаков писал(а): Нельзя неосознанно, из-за "усталости", сделать функцию с побочным эффектом... Да. Но можно это сделать осознанно, поддавшись какому-нибудь соблазну Я считаю, что в таком случае компилятор должен надавать по рукам. |
Автор: | Александр Шостак [ Четверг, 29 Декабрь, 2011 13:26 ] |
Заголовок сообщения: | Re: Побочные эффекты функций |
Цитата: Отсюда и правило проецируется на функции. Большинство функций с побочным эффектом возвращают результат. "Побочный эффект" - результат изменчивости внешнего мира. Самый простой вариант - это когда успех в виде флага возвращается. |
Автор: | ilovb [ Четверг, 29 Декабрь, 2011 13:41 ] |
Заголовок сообщения: | Re: Побочные эффекты функций |
Илья Ермаков писал(а): ... в идеологии Оберона между выражениями и действиями есть твёрдая граница (в отличие от Си), которая нигде не нарушается. Наконец, есть железное правило - вычисление выражения не должно давать побочных эффектов. Отсюда и правило проецируется на функции... Я с вами согласен. Но только частично. Да, в Обероне действительно выражения не предназначены для выполнения последовательности действий. Но! Ничто не мешает такую последовательность организовать, т.к. выражение вычисляется лениво. Не нравится, что операторы в одну строку записаны? Ну пишите их вертикально. Если пораскинуть мозгами, то быстро понимаешь, что проблема заключается в своей собственной подкорке. И естественно выходит, что ваше "железное правило" мыльный пузырь. (я тут конечно императивный язык имею ввиду) И ничего уже не проецируется на функции... Попробуйте доказать обратное! Нет абсолютно никакого смысла запрещать в выражениях побочные эффекты. Забудьте вы вообще про выражения и про само слово "выражение". Назовите для себя это каким нибудь "оператор секьюенс уис гуард" и сразу на душе станет легче. Проблема то есть, но не там куда вы показываете. Проблема в психологии, привычках и т.д. Проблема в человеческом факторе. Когда пасквилянт пробует кодить на Си, он начинает грязно материться, что действия в выражениях это маразм. А когда лисповец начинает кодить на Паскале, то матерится, что элементарные вещи приходится делать через задницу. Я вот сейчас на досуге почитываю SICP - это самая сильная книга по программированию по-моему. Парадоксально, что все, даже самые изысканные примеры можно переписать на CP. Я даже рисую себе в голове такие программы когда читаю примеры на Схеме. Все можно. И тоже будет красиво гибко и расширяемо. НО! Цена усилий несоизмерима! Попробуйте переписать ради интереса пример из книги по работе с дробями. И придать ту же гибкость. У вас это легко получится. Я не сомневаюсь. А потом попробуйте то-же самое в первый раз закодить на Схеме... Ну и далее "но комментс" как говорится!... |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |