"Il numero ideale di argomenti per una funzione è zero" è chiaramente sbagliato. Il numero ideale di argomenti è esattamente il numero necessario per consentire alla funzione di essere libera da effetti collaterali. Meno di questo e causi inutilmente che le tue funzioni siano impure, costringendoti così ad allontanarti dalla fossa del successo e ad arrampicarti sul gradiente del dolore. A volte "Zio Bob" è perfetto con il suo consiglio. A volte ha torto spettacolare. Il suo consiglio a zero argomenti è un esempio di quest'ultimo
( Fonte: commento di @ David Arno su un'altra domanda su questo sito )
Il commento ha ottenuto una quantità spettacolare di 133 voti positivi, motivo per cui mi piacerebbe prestare maggiore attenzione al suo merito.
Per quanto ne so, ci sono due modi separati nella programmazione: pura programmazione funzionale (ciò che questo commento è incoraggiante) e dire, non chiedere (che di tanto in tanto viene raccomandato anche su questo sito Web). AFAIK questi due principi sono fondamentalmente incompatibili, vicini all'opposto dell'altro: il puro funzionale può essere sintetizzato come "solo valori di ritorno, non ha effetti collaterali" mentre dire, non chiedere può essere riassunto come "non restituire nulla, hanno solo effetti collaterali ". Inoltre, sono un po 'perplesso perché pensavo che dire, non chiedere era considerato il nucleo del paradigma OO mentre le funzioni pure erano considerate il nucleo del paradigma funzionale - ora vedo le funzioni pure raccomandate in OO!
Suppongo che gli sviluppatori dovrebbero probabilmente scegliere uno di questi paradigmi e attenersi ad esso? Beh, devo ammettere che non avrei mai potuto nemmeno seguirmi. Spesso mi sembra conveniente restituire un valore e non riesco davvero a vedere come posso ottenere ciò che voglio ottenere solo con effetti collaterali. Spesso mi sembra conveniente avere effetti collaterali e non riesco davvero a vedere come posso ottenere ciò che voglio ottenere solo restituendo valori. Inoltre, spesso (suppongo sia orribile) ho metodi che fanno entrambi.
Tuttavia, da questi 133 giudizi sto ragionando sul fatto che attualmente la pura programmazione funzionale sta "vincendo" in quanto diventa un consenso che è superiore dire, non chiedere. È corretto?
Pertanto, sull'esempio di questo gioco pieno di antipasti che sto cercando di realizzare : se volessi renderlo conforme al puro paradigma funzionale - COME ?!
Mi sembra ragionevole avere uno stato di battaglia. Dato che si tratta di un gioco a turni, tengo gli stati di battaglia in un dizionario (multiplayer - potrebbero esserci molte battaglie giocate da molti giocatori contemporaneamente). Ogni volta che un giocatore fa il suo turno, chiamo un metodo appropriato sullo stato di battaglia che (a) modifica lo stato di conseguenza e (b) restituisce gli aggiornamenti ai giocatori, che vengono serializzati in JSON e sostanzialmente dicono loro cosa è appena successo sul tavola. Questo, suppongo, è in una flagrante violazione di ENTRAMBI i principi e allo stesso tempo.
OK - Potrei fare in modo che un metodo RITORNA sia uno stato di battaglia invece di modificarlo se volessi davvero. Ma! Dovrò quindi copiare inutilmente tutto nello stato di battaglia solo per restituire uno stato completamente nuovo invece di modificarlo sul posto?
Ora forse se la mossa è un attacco potrei semplicemente restituire un personaggio aggiornato HP? Il problema è che non è così semplice: le regole del gioco, una mossa possono e spesso avranno molti più effetti rispetto alla semplice rimozione di una parte degli HP di un giocatore. Ad esempio, può aumentare la distanza tra i personaggi, applicare effetti speciali, ecc.
Mi sembra molto più semplice modificare lo stato in atto e restituire gli aggiornamenti ...
Ma come potrebbe affrontare un ingegnere esperto?