Когда именно метод имеет побочные эффекты? - PullRequest
7 голосов
/ 01 мая 2009

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

Ответы [ 3 ]

6 голосов
/ 01 мая 2009

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

http://en.wikipedia.org/wiki/Side_effect_(computer_science)

Цитата денег № 1:

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

Цитата денег # 2:

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

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

0 голосов
/ 12 мая 2014

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

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

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

Пример на C #:

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

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

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

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

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

0 голосов
/ 01 мая 2009

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

...