Se questo tipo di problema si verifica spesso nel codice ("Spesso trovo che ho bisogno di aggiungere nuove funzionalità condizionali al codice che esiste già."), allora il codice non è ben progettato o il suo design non è compreso sufficiente.
In generale, è molto difficile dare un consiglio.
In primo luogo, dovresti iniziare a mantenere il codice meno sorprendente: se non hai tempo / denaro / inclinazione al refactoring, quindi continua ad usare gli stessi metodi usati in precedenza, non introdurre modi oscuri. (è facile, ad esempio, fare qualcosa come:
{True: bar_1, False: bar_2}[foo]()
o fai lo stesso con una fredda gerarchia di classi di Frobnicator, che risolverà i problemi di spedizione per te, ma questa freddezza non significa che il codice diventerà più gestibile.
In secondo luogo, considera il dominio aziendale. foo
appartiene davvero alle preoccupazioni di bar
? Appartengono allo stesso livello di astrazione? Perché il codice sia più pulito, la funzione dovrebbe fare solo una cosa, quindi ogni parametro fornito rende il codice meno pulito. Un buon indicatore è se la barra_1 e la barra_2 hanno la loro interpretazione distinguibile nel modello di dominio. Se, lo fanno, non nascondono se nella funzione. Se foo
è un parametro minore, questo è meglio se è all'interno. (L'unica eccezione a ciò che vedo nel software di modellazione scientifica, dove le funzioni possono avere molti parametri e una diversa cultura di programmazione). Inoltre, considera quante volte viene chiamata la funzione, poiché ogni chiamata dovrà essere toccata ovunque per modificare la firma della funzione.
Se hai dubbi in merito a quanto sopra, puoi prendere in considerazione un'altra considerazione se hai più di un% di parametri di tipo% di%. Puoi farti una domanda: quei parametri sono veramente indipendenti o possibilmente appartengono ad alcune entità? Ad esempio, se hai foo
, x
parametri e aggiungi y
, puoi considerare di utilizzare un oggetto z
. Potrebbe quindi essere, che la scelta diventerà una preoccupazione per quella nuova entità.
Come ultima difesa, puoi stare meglio usando il motore delle regole o qualche altro approccio dichiarativo. Potrebbe mantenere la complessità bassa e facilmente mantenibile.
Anche se non l'hai chiesto, rendere la logica più complessa con ifs può ritorcersi contro. Tracciare la logica diventerà sempre più difficile, e verrà il momento in cui nessuno capirà cosa sta succedendo, indipendentemente dal fatto che tu abbia, dentro o fuori la tua funzione.