Когда именно тот или иной метод имеет побочные эффекты?

StackOverflow https://stackoverflow.com/questions/810289

Вопрос

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

Это было полезно?

Решение

Ваш инструктор ошибается.Приносим извинения редакторам SO за то, что они не вставили сюда всю статью целиком, вот что должна сказать Википедия:

http://en.wikipedia.org/wiki/Side_effect_ (компьютерная наука)

Денежная цитата №1:

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

Денежная цитата №2:

При наличии побочных эффектов поведение программы зависит от прошлой истории;то есть порядок оценки имеет значение.

Установщики, отличные от NOP, всегда удовлетворяют этим критериям.

Другие советы

Геттеры и сеттеры - это просто синтаксический сахар для методов get_ и set_.Они могут абсолютно имеют побочные эффекты (хотя, вероятно, это плохая идея - начинать настраивать множество полей, когда все, чего хотел вызывающий, - это увеличить счетчик или что-то в этом роде).

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

Когда имеешь дело с реальными языками мира, такими как c ++, c # или java, то даже функция nop имеет реальные побочные эффекты, которые могут привести к выполнению кода!

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

Пример на языке Си#:

class NotSoObvious
{
    static NotSoObvious()
    {
        CauseSomeSideEffects();
    }

    // calling this can cause the constructor to run first!
    public static void DoNothing()
    {
        return;
    }
}

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

Метод без вызовов к нему, безусловно, имеет побочный эффект для программы, которая выводит количество методов внутри!

Все это сводится к следующему:Если вы хотите узнать о реальных побочных эффектах метода, вам сначала нужно определить, что вы вообще считаете "побочным эффектом".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top