La cosa più importante da ricordare è che quelle sono linee guida, non regole.
Ci sono casi in cui un metodo semplicemente deve prendere un argomento. Pensa al metodo +
per i numeri, ad esempio. Oppure il metodo add
per una raccolta.
In effetti, si potrebbe persino obiettare che ciò che significa aggiungere due numeri dipende dal contesto, ad es. 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 invece di un metodo su numeri che accettano 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, prendendo due oggetti come argomenti, quindi 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 più semplice il metodo : forse, se il metodo richiede molti 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: anziché due coordinate, passa un oggetto
Point
, oppure invece di passare il nome utente e l'e-mail, passa un oggetto IdCard
.)
-
Stato oggetto : se l'argomento è necessario con più metodi, forse dovrebbe essere parte dello stato dell'oggetto. Se è necessario solo da alcuni dei metodi ma non da altri, forse l'oggetto sta facendo troppo e dovrebbe essere davvero due oggetti.
One way is to extract the arguments into a new class, but that would surely lead to an explosion of classes?
Se il tuo modello di dominio ha molti diversi tipi di cose, allora il tuo codice finirà con molti diversi tipi di oggetti. Non c'è niente di sbagliato in questo.
And those classes are likely to end up with names that violate some of the naming rules (ending with "Data" or "Info" etc)?
Se non riesci a trovare un nome appropriato, forse hai raggruppato troppi argomenti insieme o troppo pochi. Quindi, hai solo un frammento di una classe o hai più di una classe.
Another technique is to make variables used by multiple functions a private member variable to avoid passing them, but that expands the scope of the variable, possibly such that it's open to functions that don't actually need it.
Se hai un gruppo di metodi che operano tutti sugli stessi argomenti e un altro gruppo di metodi che non lo fanno, forse appartengono a classi diverse.
Nota quante volte ho usato la parola "forse"? Ecco perché quelle sono linee guida, non regole. Forse il tuo metodo con 4 parametri è perfettamente adatto!