Esistono linee guida su quanti parametri deve accettare una funzione?


114

Ho notato che alcune funzioni con cui lavoro hanno 6 o più parametri, mentre nella maggior parte delle librerie che uso è raro trovare una funzione che richiede più di 3.

Spesso molti di questi parametri extra sono opzioni binarie per modificare il comportamento della funzione. Penso che alcune di queste funzioni con parametri enumerati debbano probabilmente essere riformulate. C'è una linea guida per quale numero è troppi?


4
@Ominus: L'idea è che vuoi mantenere le lezioni concentrate. Le classi focalizzate di solito non hanno altrettante dipendenze / attributi, quindi avresti meno parametri per il costruttore. Alcune parole d'ordine che le persone lanciano a questo punto sono alta coesione e principio di responsabilità singola . Se ritieni che questi non siano violati e che necessitino ancora di molti parametri, prendi in considerazione l'utilizzo del modello Builder.
c_maker,

2
Sicuramente non seguire l'esempio di MPI_Sendrecv () , che accetta 12 parametri!
chrisaycock,

6
Il progetto a cui sto attualmente lavorando utilizza un certo framework, in cui i metodi con oltre 10 parametri sono all'ordine del giorno. Sto chiamando un metodo particolare con 27 parametri in un paio di posti. Ogni volta che lo vedo muoio un po 'dentro.
perp

3
Non aggiungere mai interruttori booleani per modificare il comportamento della funzione. Dividi invece la funzione. Suddividere il comportamento comune in nuove funzioni.
Kevin Cline,

2
@Ominus Cosa? Solo 10 parametri? Non è niente, è necessario molto di più . : D
maaartinus

Risposte:


106

Non ho mai visto una linea guida, ma nella mia esperienza una funzione che accetta più di tre o quattro parametri indica uno dei due problemi:

  1. La funzione sta facendo troppo. Dovrebbe essere suddiviso in diverse funzioni più piccole, ognuna con un set di parametri più piccolo.
  2. C'è un altro oggetto nascosto dentro. Potrebbe essere necessario creare un altro oggetto o struttura dati che includa questi parametri. Vedere questo articolo sul modello Oggetto parametro per ulteriori informazioni.

È difficile dire cosa stai guardando senza ulteriori informazioni. È probabile che il refactoring che devi fare sia dividere la funzione in funzioni più piccole che vengono chiamate dal genitore a seconda di quei flag che sono attualmente passati alla funzione.

In questo modo si possono ottenere dei buoni guadagni:

  • Rende il tuo codice più facile da leggere. Personalmente trovo molto più semplice leggere un "elenco di regole" composto da una ifstruttura che chiama molti metodi con nomi descrittivi rispetto a una struttura che fa tutto in un unico metodo.
  • È più unità testabile. Hai suddiviso il tuo problema in diverse attività più piccole che sono individualmente molto semplici. La raccolta di test unitari sarebbe quindi composta da una suite di test comportamentali che controlla i percorsi attraverso il metodo master e una raccolta di test più piccoli per ogni singola procedura.

