A volte (raramente), sembra che creare una funzione che accetta una discreta quantità di parametri sia la strada migliore.
L'uso di più parametri è spesso un chiaro indicatore della violazione dell'SRP in questo metodo. È improbabile che un metodo, che richiede molti parametri, faccia solo una cosa. L'esclusione può essere una funzione matematica o un metodo di configurazione, in cui sono effettivamente necessari diversi parametri in quanto tali. Eviterei più parametri poiché il diavolo evita l'acqua santa. Più parametri si utilizzano all'interno di un metodo, maggiore è la possibilità che il metodo sia (troppo) complesso; più complessità significa: più difficile da mantenere e meno desiderabile.
Tuttavia, quando lo faccio, mi sento come se stessi spesso scegliendo l'ordine dei parametri a caso. Di solito vado per "ordine di importanza", prima con il parametro più importante.
In linea di principio stai scegliendo a caso . Naturalmente potresti pensare che il parametro A sia più rilevante del parametro B ; ma potrebbe non essere il caso degli utenti della tua API, che pensano che B sia il parametro più rilevante. Quindi, anche se sei stato attento nella scelta dell'ordine, per altri potrebbe sembrare casuale .
C'è un modo migliore per farlo? Esiste un modo "best practice" per ordinare i parametri che migliora la chiarezza?
Esistono diversi modi:
a) Il caso banale: non utilizzare più di un parametro.
b) Dato che non hai specificato quale lingua hai scelto, c'è la possibilità che tu abbia scelto una lingua con parametri nominati . Questo è un bel zucchero sintattico che ti permette di allentare il significato dell'ordine dei parametri:fn(name:"John Doe", age:36)
Non tutte le lingue consentono tali prelibatezze. E allora?
c) È possibile utilizzare un dizionario / Hashmap / matrice associativa come parametro: ad es. Javascript consentirebbe quanto segue: fn({"name":"John Doe", age:36})
che non è lontano da (b).
d) Naturalmente se lavori con un linguaggio tipicamente statico come Java. potresti usare una hashmap , ma perderai le informazioni sui tipi (ad es. quando lavori con HashMap<String, Object>
) quando i parametri hanno tipi diversi (e devi lanciarli).
Il prossimo passo logico sarebbe passare un Object
(se stai usando Java) con proprietà appropriate o qualcosa di più leggero come uno struct (se scrivi ad esempio C # o C / C ++).
Regola del pollice:
1) Il caso migliore: il tuo metodo non ha bisogno di alcun parametro
2) Buon caso - il tuo metodo ha bisogno di un parametro
3) Caso tollerabile: il metodo richiede due parametri
4) Tutti gli altri casi devono essere sottoposti a refactoring
MessageBox.Show
. Guarda anche in quello.