Pergunta

Como eu sempre entendi, qualquer mudança para o estado de programas (ou nada a ver com IO) é um efeito colateral. Não importa, se a mudança ocorre em uma variável global ou em um campo particular do objeto o método é chamado. Segue-se que todos os métodos que não retornam nada quer fazer nada ou têm um efeito colateral
Minha confusão vem de um dos instrutores da nossa universidade (que ainda é um estudante e, portanto, ainda não onisciente;).) Me dizendo setters não tem efeitos colaterais.

Foi útil?

Solução

Seu instrutor está enganado. Com desculpas aos editores Assim, para não colar o artigo completo aqui, isso é o que Wikipedia tem a dizer:

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

Dinheiro Citar # 1:

Em ciência da computação, uma função ou expressão é dito ter um efeito colateral se, além de produzir um valor, ele também modifica algum estado ou tem uma interação observável com a chamada funções ou o mundo exterior.

Dinheiro Citar # 2:

Na presença de efeitos colaterais, o comportamento de um programa depende da história passada; isto é, a ordem das questões de avaliação.

Não-NOP Setters sempre satisfazer esse critério.

Outras dicas

Getters e setters são apenas açúcar sintático para get_ e métodos set_. Eles podem absolutamente ter efeitos secundários (embora provavelmente é uma má idéia para começar a ajustar muitos campos quando tudo o chamador queria era incrementar um contador ou algo assim).

Primeiro de tudo: Estou ciente da tag agnóstico idioma "runako" respondeu a pergunta com toda a razão. Mas muitas vezes você deseja aplicar o seu conhecimento para o mundo real, então eu acho que seria bom também para fornecer uma resposta que aborda este problema de uma forma mais pragmática.

Ao lidar com as línguas do mundo real, como C ++, C # ou Java, em seguida, até mesmo uma função nop tem efeitos colaterais reais que podem causar código a ser executado!

Basta pensar estáticos-construtores. Mesmo que as especificações nem sempre especificar o tempo de um construtor estático é correu para uma classe, na maioria das vezes ele vai ser o ponto no tempo em que um método ou membro da classe é acessada pela primeira vez.

Exemplo em C #:

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

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

O que é mais é que mesmo um método que não está sendo chamado em tudo pode causar efeitos secundários! Pense de reflexão (a capacidade de um programa para consulta informações sobre sua própria estrutura). Quando um método está presente, mas não sendo chamado ele ainda pode ser detectado por reflexão.

Um método sem chamadas para ele certamente tem um efeito colateral em um programa que saídas o número de métodos dentro!

Tudo se resume a isto:. Se você quer saber sobre os efeitos colaterais reais de um método, primeiro você tem que determinar o que você mesmo considerar ser um "efeito colateral"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top