5
L'astrazione dei parametri è stata trasformata in un modello di progettazione? Cosa succede se hai 3 classi di parametri. Aggiungete altri 9 sovraccarichi di metodo per gestire le diverse possibili combinazioni di parametri? Sembra un brutto problema di dichiarazione dei parametri O (n ^ 2). Oh aspetta, puoi ereditare solo 1 classe in Java / C # in modo da richiedere un po 'più di biolerplate (forse un po' più di sottoclasse) per farlo funzionare in pratica. Scusa, non sono convinto. Ignorare gli approcci più espressivi che una lingua può offrire a favore della complessità sembra semplicemente sbagliato.
Evan Plaice,

A meno che non si utilizzi il modello Oggetto modello per impacchettare le variabili in un'istanza di oggetto e passarlo come parametro. Funziona per il packaging ma può essere allettante creare classi di variabili diverse solo per la comodità di semplificare la definizione del metodo.
Evan Plaice,

@EvanPlaice Non sto dicendo che devi usare quel modello ogni volta che hai più di un parametro - hai assolutamente ragione che diventa ancora più cattivo del primo elenco. Ci possono essere casi in cui hai davvero bisogno di un gran numero di parametri e semplicemente non funziona per avvolgerli in un oggetto. Devo ancora affrontare un caso di sviluppo aziendale che non rientra in uno dei due secchi di cui ho parlato nella mia risposta - ciò non significa che non esista.
Michael K,

@MichaelK Se non li hai mai usati, prova a cercare "inizializzatori di oggetti" su Google. È un approccio piuttosto innovativo che riduce significativamente la definizione della piastra di cottura. In teoria, potresti eliminare costruttori di classi, parametri e sovraccarichi in un colpo solo. In pratica, tuttavia, di solito è bene mantenere un costruttore comune e fare affidamento sulla sintassi dell '"inizializzatore di oggetti" per il resto delle proprietà oscure / di nicchia. IMHO, è il risultato più vicino all'espressività delle lingue tipizzate dinamicamente in una lingua tipizzata staticamente.
Evan Plaice,

@Evain Plaice: Da quando le lingue tipizzate in modo dinamico sono espressive?
ThomasX,

41

Secondo "Clean Code: A Handbook of Agile Software Craftsrafts", zero è l'ideale, uno o due sono accettabili, tre in casi speciali e quattro o più, mai!

Le parole dell'autore:

Il numero ideale di argomenti per una funzione è zero (niladic). Ne segue uno (monadico), seguito da vicino da due (diadico). Tre argomenti (triadici) dovrebbero essere evitati ove possibile. Più di tre (poliadici) richiedono una giustificazione molto speciale, e quindi non dovrebbero essere usati comunque.

In questo libro c'è un capitolo che parla solo di funzioni in cui i parametri sono ampiamente discussi, quindi penso che questo libro possa essere una buona guida di quanti parametri hai bisogno.

Secondo la mia opinione personale, un parametro è migliore di nessuno perché penso che sia più chiaro cosa sta succedendo.

Ad esempio, a mio avviso, la seconda scelta è migliore perché è più chiaro ciò che il metodo sta elaborando:

LangDetector detector = new LangDetector(someText);
//lots of lines
String language = detector.detectLanguage();

vs.

LangDetector detector = new LangDetector();
//lots of lines
String language = detector.detectLanguage(someText);

Su molti parametri, questo può essere un segno che alcune variabili possono essere raggruppate in un singolo oggetto o, in questo caso, molti booleani possono rappresentare che la funzione / metodo sta facendo più di una cosa, e in questo caso, è meglio riformattare ognuno di questi comportamenti in una funzione diversa.


8
"tre in casi speciali e quattro o più, mai!" BS. Che ne dici di Matrix.Create (x1, x2, x3, x4, x5, x6, x7, x8, x9); ?
Lukasz Madon,

71
Zero è l'ideale? In che modo le funzioni ottengono informazioni? Variabili globali / di istanza / statiche / qualunque? CHE SCHIFO.
Peter C

9
Questo è un cattivo esempio. La risposta è ovviamente: String language = detectLanguage(someText);. In entrambi i casi hai passato lo stesso numero esatto di argomenti, succede solo che hai diviso l'esecuzione della funzione in due a causa di un linguaggio scadente.
Matthieu M.

8
@lukas, in lingue che supportano tali costrutti fantasiosi come array o elenchi (gasp!), che ne dici di Matrix.Create(input);dove input, diciamo, un .NET IEnumerable<SomeAppropriateType>? In questo modo, inoltre, non è necessario un sovraccarico separato quando si desidera creare una matrice contenente 10 elementi anziché 9.
un CVn

9
Zero argomenti come "ideali" sono un cretino e uno dei motivi per cui penso che Clean Code sia sopravvalutato.
user949300,

24

Se le classi di dominio nell'applicazione sono progettate correttamente, il numero di parametri che passiamo in una funzione verrà automaticamente ridotto - perché le classi sanno come fare il loro lavoro e hanno abbastanza dati per fare il loro lavoro.

Ad esempio, supponi di avere una classe manager che chiede a una classe di terza elementare di completare i compiti.

Se modelli correttamente,

3rdGradeClass.finishHomework(int lessonId) {
    result = students.assignHomework(lessonId, dueDate);
    teacher.verifyHomeWork(result);
}

Questo è semplice

Se non hai il modello corretto, il metodo sarà così

Manager.finishHomework(grade, students, lessonId, teacher, ...) {
    // This is not good.
}

Il modello corretto riduce sempre i parametri delle funzioni tra le chiamate del metodo poiché le funzioni corrette sono delegate alle proprie classi (responsabilità singola) e dispongono di dati sufficienti per svolgere il proprio lavoro.

Ogni volta che vedo aumentare il numero di parametri, controllo il mio modello per vedere se ho progettato correttamente il mio modello di applicazione.

Vi sono tuttavia alcune eccezioni: quando avrò bisogno di creare un oggetto di trasferimento o oggetti di configurazione, userò un modello di generatore per produrre piccoli oggetti costruiti prima di costruire un grande oggetto di configurazione.


16

Un aspetto che le altre risposte non accettano è la prestazione.

Se si sta programmando in un linguaggio di livello sufficientemente basso (C, C ++, assembly) un gran numero di parametri può essere abbastanza dannoso per le prestazioni su alcune architetture, specialmente se la funzione viene chiamata un gran numero di volte.

Quando una chiamata di funzione è fatto in ARM per esempio, i primi quattro argomenti sono collocati nei registri r0di r3e restanti argomenti devono essere spinto sulla pila. Mantenere il numero di argomenti inferiore a cinque può fare la differenza per le funzioni critiche.

Per le funzioni che vengono chiamate estremamente spesso, anche il fatto che il programma deve impostare gli argomenti prima di ogni chiamata può influire sulle prestazioni ( r0per r3può sovrascrivere la funzione chiamata e dovrà essere sostituita prima della chiamata) in modo a tal riguardo zero argomenti sono i migliori.

Aggiornare:

KjMag porta in primo piano l'interessante argomento dell'inline. Inline in qualche modo lo mitigherà poiché consentirà al compilatore di eseguire le stesse ottimizzazioni che potresti fare se scrivessi in puro assembly. In altre parole, il compilatore può vedere quali parametri e variabili sono utilizzati dalla funzione chiamata e può ottimizzare l'utilizzo del registro in modo da ridurre al minimo lo stack read / write.

Tuttavia, ci sono alcuni problemi con l'allineamento.

  1. Inline fa crescere il file binario compilato poiché lo stesso codice viene duplicato in forma binaria se viene chiamato da più posizioni. Questo è dannoso quando si tratta dell'utilizzo della cache I.
  2. I compilatori di solito consentono solo l'allineamento fino a un certo livello (3 fasi IIRC?). Immagina di chiamare una funzione incorporata da una funzione incorporata da una funzione incorporata. La crescita binaria esploderebbe se inlinefosse considerata obbligatoria in tutti i casi.
  3. Ci sono molti compilatori che ignoreranno completamente inlineo ti daranno effettivamente errori quando lo incontrano.

Se il passaggio di un gran numero di parametri è positivo o negativo dal punto di vista delle prestazioni dipende dalle alternative. Se un metodo ha bisogno di una dozzina di informazioni e uno lo chiamerà centinaia di volte con gli stessi valori per undici di esse, avere il metodo take a array potrebbe essere più veloce che avere una dozzina di parametri. D'altra parte, se ogni chiamata avrà bisogno di un set univoco di dodici valori, la creazione e il popolamento dell'array per ciascuna chiamata potrebbe essere più lento del semplice passaggio diretto dei valori.
supercat

L'allineamento non risolve questo problema?
KjMag,

@KjMag: Sì, fino a un certo punto. Ma ci sono molti gotcha a seconda del compilatore. Le funzioni di solito vengono allineate fino a un certo livello (se si chiama una funzione incorporata che chiama una funzione incorporata che chiama una funzione incorporata ....). Se la funzione è grande e viene chiamata da molti punti, l'allineamento dappertutto rende il file binario più grande, il che può significare più errori nell'I-cache. Quindi l'allineamento può aiutare, ma non è un proiettile d'argento. (Per non parlare del fatto che ci sono alcuni compilatori embedded che non supportano inline.)
Leo,

7

Quando l'elenco dei parametri aumenta a più di cinque, prendere in considerazione la definizione di una struttura o di un oggetto "contesto".

Questa è fondamentalmente solo una struttura che contiene tutti i parametri opzionali con alcune impostazioni predefinite sensibili.

Nel mondo procedurale C dovrebbe fare una struttura semplice. In Java, C ++ sarà sufficiente un semplice oggetto. Non scherzare con getter o setter perché il solo scopo dell'oggetto è di mantenere valori "pubblici" da impostare.


Sono d'accordo, un oggetto di contesto può rivelarsi molto utile quando le strutture dei parametri di funzione iniziano a diventare piuttosto complesse. Di recente avevo scritto un blog sull'uso di oggetti di contesto con uno schema simile a quello di un visitatore
Lukas Eder,

5

No, non esiste una linea guida standard

Ma ci sono alcune tecniche che possono rendere più sopportabile una funzione con molti parametri.

Puoi usare un parametro list-if-args (args *) o un parametro del dizionario di args (kwargs **)

Ad esempio, in Python:

// Example definition
def example_function(normalParam, args*, kwargs**):
  for i in args:
    print 'args' + i + ': ' + args[i] 
  for key in kwargs:
    print 'keyword: %s: %s' % (key, kwargs[key])
  somevar = kwargs.get('somevar','found')
  missingvar = kwargs.get('somevar','missing')
  print somevar
  print missingvar

// Example usage

    example_function('normal parameter', 'args1', args2, 
                      somevar='value', missingvar='novalue')

Uscite:

args1
args2
somevar:value
someothervar:novalue
value
missing

Oppure potresti usare la sintassi della definizione letterale dell'oggetto

Ad esempio, ecco una chiamata jQuery JavaScript per avviare una richiesta GET AJAX:

$.ajax({
  type: 'GET',
  url: 'http://someurl.com/feed',
  data: data,
  success: success(),
  error: error(),
  complete: complete(),
  dataType: 'jsonp'
});

Se dai un'occhiata alla classe ajax di jQuery ci sono molte (circa 30) più proprietà che possono essere impostate; principalmente perché le comunicazioni Ajax sono molto complesse. Fortunatamente, la sintassi letterale dell'oggetto semplifica la vita.


C # intellisense fornisce una documentazione attiva dei parametri, quindi non è raro vedere disposizioni molto complesse di metodi sovraccarichi.

I linguaggi tipizzati dinamicamente come python / javascript non hanno tale capacità, quindi è molto più comune vedere argomenti di parole chiave e definizioni letterali di oggetti.

Preferisco definizioni letterali di oggetti ( anche in C # ) per la gestione di metodi complessi perché puoi vedere esplicitamente quali proprietà vengono impostate quando un oggetto viene istanziato. Dovrai fare un po 'più di lavoro per gestire gli argomenti predefiniti, ma a lungo andare il tuo codice sarà molto più leggibile. Con le definizioni letterali di oggetti puoi interrompere la tua dipendenza dalla documentazione per capire cosa sta facendo il tuo codice a prima vista.

IMHO, i metodi sovraccarichi sono altamente sopravvalutati.

Nota: se ricordo bene il controllo dell'accesso in sola lettura dovrebbe funzionare per i costruttori letterali di oggetti in C #. Sostanzialmente funzionano come l'impostazione delle proprietà nel costruttore.


Se non hai mai scritto alcun codice non banale in un linguaggio basato su javaScript tipicamente dinamicamente (python) e / o funzionale / prototipo, ti consiglio vivamente di provarlo. Può essere un'esperienza illuminante.

Può essere spaventoso prima di tutto fare affidamento sui parametri per l'approccio end-all, be-all all'inizializzazione della funzione / metodo, ma imparerai a fare molto di più con il tuo codice senza dover aggiungere complessità inutili.

Aggiornare:

Probabilmente avrei dovuto fornire esempi per dimostrare l'uso in un linguaggio tipicamente statico, ma attualmente non sto pensando in un contesto tipicamente statico. Fondamentalmente, ho fatto troppo lavoro in un contesto tipizzato in modo dinamico per tornare all'improvviso.

Quello che non so è oggetto sintassi definizione letterale è completamente possibile in lingue staticamente tipizzati (almeno in C # e Java), perché li ho usato prima. Nei linguaggi tipicamente statici sono chiamati "inizializzatori di oggetti". Ecco alcuni link per mostrare il loro uso in Java e C # .


3
Non sono sicuro che mi piace questo metodo, principalmente perché perdi il valore di auto-documentazione dei singoli parametri. Per elenchi di elementi simili questo ha perfettamente senso (ad esempio un metodo che prende un elenco di stringhe e le concatena), ma per un set di parametri arbitrari questo è peggio della lunga chiamata al metodo.
Michael K,

@MichaelK Dai un'occhiata agli inizializzatori di oggetti. Consentono di definire esplicitamente le proprietà rispetto a come sono implicitamente definite nei parametri metodo / funzione tradizionali. Leggi questo, msdn.microsoft.com/en-us/library/bb397680.aspx , per vedere cosa intendo.
Evan Plaice,

3
La creazione di un nuovo tipo solo per gestire l'elenco dei parametri suona esattamente come la definizione di complessità non necessaria ... Certo, i linguaggi dinamici ti permettono di evitarlo, ma poi ottieni una singola palla di parametro goo. Indipendentemente da ciò, questo non risponde alla domanda posta.
Telastyn,

@Telastyn Di cosa stai parlando? Non è stato creato alcun nuovo tipo, si dichiarano le proprietà direttamente utilizzando la sintassi letterale dell'oggetto. È come definire un oggetto anonimo ma il metodo lo interpreta come un raggruppamento di parametri chiave = valore. Quello che stai guardando è un'istanza del metodo (non un parametro che incapsula un oggetto). Se la tua carne è con il packaging dei parametri, dai un'occhiata al modello di oggetto parametro menzionato in una delle altre domande perché è esattamente quello che è.
Evan Plaice,

@EvanPlaice - Tranne il fatto che i linguaggi di programmazione statica in generale richiedono un tipo dichiarato (spesso nuovo) per consentire il modello di oggetto parametro.
Telastyn,

3

Personalmente, più di 2 è dove si attiva l'allarme odore di codice. Quando si considerano le funzioni come operazioni (ovvero una traduzione da input a output), non è raro che vengano utilizzati più di 2 parametri in un'operazione. Le procedure (ovvero una serie di passaggi per raggiungere un obiettivo) richiedono più input e talvolta sono l'approccio migliore, ma nella maggior parte delle lingue in questi giorni non dovrebbe essere la norma.

Ma ancora una volta, questa è la linea guida piuttosto che una regola. Ho spesso funzioni che accettano più di due parametri a causa di circostanze insolite o facilità d'uso.


2

Proprio come dice Evan Plaice, sono un grande fan del semplice passaggio di array associativi (o struttura di dati comparabili della tua lingua) in funzioni ogni volta che è possibile.

Pertanto, anziché (ad esempio) questo:

<?php

createBlogPost('the title', 'the summary', 'the author', 'the date of publication, 'the keywords', 'the category', 'etc');

?>

Andare per:

<?php

// create a hash of post data
$post_data = array(
  'title'    => 'the title',
  'summary'  => 'the summary',
  'author'   => 'the author',
  'pubdate'  => 'the publication date',
  'keywords' => 'the keywords',
  'category' => 'the category',
  'etc'      => 'etc',
);

// and pass it to the appropriate function
createBlogPost($post_data);

?>

Wordpress fa un sacco di cose in questo modo e penso che funzioni bene. (Sebbene il mio codice di esempio sopra sia immaginario e non sia esso stesso un esempio di Wordpress.)

Questa tecnica ti consente di trasferire facilmente molti dati nelle tue funzioni, ma ti libera dal dover ricordare l'ordine in cui ciascuno deve essere passato.

Apprezzerai anche questa tecnica quando arriverà il momento di refactoring - invece di dover potenzialmente cambiare l'ordine degli argomenti di una funzione (come quando ti rendi conto che devi passare Yet Another Argument), non devi cambiare il parametro delle tue funzioni elenco a tutti.

Questo non solo ti evita di dover riscrivere la definizione della tua funzione, ma ti risparmia di dover cambiare l'ordine degli argomenti ogni volta che la funzione viene invocata. È una vittoria enorme.


Vedere questo post evidenzia un altro vantaggio dell'approccio pass-a-hash: nota che il mio primo esempio di codice è così lungo da generare una barra di scorrimento, mentre il secondo si adatta perfettamente alla pagina. Lo stesso sarà probabilmente vero nel tuo editor di codice.
Chris Allen Lane,

0

Una risposta precedente menzionava un autore affidabile che affermava che meno parametri hanno le vostre funzioni, meglio state facendo. La risposta non ha spiegato perché, ma i libri lo spiegano, e qui ci sono due dei motivi più convincenti per cui è necessario adottare questa filosofia e con la quale sono personalmente d'accordo:

  • I parametri appartengono a un livello di astrazione diverso da quello della funzione. Questo significa che il lettore del tuo codice dovrà pensare alla natura e allo scopo dei parametri delle tue funzioni: questo pensiero è "di livello inferiore" rispetto a quello del nome e dello scopo delle loro corrispondenti funzioni.

  • Il secondo motivo per avere il minor numero possibile di parametri per una funzione è il test: ad esempio, se si dispone di una funzione con 10 parametri, pensare a quante combinazioni di parametri è necessario coprire tutti i casi di test per, ad esempio, un'unità test. Meno parametri = meno test.


0

Per fornire un po 'più di contesto attorno al consiglio per il numero ideale di argomenti di funzione pari a zero nel "Clean Code: A Handbook of Agile Software Craftsrafts" di Robert Martin, l'autore afferma quanto segue come uno dei suoi punti:

Gli argomenti sono difficili. Prendono molto potere concettuale. Ecco perché mi sono liberato di quasi tutti dall'esempio. Considera, ad esempio, StringBufferl'esempio. Avremmo potuto trasmetterlo come argomento anziché trasformarlo in una variabile di istanza, ma i nostri lettori avrebbero dovuto interpretarlo ogni volta che lo vedevano. Quando leggi la storia raccontata dal modulo, includeSetupPage() è più facile da capire di includeSetupPageInto(newPageContent). L'argomento è a un diverso livello di astrazione che il nome della funzione e ti costringe a conoscere un dettaglio (in altre parole, StringBuffer) che non è particolarmente importante a quel punto.

Per il suo includeSetupPage()esempio sopra, ecco un piccolo frammento del suo "codice pulito" refactored alla fine del capitolo:

// *** NOTE: Commments are mine, not the author's ***
//
// Java example
public class SetupTeardownIncluder {
    private StringBuffer newPageContent;

    // [...] (skipped over 4 other instance variables and many very small functions)

    // this is the zero-argument function in the example,
    // which calls a method that eventually uses the StringBuffer instance variable
    private void includeSetupPage() throws Exception {
        include("SetUp", "-setup");
    }

    private void include(String pageName, String arg) throws Exception {
        WikiPage inheritedPage = findInheritedPage(pageName);
        if (inheritedPage != null) {
            String pagePathName = getPathNameForPage(inheritedPage);
            buildIncludeDirective(pagePathName, arg);
        }
    }

    private void buildIncludeDirective(String pagePathName, String arg) {
        newPageContent
            .append("\n!include ")
            .append(arg)
            .append(" .")
            .append(pagePathName)
            .append("\n");
    }
}

La "scuola di pensiero" dell'autore sostiene piccole classi, un numero basso (idealmente 0) di argomenti di funzioni e funzioni molto piccole. Anche se non sono pienamente d'accordo con lui, l'ho trovato stimolante e sento che vale la pena prendere in considerazione l'idea di argomenti con funzione zero come ideale. Inoltre, tieni presente che anche il suo piccolo frammento di codice sopra ha funzioni di argomento diverse da zero, quindi penso che dipenda dal contesto.

(E come altri hanno sottolineato, sostiene anche che più argomenti rendono più difficile dal punto di vista del test. Ma qui ho principalmente voluto evidenziare l'esempio sopra e la sua logica per argomenti con funzione zero.)


-2

Idealmente zero. Uno o due sono ok, tre in alcuni casi.
Quattro o più di solito è una cattiva pratica.

Oltre ai singoli principi di responsabilità che altri hanno notato, puoi anche pensarci dai test e dal debug delle prospettive.

Se esiste un parametro, conoscerne i valori, testarli e trovare errori con essi è 'relativamente semplice in quanto esiste un solo fattore. Man mano che aumenti i fattori, la complessità totale aumenta rapidamente. Per un esempio astratto:

Considera un programma "cosa indossare in questo tempo". Considera cosa potrebbe fare con un input: la temperatura. Come puoi immaginare, i risultati di cosa indossare sono piuttosto semplici in base a quell'unico fattore. Ora considera cosa potrebbe / potrebbe / dovrebbe fare il programma se viene effettivamente superato temperatura, umidità, punto di rugiada, precipitazioni, ecc. Ora immagina quanto sarebbe difficile eseguire il debug se fornisse la risposta "sbagliata" a qualcosa.


12
Se una funzione ha zero parametri, sta restituendo un valore costante (utile in alcune circostanze, ma piuttosto limitante) o sta usando uno stato nascosto che sarebbe meglio reso esplicito. (Nelle chiamate al metodo OO, l'oggetto di contesto è sufficientemente esplicito da non causare problemi.)
Donal Fellows

4
-1 per non aver citato la fonte
Joshua Drake,

Stai seriamente dicendo che idealmente tutte le funzioni non prenderebbero parametri? O è questa iperbole?
GreenAsJade,

1
Vedi l'argomento di zio Bob su: informit.com/articles/article.aspx?p=1375308 e nota che in fondo dice "Le funzioni dovrebbero avere un piccolo numero di argomenti. Nessun argomento è il migliore, seguito da uno, due e tre Più di tre è molto discutibile e dovrebbe essere evitato con pregiudizio. "
Michael Durrant,

Ho dato la fonte. Divertente nessun commento da allora. Ho anche cercato di rispondere alla parte delle "linee guida" poiché molti ora considerano lo zio Bob e Clean Code come linee guida. Interessante il fatto che la risposta più alta e altamente votata (attualmente) non sia a conoscenza di alcuna linea guida. Lo zio Bob non intendeva essere autorevole, ma lo è in qualche modo e questa risposta almeno cerca di essere una risposta alle specifiche della domanda.
Michael Durrant,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.