2008-11-25 22 views
7

Eventuali duplicati:
How many parameters are too many?Quanti parametri di funzione sono troppi?

stavo solo scrivere una funzione che ha avuto in diversi valori e mi ha fatto pensare. Quando il numero di argomenti di una funzione/metodo è troppi? Quando (se) segnala un design difettoso? Progettare/rifattorizzare la funzione in modo da includere strutture, matrici, puntatori, ecc. Per ridurre la quantità di argomenti? Rifattori i dati che arrivano solo per diminuire il numero di argomenti? Sembra che questo potrebbe essere un po 'meno applicabile nei progetti OOP, però. Solo curioso di vedere come gli altri vedono il problema.

MODIFICA: Per riferimento, la funzione appena scritta ha preso 5 parametri. Uso la definizione di diversi che mi ha dato la mia insegnante di AP Econ. Più di 2; meno di 7.

+0

Boy cosa spero lui ha detto "meno di 7" –

risposta

-1

Direi massimo 4. Qualunque cosa sopra, penso che dovrebbe essere collocato all'interno di una classe.

+0

cosa se è per un costruttore classi che ha 20 proprietà? – Blankman

+0

La proprietà non accetta parametri ... –

15

Secondo Steve McConnell in codice completo, si dovrebbe

limitare il numero di parametri di una routine per circa sette

+0

Grande fan di quel libro – Uri

+0

Sette sembra essere un numero che non dovrebbe essere superato in alcun tipo di interfaccia, parametri o menuentri. – Jonke

+0

Sette è la quantità di informazioni che è possibile memorizzare nella memoria a breve termine.Almeno questo è quello che mi hanno detto, ma ho dimenticato i dettagli. –

16

Non lo so, ma so che quando Lo vedo.

+0

Spiacente, nessun voto rimasto. Ma questo è solo –

+1

Quindi i parametri di funzione sono come la pornografia? –

+0

Ok, questo è un cambio di argomento interessante. Dà un significato completamente diverso al termine software ... –

1

Risposta rapida: quando devi fermarti a fare questa domanda, ne hai troppi.

Personalmente mi piace mantenere il numero sotto i sei. Se è necessario altro, la soluzione dipende dal problema. Un approccio consiste nell'usare le funzioni "setter" per assegnare i valori a un oggetto che alla fine eseguirà la funzione desiderata. Un'altra opzione è usare una struct, come hai detto. Ad ogni modo, non puoi davvero sbagliare.

+0

Credo che questo sia a.k.a il modello di comando. – moffdub

1

Beh, sicuramente dipenderebbe da cosa sta facendo la tua funzione, per quanto molti sarebbero considerati "troppi". Detto questo, è certamente possibile avere una funzione con molti parametri diversi che sono opzioni su come gestire certi casi all'interno della funzione, e avere sovraccarichi per quelle funzioni con valori predefiniti per quelle opzioni.

Con la pervasività di Intellisense (o equivalente in altri IDE) e le descrizioni dei comandi che mostrano i commenti della Documentazione XML in Visual Studio, non penso davvero che ci sia una risposta decisa a questa domanda.

1

Troppo parametro è un "odore di codice".

È possibile suddividere in più metodi o utilizzare la classe per raggruppare le variabili che hanno qualcosa in comune.

Inserire un numero per "Troppo" è qualcosa di molto soggettivo e dipende dalla tua organizzazione e dalla lingua che usi. Una regola empirica è che se non puoi leggere la firma del tuo metodo e avere un'idea di quello che sta facendo di quanto tu possa avere troppe informazioni. Personnaly, cerco di non superare i 5 parametri.

+1

Qualsiasi motivo per cui preferisci usare la classe per raggruppare le variabili? Pensavo che una struttura sarebbe stata più sensata qui. – RWendi

+0

Non tutte le lingue distinguono tra classi e strutture. –

4

Generalmente ritengo che se i parametri sono correlati dal punto di vista funzionale (ad es. Coordinate o componenti di colore), dovrebbero essere incapsulati come classe per buone misure.

Non che io seguo sempre io stesso;)

0

Per me è 5.

E 'difficile da gestire (ricordare il nome, ordine, ecc) oltre. Inoltre se arrivo così lontano ho versioni con valori predefiniti che chiamano questo.

0

Dipende anche dalla funzione, se la vostra funzione richiede un intervento o variabili pesanti da parte dell'utente, non andrei oltre il range 7-8. Per quanto riguarda il numero medio di parametri, 5-6 è il punto debole a mio avviso. Se si utilizza più di questo, si potrebbe voler considerare gli oggetti di classe come parametri o altre funzioni più piccole.

0

Varia da persona a persona. Personalmente, quando ho difficoltà a capire immediatamente che cosa sta facendo una chiamata di funzione leggendo l'invocazione nel codice, è tempo di un refactoring per togliere la tensione dalle mie celle grigie.

7

Se devi chiedere, probabilmente sono troppi.

0

Ho sentito anche quel 7, ma in qualche modo sento che proviene da un tempo in cui tutto quello che potevi passare dove valori primitivi.

Oggigiorno è possibile passare un riferimento a un oggetto che incapsula uno stato (e un comportamento) complesso. Usare 7 di questi sarebbe decisamente troppo.

Il mio obiettivo personale è quello di evitare l'uso di più di 4.

0

Dipende fortemente dal tipo di argomenti. Se sono tutti interi, 2 possono essere troppi. (come ricordo quale ordine?) Se qualsiasi argomento accetta null, allora il numero diminuisce drasticamente.

La vera risposta viene da chiederti:

  • Quanto è facile da capire le chiamate quando sto leggendo il codice?
  • quanto è facile ricordare gli argomenti e l'ordine degli argomenti corretti durante la scrittura del codice?
2

Robert C. Martin (Zio Bob) raccomanda 3 come massimo in Clean Code: A Handbook of Agile Software Craftsmanship

non ho il libro con me in questo momento, ma il suo ragionamento ha a che fare con uno, due e, a in misura minore, tre funzioni di argomento leggono bene e mostrano chiaramente lo scopo della funzione.

Questo ovviamente va di pari passo con la sua raccomandazione di funzioni brevissime e ben definite che aderiscono allo Single Responsibility Principal.

0

E dipende dal linguaggio di programmazione .. In C, non è davvero raro vedere funzioni con 7 parametri .. Tuttavia, in C#, ho raramente visto più di 5 parametri e io personalmente uso meno di 3 di solito.

// In C 
draw_dot(x, y, size, red, green, blue, alpha) 

// In C# 
Point point(x,y); 
Color color(red,green,blue,alpha); 

Tool.DrawDot(point, color); 
+0

Si potrebbe voler sostituire C# con any-OO: p (e Sì, Deve esserci un nuovo mancante da qualche parte: p) – user35978

Problemi correlati