Funzione che richiede molti parametri

5

Ho un problema relativo a questo:

Ci sono linee guida su come molti parametri che una funzione dovrebbe accettare?

Nel mio caso, ho una funzione che descrive un rettangolo arrotondato. Il chiamante specifica

  • Un numero intero che determina come unire il rettangolo nelle forme precedentemente create
  • An Anchor, che è un punto utilizzato per l'allineamento (a destra, a sinistra, in alto, in basso ecc.). (0, -1) significa che la posizione (parametro successivo) descrive il punto medio superiore del rettangolo.
  • La posizione del rettangolo
  • Larghezza e altezza
  • Raggio dell'angolo

Dovrei usare il modello Oggetto Parametro in questo caso? È difficile vedere come questi parametri sono correlati

    
posta user877329 12.09.2012 - 17:29
fonte

2 risposte

8

Preferisco mantenere il numero di argomenti di funzione a quattro o meno.

Sembra che la funzione "unisca" un rettangolo arrotondato in un certo ambiente. La prima cosa che viene in mente è separare l'attività in due parti: definire il rettangolo e quindi unirlo.

rr = roundedRectangle(width, height, cornerRadius)
environment.merge(rr, how, alignment, where)

Se l'angoloRadius ha un valore predefinito conveniente (ad esempio zero), puoi passare a:

rr = roundedRectangle(width, height).setCornerRadius(r)

Se il numero di opzioni da unire aumenta, puoi creare un oggetto parametro per quelle:

mm = mergeMethod(position).setAlignment(topCenter).setBehavior(...)
env.merge(rr, mm)

Ciò consente un'estensione naturale ad altre forme. Sarebbe una cattiva pratica ripetere l'elenco di argomenti mergeMethod una volta per ogni forma che potrebbe essere creata.

=== Addendum di Dan ===

Quando si suddividono le azioni in questo modo, è importante evitare di introdurre dipendenze indesiderate degli ordini. Eventuali valori non specificati quando viene creata un'istanza dovrebbero avere valori predefiniti utili. Se rimuovi l'argomento cornerRadius dal costruttore roundedRectangle , devi impostare un valore predefinito utile. Deve essere ragionevole scrivere rr = roundedRectangle(width, height) o rr = roundedRectangle(width, height).setCornerRadius(...) .

    
risposta data 12.09.2012 - 17:47
fonte
7

Non tutti i parametri sono correlati, ma alcuni sottoinsiemi sono. Potresti avere 3 parametri:

  • Unisci comportamento
  • Posizione (posizione base e punto di ancoraggio)
  • Descrizione del rettangolo (altezza, larghezza, raggio dell'angolo)

Oppure potrebbe avere più senso che il punto di ancoraggio sia parte della descrizione del rettangolo.

    
risposta data 12.09.2012 - 17:40
fonte

Leggi altre domande sui tag