In realtà rispondere a questo è piuttosto semplice, ma non breve.
What, if anything, should a modifier return? Should it not return an indicator of success/failure? Should it instead return nothing, but throw an exception upon failure?
Per prima cosa devi chiederti perché non devi restituire nulla dal comando (modificatore). Cosa ci guadagna?
C'è in realtà un vantaggio che vale la pena - possiamo eseguire quel comando in modo asincrono in uno sfondo, cioè mettere il comando che crea un nuovo post nella coda dei comandi, che è gestito da altri processi, magari scritto in un'altra lingua.
Con ciò puoi semplicemente mettere il comando in coda e restituire la risposta http non aspettando che la creazione del post avvenga, un grosso guadagno di prestazioni, giusto?
Non scambiare il valore restituito dal comando e restituire la risposta http. Devi fare quest'ultimo per informare il cliente che mettere il comando in coda ha avuto successo o meno, ma solo quello.
Aumentare l'eccezione dal comando equivale a restituire il valore, quindi non puoi farlo.
Ora è la domanda, come restituire l'id del post appena creato al client, perché vogliamo consentire all'utente di modificare immediatamente quel post.
Quindi, i comandi non hanno un valore di ritorno, ok. Ma hanno un risultato, un effetto.
Nell'esempio se call turnLightOn
comando non restituisce vero o falso per indicare che ha funzionato - è sciocco, ma possiamo vedere con i nostri occhi che le luci sono accese e che possiamo vedere di notte. Questo è un effetto del comando.
Come rappresentiamo l'effetto nella programmazione? Per gli eventi, naturalmente.
Il comando che ha acceso le luci, pubblica anche l'evento LightsTurnedOn
(passato) e il client è iscritto a quell'evento.
Tornando al nostro esempio di creazione post:
Profit.
Should constructors be treated as modifiers (is the creation of an object a side-effect)? I suspect not, since a constructor that created an object but didn't return a reference to it would be pretty annoying.
L'effetto collaterale è tutto ciò che non è referenziale trasparente .
Significa che se il tuo costruttore non fa nient'altro, ma restituisce solo il riferimento all'oggetto appena creato, allora non ci sono effetti collaterali.
Ma se quel costruttore usa valori globali (ottieni o imposta, non importa) per creare quell'oggetto, allora non è referenziale trasparente e ha un effetto collaterale. Perché?
import config
class Foo:
self.bar = config.BAZ
foo1 = Foo()
config.BAZ = 'something different'
foo2 = Foo()
foo1 != foo2