что такое побочный эффект функции
Побочный эффект (программирование)
Побо́чный эффе́кт функции — возможность в процессе выполнения своих вычислений: читать и модифицировать значения глобальных переменных, осуществлять операции ввода/вывода, реагировать на исключительные ситуации, вызывать их обработчики. Если вызвать функцию с побочным эффектом дважды с одним и тем же набором значений входных аргументов, может случиться так, что в качестве результата вычислятся разные значения. Такие функции называются недетерминированными функциями с побочными эффектами.
Литература
Полезное
Смотреть что такое «Побочный эффект (программирование)» в других словарях:
Побочный эффект — Побочный эффект не основные, дополнительные (как желательные, так и нежелательные) последствия. Побочный эффект (медицина) (англ. Adverse effect) как правило, выражение употребляется по отношению к лекарственным средствам Побочный… … Википедия
Функция (программирование) — У этого термина существуют и другие значения, см. функция. Функция в программировании это поименованная часть программы, которая может вызываться из других частей программы столько раз, сколько необходимо. Функция, в отличие от… … Википедия
Чистота функции — В функциональных языках программирования, чистая функция, это функция, которая: является детерминированной; не обладает побочными эффектами. Наличие только одного из свойств недостаточно, для того чтобы функция была чистой. Содержание 1… … Википедия
Детерминированный алгоритм — Детерминированный алгоритм алгоритмический процесс, который выдаёт уникальный и предопределённый результат для заданных входных данных. Содержание 1 Недетерминированный алгоритм 2 Использование … Википедия
Thread-safety — Потоковая безопасность (англ. thread safety) это концепция программирования, применимая к многопоточным программам. Код потоково безопасный, если он функционирует корректно при использовании из нескольких потоков одновременно. В частности,… … Википедия
П — Пааше индекс [Paasche price index] Пагамент (Payment in cash) Пай (share, stock, stake) Пакет акций (interest, stock ) Пакетный множитель (blockage factor) … Экономико-математический словарь
Побочные эффекты
Побочные эффекты
Побочный эффект выражается в неявном изменении значения переменной в процессе вычисления выражения. Все операции присваивания могут вызывать побочный эффект. Вызов функции, в которой изменяется значение какой-либо внешней переменной, либо путем явного присваивания, либо через указатель, также имеет побочный эффект.
Порядок вычисления выражения зависит от реализации компилятора, за исключением случаев, в которых явно гарантируется определенный порядок вычислений (см. раздел 4.5). При вычислении выражения в языке Си существуют так называемые контрольные точки. По достижении контрольной точки все предшествующие вычисления, в том числе все побочные эффекты, гарантированно произведены. Контрольными точками являются операция последовательного вычисления, условная операция, логические операции И и ИЛИ, вызов функции. Другие контрольные точки:
—конец полного выражения (т.е. выражения, которое не является частью другого выражения);
—конец инициализирующего выражения для переменной класса памяти auto;
—конец выражений, управляющих выполнением операторов if, switch, for, do, while и выражения в операторе return. Приведем примеры побочных эффектов:
Аргументы вызова функции add могут быть вычислены в любом порядке. Выражение i+1 может быть вычислено перед выражением i=j+2, или после него, с различным результатом в каждом случае.
Унарные операции инкремента и декремента также содержат в себе присваивание и могут быть причиной побочных эффектов, как это показано в следующем примере:
Неизвестно, какое значение будет присвоено элементу а[0] — нуль или единица, поскольку для операции присваивания порядок вычисления аргументов не оговаривается.
Читайте также
10. Трюки и эффекты
10. Трюки и эффекты На вопрос: «Какую операционную систему вы считаете самым сильным конкурентом Windows Vista?» представители Microsoft достаточно самоуверенно ответили: «Windows XP SP2».Каждая новая версия Windows создает ажиотаж во всех сферах информационных технологий. Техническая
Часть III. ЭФФЕКТЫ
Часть III. ЭФФЕКТЫ В этой части мы будем говорить об эффектах (они же стили). На первый взгляд кажется, что название новое, и мы с ним еще не встречались, но это не так. Достаточно вспомнить такие эффекты, как Bevel and Emboss (Фаска и рельеф) и Gradient Overlay (Наложение градиента). Но если
Специальные эффекты
Специальные эффекты Adobe InDesign также умеет создавать интересные и полезные эффекты, которые мы можем использовать при оформлении текста. По сути, здесь мы снова сталкиваемся с взаимопроникновением программ фирмы Adobe, поскольку данные эффекты «заимствованы» из программы
Оптические эффекты
Оптические эффекты Оптические эффекты выступают как часть процесса визуализации, позволяя повысить реалистичность трехмерных сцен. Доступ к группе оптических эффектов можно получить при помощи вкладки Effects (Эффекты) окна Environment and Effects (Окружающая среда и эффекты) (рис.
Визуальные эффекты
Глава 8 Эффекты
Глава 8 Эффекты Эффекты – это специальные средства, позволяющие преобразовать некоторые элементы изображения, они могут применяться в отношении отдельных элементов, а также в отношении слоев целиком. Эффекты дают возможность зрительно выделять контуры элемента,
Стили и эффекты
Стили и эффекты Этим возможности программы Excel по работе с графическими изображениями не ограничиваются. Вы можете придать рисунку особый стиль с помощью библиотеки готовых стилей и эффектов, а также изменить геометрическую форму рисунка.Сначала изменим геометрическую
Эффекты анимации
Эффекты анимации Если бы мы работали в Word или Publisher, то на этом, собственно, пришлось бы и остановиться – что можно сделать с неподвижной картинкой? Но слайду в PowerPoint совершенно нет нужды быть неподвижным! Напротив, ему это в корне противопоказано.Надписи, картинки и прочие
Эффекты изменений
Эффекты изменений Однажды вызванный запрос к триггеру или хранимой процедуре сохраняется в кэше метаданных, пока существуют клиентские соединения с базой данных, независимо от того, использует ли какой-нибудь клиент этот триггер или хранимую процедуру. Не существует
Неожиданные эффекты
Неожиданные эффекты SQL позволяет.одному и тому же получателю прав получать одни и те же полномочия из различных источников, даже если предоставляемые права уже есть у получателя. Каждый раз, когда один пользователь расширяет у другого пользователя права передавать
Звуковые эффекты
Введение в эффекты
Введение в эффекты В программе доступно более 40 специальных эффектов и преобразователей звука. Все эффекты можно разделить на группы.• Эффекты эха – создают эффекты, добавляющие эхо.• Эффекты высоты тона – создают эффекты звучания, основанные на изменении высоты
Звуковые эффекты
Звуковые эффекты В программе Studio также реализовано несколько звуковых эффектов, некоторые из которых могут оказаться весьма полезными. Для применения эффектов к выделенному аудиоклипу используется инструмент Добавление аудиоэффектов (последний в
7.4. Побочные электромагнитные излучения
7.4. Побочные электромагнитные излучения Говоря о многоуровневой защите, нельзя не упомянуть о таком явлении, как утечка информации посредством паразитного электромагнитного излучения.Представьте себе такую ситуацию: ваша компания оперирует с информацией закрытого
Простейшие эффекты
Простейшие эффекты Начнем мы с создания самых простых эффектов. Всего их два: клонирование выделенного экземпляра по ячейкам воображаемой сетки и его анимированное
Звуковые эффекты
Звуковые эффекты Звуковые эффекты добавляют звучанию особый колорит, а иногда меняют звук до неузнаваемости.Задержка сигналовК эффектам, основанным на задержке сигнала, относятся следующие:• дилэй (от англ. delay – задержка);• реверберация (от англ. reverberation –
Эффекты и чистые функции
Тезис Чёрча — Тьюринга означает (несколько упрощая), что любая компьютерная программа может быть представлена машиной Тьюринга или функцией λ-исчисления, то есть математической функцией. Конечно, это относится и к составляющим программу функциям и процедурам языков программирования.
Но что такое математическая функция?
В математике у функции, конечно, есть строгое определение, но нам сейчас оно будет не так полезно, как 3 её не менее строгих и обязательных свойства:
Оказывается, в применяемых повсеместно языках программирования «функции» — хотя я предпочитаю называть их процедурами — часто не удовлетворяют одному или нескольким из этих требований, возможно, всем сразу. Те редкие, что всё-таки удовлетворяют, называются чистыми функциями.
В мире чистого программирования нарушения этих свойств принято называть эффектами.
1. Эффект частичности
Если процедура частично определена, то есть не определена для каких-либо значений аргумента, она не возвращает значения для него, или, как говорят математики, не завершается. Погодите-ка! Если она не завершается, то что происходит?
В современных языках программирования процедура может «не завершаться» разными способами:
2. Эффекты недетерменированности (неопределённости)
2.1. Эффект нестабильности
Функция не всегда возвращает одинаковые значения для одного значения аргумента.
Пример: генератор случайных чисел.
2.2. Эффект множественности
Функция возвращает сразу много ответов.
Множественная функция может вернуть и пустое множество результатов, то есть эффект частичности можно рассматривать как частный случай эффекта множественности.
3. Побочный эффект
Любой результат функции, который можно наблюдать, кроме возвращённого значения.
Основные побочные эффекты — это ввод и вывод, то есть взаимодействие с пользователем, другими процессами, файлами, сетью и пр. Запись в ячейки памяти (как и на ленту) тоже считается побочным эффектом.
Примеры вы сами можете легко привести.
(Иногда говорят об идемпотентных побочных эффектах. Это, несомненно, меньшее зло, чем произвольные побочные эффекты.)
Заключение
Мы рассмотрели основные виды эффектов в математике и программировании.
Свойство чистой функции | Эффект |
---|---|
Тотальность | Частичность |
Детерминированность | Нестабильность, Множественность |
Нет побочных эффектов | Побочный |
В следующей статье мы увидим, какие средства управления эффектами есть в Haskell и других языках программирования и как же всё-таки выразить любую процедуру любого языка программирования математической функцией.
Чистые функции — JS: Функции
Функции в программировании обладают рядом важных характеристик. Зная их, мы можем точнее определять, как лучше разбивать код на функции и когда вообще их стоит выделять.
Детерминированность
Встроенная в JavaScript функция Math.random() возвращает случайное число от 0 до 1:
Функция нужная и полезная, но неудобная в отладке и тестировании. Это связано с тем, что для одних и тех же входных аргументов (отсутствие аргументов также попадает под это понятие), она может возвращать разные значения. Функции с таким поведением называются недетерминированными.
Например, недетерминированными являются функции, оперирующие системным временем. Так, функция Date.now() каждый раз возвращает новое значение:
Хотя прямо сейчас повторный запуск вернёт точно такое же значение, через год оно уже будет другим. То есть функция считается недетерминированной, если она ведёт себя так хотя бы единожды.
Детерминированные функции, напротив, ведут себя предсказуемо. Для одних и тех же входных данных они всегда выдают один и тот же результат. Именно такими являются функции в математике.
Функция становится недетерминированной и в том случае, если она обращается не только к своим аргументам, но и некоторым внешним данным, например глобальным переменным, переменным окружения и так далее. Так происходит потому, что внешние данные могут измениться, и функция начнёт выдавать другой результат, даже если в неё передаются одни и те же аргументы.
В общем случае нельзя сказать, что отсутствие детерминированности — абсолютное зло. Для работы многих программ и сайтов нужна функция, возвращающая случайное число или вычисляющая текущую дату. С другой стороны, в нашей власти разделить код так, чтобы в нем было как можно больше детерминированных частей. Общая рекомендация при работе с детерминированностью звучит следующим образом: если есть возможность написать функцию так, что она будет детерминированной, то так и делайте. Не используйте глобальных переменных, создавайте функции, зависящие только от своих собственных аргументов.
Понятие «Детерминированность» не ограничивается программированием или математикой. Сквозь него можно рассматривать практически любой процесс. Например, подбрасывание монетки — недетерминированный процесс, его результат случаен.
Побочные эффекты (side effects)
Вторая ключевая характеристика функций — наличие побочных эффектов. Побочными эффектами называют любые взаимодействия с внешней средой. К ним относятся файловые операции, такие как запись в файл, чтение файла, отправка или приём данных по сети и даже вывод в консоль.
Кроме того, побочными эффектами считаются изменения внешних переменных (например, глобальных) и входных параметров в случае, когда они передаются по ссылке.
А вот вычисления (логика), напротив, не содержат побочных эффектов. Например, функция, суммирующая два переданных аргументами числа.
Побочные эффекты составляют одну из самых больших сложностей при разработке. Их наличие значительно затрудняет логику кода и тестирование. Приводит к возникновению огромного числа ошибок. Только при работе с файлами количество возможных ошибок измеряется сотней: начиная с того, что закончилось место на диске, заканчивая попыткой читать данные из несуществующего файла. Для их предотвращения код обрастает большим числом проверок и защитных механизмов.
Без побочных эффектов невозможно написать ни одной полезной программы. Какие бы важные вычисления она ни делала, их результат должен быть как-то продемонстрирован. В самом простом случае его нужно вывести на экран, что автоматически приводит нас к побочным эффектам:
В реальных же приложениях, обычно, все сводится к взаимодействию с базой данных или отправкой запросов по сети.
Не существует способа избавиться от побочных эффектов совсем, но их влияние на программу можно минимизировать. Как правило, в типичной программе побочных эффектов не так много по отношению к остальному коду, и происходят они лишь в самом начале и в конце. Например, программа, которая конвертирует файл из текстового формата в PDF, в идеале выполняет ровно два побочных эффекта:
Между этими двумя пунктами и происходит основная работа, которая содержит чистую алгоритмическую часть. Побочные эффекты, в таком случае, будут находиться только в верхнем слое приложения, а ядро, выполняющее основную работу, останется чистым от них.
Инкремент и декремент — единственные базовые арифметические операции в JS, которые обладают побочными эффектами (изменяют само значение в переменной). Именно поэтому с ними сложно работать в составных выражениях. Они могут приводить к таким сложноотлавливаемым ошибкам, что во многих языках вообще отказались от их введения (в Ruby и Python их нет). В JS стандарты кодирования предписывают их не использовать.
Чистые функции
Идеальная функция с точки зрения удобства работы с ней называется чистой (pure). Чистая функция — это детерминированная функция, которая не производит побочных эффектов. Такая функция зависит только от своих входных аргументов и всегда ведёт себя предсказуемо.
Чистые функции обладают рядом ключевых достоинств:
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Побочный эффект (программирование)
доступ (чтение или запись) к объекту, определённому с модификатором volatile (англ.);
* изменение (запись) объекта;
изменение поведения инструкций процессора, обрабатывающих числа с плавающей точкой (см. floating-point environment (англ.));
вызов функции, выполняющей любое из перечисленных выше действий.Побочный эффект функции — возможность в процессе выполнения своих вычислений: читать и модифицировать значения глобальных переменных, осуществлять операции ввода-вывода, реагировать на исключительные ситуации, вызывать их обработчики. Если вызвать функцию с побочным эффектом дважды с одним и тем же набором значений входных аргументов, может случиться так, что в качестве результата будут возвращены разные значения. Такие функции называются недетерминированными функциями с побочными эффектами.
Связанные понятия
Упоминания в литературе
Связанные понятия (продолжение)
По одной из классификаций, языки программирования неформально делятся на сильно и слабо типизированные (англ. strongly and weakly typed), то есть обладающие сильной или слабой системой типов. Эти термины не являются однозначно трактуемыми, и чаще всего используются для указания на достоинства и недостатки конкретного языка. Существуют более конкретные понятия, которые и приводят к называнию тех или иных систем типов «сильными» или «слабыми».
В информатике и теории автоматов состояние цифровой логической схемы или компьютерной программы является техническим термином для всей хранимой информации, к которой схема или программа в данный момент времени имеет доступ. Вывод данных цифровой схемы или компьютерной программы в любой момент времени полностью определяется его текущими входными данными и его состоянием.
Сопрограммы (англ. coroutines) — методика связи программных модулей друг с другом по принципу кооперативной многозадачности: модуль приостанавливается в определённой точке, сохраняя полное состояние (включая стек вызовов и счётчик команд), и передаёт управление другому. Тот, в свою очередь, выполняет задачу и передаёт управление обратно, сохраняя свои стек и счётчик.
Из-за путаницы с терминологией словом «оператор» в программировании нередко обозначают операцию (англ. operator), см. Операция (программирование).Инстру́кция или опера́тор (англ. statement) — наименьшая автономная часть языка программирования; команда или набор команд. Программа обычно представляет собой последовательность инструкций.
В языках программирования объявле́ние (англ. declaration) включает в себя указание идентификатора, типа, а также других аспектов элементов языка, например, переменных и функций. Объявление используется, чтобы уведомить компилятор о существовании элемента; это весьма важно для многих языков (например, таких как Си), требующих объявления переменных перед их использованием.