La cosa più importante da ricordare è che si tratta di linee guida, non di regole.
Ci sono casi in cui un metodo deve semplicemente prendere un argomento. Pensa al +
metodo per i numeri, ad esempio. O il add
metodo per una raccolta.
In effetti, si potrebbe anche sostenere che ciò che significa aggiungere due numeri dipende dal contesto, ad esempio in ℤ 3 + 3 == 6
, ma in ℤ | 5 3 + 3 == 2
, quindi l'operatore di addizione dovrebbe essere un metodo su un oggetto di contesto che accetta due argomenti anziché un metodo sui numeri che accetta un argomento.
Allo stesso modo, un metodo per confrontare due oggetti deve essere un metodo di un oggetto che prende l'altro come argomento, o un metodo del contesto, che prende due oggetti come argomenti, quindi semplicemente non ha senso avere un metodo di confronto con meno di un argomento.
Detto questo, ci sono un paio di cose che possono essere fatte per ridurre il numero di argomenti per un metodo:
- Rendi il metodo stesso più piccolo : forse, se il metodo ha bisogno di tanti argomenti, sta facendo troppo?
- Un'astrazione mancante : se gli argomenti sono strettamente correlati, forse appartengono insieme e c'è un'astrazione che ti manca? (Esempio di libro di testo canonico: invece di due coordinate, passa un
Point
oggetto o invece di passare nome utente ed e-mail, passa un IdCard
oggetto.)
- Stato dell'oggetto : se l'argomento è necessario per più metodi, forse dovrebbe far parte dello stato dell'oggetto. Se è necessario solo con alcuni dei metodi ma non con altri, forse l'oggetto sta facendo troppo e dovrebbe essere davvero due oggetti.
Un modo è quello di estrarre gli argomenti in una nuova classe, ma ciò porterebbe sicuramente a un'esplosione di classi?
Se il tuo modello di dominio ha molti tipi diversi di cose, il tuo codice finirà con molti tipi diversi di oggetti. Non c'è niente di sbagliato in questo.
E quelle classi probabilmente finiranno con nomi che violano alcune delle regole di denominazione (che terminano con "Dati" o "Informazioni" ecc.)?
Se non riesci a trovare un nome proprio, forse hai raggruppato troppi argomenti insieme o troppo pochi. Quindi, o hai solo un frammento di una classe o hai più di una classe.
Un'altra tecnica consiste nel rendere variabili utilizzate da più funzioni una variabile membro privata per evitare di passarle, ma ciò espande l'ambito della variabile, possibilmente in modo tale che sia aperto a funzioni che non ne hanno realmente bisogno.
Se hai un gruppo di metodi che funzionano tutti con gli stessi argomenti e un altro gruppo di metodi che non lo fanno, forse appartengono a classi diverse.
Nota quanto spesso ho usato la parola "forse"? Ecco perché quelle sono linee guida, non regole. Forse il tuo metodo con 4 parametri va benissimo!