В информатике функция или выражение, как говорят, имеют побочный эффект, если они изменяют некоторое состояние или имеют наблюдаемое взаимодействие с вызывающими функциями или внешним миром.
Из Википедии - Побочный эффект
Функция, в математическом смысле, является отображением ввода-вывода. Предполагаемый эффект вызова функции - сопоставить входные данные с выходными данными, которые она возвращает. Если функция делает что-то еще, не имеет значения, что, но если у нее есть какое-либо поведение, которое не отображает входные данные на выход, это поведение, как известно, является побочным эффектом.
В более общем смысле, побочным эффектом является любой эффект, который не является предполагаемым эффектом дизайнера конструкции.
Эффект - это все, что влияет на актера. Если я вызываю функцию, которая отправляет моей девушке текстовое сообщение о разрыве, которое затрагивает группу актеров, меня, ее, сеть компании сотовой связи и т. Д. Единственный предполагаемый эффект вызова функции, свободной от побочных эффектов, - это функция вернуть мне отображение из моего ввода. Таким образом, для:
public void SendBreakupTextMessage() {
Messaging.send("I'm breaking up with you!")
}
Если это предназначено для функции, то единственное, что нужно сделать, это вернуть void. Если он не имеет побочных эффектов, он не должен отправлять текстовое сообщение.
В большинстве языков программирования нет конструкции для математической функции. Ни одна конструкция не предназначена для использования в качестве таковой. Вот почему большинство языков говорят, что у вас есть методы или процедуры. По замыслу, они предназначены для того, чтобы иметь возможность делать гораздо больше эффектов. На обычном языке программирования никто не заботится о том, каким был метод или процедура, поэтому, когда кто-то говорит, что эта функция имеет побочный эффект, они фактически подразумевают, что эта конструкция не ведет себя как математическая функция. И когда кто-то говорит, что эта функция не имеет побочных эффектов, они подразумевают, что эта конструкция эффективно ведет себя как математическая функция.
Чистая функция всегда свободна от побочных эффектов по определению. Чистая функция, это способ сказать, что эта функция, даже несмотря на то, что она использует конструкцию, которая допускает большее количество эффектов, имеет эффект, равный эффекту математической функции.
Я призываю любого сказать мне, когда функция без побочных эффектов не будет чистой. Если основной предполагаемый эффект контекста предложения, использующего термин чистый и свободный побочный эффект, не является эффектом математического предполагаемого эффекта функции, то они всегда равны.
Таким образом, иногда, хотя и реже, и я полагаю, что это различие отсутствует, а также вводит в заблуждение людей (поскольку это не самое распространенное предположение) в принятом ответе, но иногда предполагается, что предполагаемый эффект функции программирования сопоставить ввод с выводом, где ввод не ограничен явными параметрами функции, но вывод ограничен явным возвращаемым значением. Если вы предполагаете, что это предполагаемый эффект, то функция, считывающая файл и возвращающая другой результат в зависимости от того, что находится в файле, по-прежнему не имеет побочных эффектов, так как вы позволили входным данным поступать из других мест в вашем предполагаемом эффекте.
Итак, почему это все важно?
Это все о контроле и сохранении. Если вы вызываете функцию, и она делает что-то еще, а затем возвращает значение, трудно понять ее поведение. Вам нужно будет заглянуть внутрь функции для реального кода, чтобы угадать, что он делает, и подтвердить его правильность. Идеальная ситуация заключается в том, что очень ясно и легко узнать, какой ввод использует функция, и что она больше ничего не делает, затем возвращает вывод для нее. Вы можете немного расслабиться и сказать, что точно знать, какой ввод он использует, не так полезно, как быть уверенным, что он не делает ничего другого, о чем вы можете не знать, а затем вернуть значение, так что, возможно, вы удовлетворены только принудительным применением что он не делает ничего другого, кроме отображения входных данных, независимо от того, откуда он их получает, для вывода.
Практически во всех случаях смысл программы состоит в том, чтобы иметь эффекты, отличные от сопоставления вещей, входящих в исходящие вещи. Идея управления побочным эффектом заключается в том, что вы можете организовать код так, чтобы его было легче понять и обдумать. Если вы соберете все побочные эффекты вместе, в месте, которое является очень явным и центральным, легко узнать, где искать и верить, что это все, что происходит, не более. Если у вас также очень явный ввод, это помогает проверить поведение для другого ввода, и его проще использовать, так как вам не нужно менять ввод во многих разных местах, некоторые из которых могут быть неочевидными, просто чтобы получить то, что вы хотите.
Поскольку наиболее полезным для понимания, обоснования и управления поведением программы является то, чтобы все входные данные были четко сгруппированы вместе и явными, а также чтобы все побочные эффекты были сгруппированы вместе и явными, об этом обычно говорят люди, когда говорят побочный эффект, чистый и т. д.
Поскольку наиболее полезным является группировка побочных эффектов и их явность, иногда люди будут только подразумевать это и различать это, говоря, что это не чисто, но все же «побочный эффект» свободен. Но побочный эффект относится к предполагаемому «предполагаемому первичному эффекту», поэтому это контекстуальный термин. Я считаю, что это используется реже, хотя на удивление много говорится в этой теме.
Наконец, идемпотент означает, что вызов этой функции много раз с одними и теми же входами (независимо от того, откуда они берутся) всегда будет приводить к одинаковым эффектам (побочный эффект или нет).