Come collegare correttamente le funzioni sovraccariche?

7

Supponendo che tu abbia funzioni che richiedono un numero crescente di parametri opzionali (e uno pseudo linguaggio che non consente parametri opzionali e un numero arbitrario di parametri) come questo:

function doStuff(Param a)
function doStuff(Param a, Param b)
function doStuff(Param a, Param b, Param c)

Che cos'è un buon modo per unificarli in una singola chiamata? Posso immaginare due disegni:

Infila tutto:

function doStuff(Param a)
    doStuff(a, defaultB)

function doStuff(Param a, Param b)
    doStuff(a, b, defaultC)

function doStuff(Param a, Param b, Param c)
    // magic goes here
  • The Upside: non molta duplicazione del codice, semplice modifica di un singolo parametro predefinito.
  • Il lato negativo: molte chiamate di funzioni, potrebbero rendere gli stacktraces più difficili da leggere o inutili.

Oppure chiama direttamente la funzione 'last':

function doStuff(Param a)
    doStuff(a, defaultB, defaultC)

function doStuff(Param a, Param b)
    doStuff(a, b, defaultC)

function doStuff(Param a, Param b, Param c)
    // magic goes here
  • The Upside: non ci sono molte chiamate di funzione, non ti preoccupare se una nuova funzione viene aggiunta alla catena.
  • Il lato negativo: gran parte della duplicazione del codice, in particolare i valori predefiniti.

A cosa non ho pensato?

    
posta Bobby 13.01.2012 - 10:32
fonte

3 risposte

5

Preferisco il primo metodo. La possibilità di valori predefiniti duplicati in ogni punto può ridurre notevolmente la manutenibilità. Ho incontrato quel problema specifico in natura, ed è stato un incubo.

    
risposta data 13.01.2012 - 18:37
fonte
2

Il primo è solo due linee extra in uno stacktrace che non è tanto. In Java non ho mai trovato stacktraces difficili da leggere a causa di nomi di metodi simili.

Comunque, usare troppi parametri potrebbe essere un cattivo odore di codice: Quanti parametri sono troppi?

    
risposta data 13.01.2012 - 12:04
fonte
0

Opterei per il secondo paradigma (chiamando direttamente la funzione "last".). Questo va bene, e non costituisce una vera duplicazione del codice, perché non implica la manipolazione di alcun tipo di stato.

Aiuta anche a capire che ciò che stai facendo fornendo sovraccarichi multipli è semplicemente un trucco solo per fornire l'illusione dei parametri opzionali. Una volta che la vedi in questo modo, diventa ovvio che il "ultimo" e solo il "ultimo" metodo è quello che dovrebbe svolgere qualsiasi lavoro reale, quindi qualsiasi delega tra i non-ultimi metodi è semplicemente inutile.

Personalmente, non devo più preoccuparmi di questo problema, perché sto usando C #, che supporta parametri opzionali, evitando così di dover fare trucchi del genere per poterli emulare.

    
risposta data 13.01.2012 - 18:39
fonte

Leggi altre domande sui tag