Domanda

Come ho sempre capito, qualsiasi modifica allo stato dei programmi (o qualsiasi cosa abbia a che fare con IO) è un effetto collaterale. Non importa se la modifica si verifica in una variabile globale o in un campo privato dell'oggetto su cui viene chiamato il metodo. Ne consegue che tutti i metodi che non restituiscono nulla non fanno nulla o hanno effetti collaterali.
La mia confusione viene da uno degli istruttori della nostra università (che è ancora uno studente e quindi non ancora onnisciente;)) che mi dice setter non ha effetti collaterali.

È stato utile?

Soluzione

Il tuo istruttore si sbaglia. Ci scusiamo con gli editori SO per non aver incollato l'intero articolo qui, questo è ciò che Wikipedia ha da dire:

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

Preventivo denaro n. 1:

  

In informatica, si dice che una funzione o espressione abbia un effetto collaterale se, oltre a produrre un valore, modifica anche qualche stato o ha un'interazione osservabile con le funzioni di chiamata o il mondo esterno.

Preventivo # 2 sul denaro:

  

In presenza di effetti collaterali, il comportamento di un programma dipende dalla storia passata; vale a dire, l'ordine di valutazione è importante.

I setter non NOP soddisfano sempre tali criteri.

Altri suggerimenti

Getter e setter sono solo zucchero sintattico per i metodi get_ e set_. Possono assolutamente avere effetti collaterali (anche se probabilmente è una cattiva idea iniziare a modificare molti campi quando tutto il chiamante voleva aumentare un contatore o qualcosa del genere).

Prima di tutto: sono a conoscenza del tag agnostico della lingua! " runako " ha risposto correttamente alla domanda. Ma spesso vuoi applicare le tue conoscenze al mondo reale, quindi penso che sarebbe bello fornire anche una risposta che affronti questo problema in un modo più pragmatico.

Quando si ha a che fare con lingue del mondo reale come c ++, c # o java, anche una funzione nop ha effetti collaterali reali che possono causare l'esecuzione del codice!

Basti pensare ai costruttori statici. Anche se le specifiche non specificano sempre l'ora in cui un costruttore statico viene eseguito per una classe, il più delle volte sarà il momento in cui si accede per la prima volta a un metodo oa un membro della classe.

Esempio in C #:

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

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

Inoltre, anche un metodo che non viene chiamato affatto può causare effetti collaterali! Pensa alla riflessione (la capacità di un programma di interrogare informazioni sulla propria struttura). Quando un metodo è presente ma non viene chiamato, può ancora essere rilevato dalla riflessione.

Un metodo senza chiamate ha sicuramente un effetto collaterale su un programma che genera il numero di metodi all'interno!

Tutto si riduce a questo: se vuoi conoscere gli effetti collaterali reali di un metodo, devi prima determinare quello che consideri persino un "effetto collaterale".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top