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

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


person Kim Stebel    schedule 01.05.2009    source источник


Ответы (3)


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

http://en.wikipedia.org/wiki/Side_effect_%28computer_science%29

Цитата о деньгах №1:

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

Цитата о деньгах № 2:

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

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

person runako    schedule 01.05.2009

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

person bsneeze    schedule 01.05.2009

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

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

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

Пример на С#:

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

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

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

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

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

person Riki    schedule 11.05.2014