Sometimes (rarely), it seems that creating a function that takes a decent amount of parameters is the best route.
L'uso di diversi parametri è spesso un chiaro indicatore, che violi il SRP in questo metodo. È improbabile che un metodo, che richiede molti parametri, faccia solo una cosa. L'escpetion può essere una funzione matematica o un metodo di configurazione, dove infatti diversi parametri sono necessari. Eviterei più parametri poiché il diavolo evita l'acqua santa. Più parametri usi in un metodo, maggiore è la possibilità che il metodo sia (troppo) complesso; più complessità significa: più difficile da mantenere e meno desiderabile.
However, when I do, I feel like I'm often choosing the ordering of the parameters at random. I usually go by "order of importance", with the most important parameter first.
In principio si sceglie a caso . Ovviamente si potrebbe pensare che il parametro A sia più rilevante del parametro B ; ma questo potrebbe non essere il caso per gli utenti della tua API, che pensano che B sia il parametro più rilevante. Quindi, anche se tu fossi attento nella scelta dell'ordine, per gli altri potrebbe sembrare random .
Is there a better way to do this? Is there a "best practice" way of ordering parameters that enhances clarity?
Ci sono diversi modi per uscire:
a) Il caso banale: non utilizzare più di un parametro.
b) Come non hai specificato, quale lingua hai scelto, c'è la possibilità che tu abbia scelto una lingua con named parameters .
Questo è zucchero sintattico che ti consente di ridurre il significato dell'ordine dei parametri: fn(name:"John Doe", age:36)
Non tutte le lingue consentono tali sottigliezze. Allora, allora?
c) Potresti usare un dizionario / Hashmap / Array associativo come parametro:
per esempio. Javascript consentirebbe quanto segue: fn({"name":"John Doe", age:36})
che non è molto lontano da (b).
d) Naturalmente se lavori con un linguaggio tipizzato staticamente come Java. potresti usare un Hashmap , ma potresti perdere informazioni sul tipo (ad esempio quando lavori con HashMap<String, Object>
) quando i parametri hanno tipi diversi (e devono essere lanciati).
Il prossimo passo logico sarebbe passare un Object
(se si sta usando Java) con proprietà appropriate o qualcosa di più leggero come una struct (se si scrive ad esempio C # o C / C ++) .
Regola generale:
1) Best case: il tuo metodo ha bisogno del parametro no
2) Buon caso: il tuo metodo ha bisogno di un parametro
3) Caso tollerabile: il tuo metodo richiede due parametri
4) Tutti gli altri casi devono essere refactored