Martin Fowler descrive l'odore del codice Flag come un "tipo di argomento della funzione che indica alla funzione di eseguire un operazione diversa a seconda del suo valore ".
Risposte a È sbagliato usare un argomento booleano per determinare il comportamento? sembra confondere tutti gli argomenti booleani con gli argomenti flag. Penso che la domanda non esplori completamente il problema degli argomenti booleani.
Tuttavia, ho la sensazione che non tutti gli argomenti booleani siano uguali.
Un caso d'uso per argomenti booleani
Immagina un popup che mostri un messaggio che dipende in parte dalla presenza o meno di un utente. Definiremmo un metodo
show(boolean isLoggedIn)
Il metodo verrebbe chiamato in questo modo:
popup.show(session.isLoggedIn())
Mi sembra che in questo esempio la leggibilità e la coesione non siano influenzate negativamente. Inoltre, non penso che questo sia un argomento di bandiera. Non dice al metodo come esattamente comportarsi, ma trasmette le informazioni necessarie al metodo per prendere quella decisione.
Alternative
Non riesco a pensare a un modo per migliorare questo metodo utilizzando le soluzioni proposte nella discussione sopra.
Enum sarebbe simile a questo:
popup.show(session.isUserLoggedIn()
? Popup.ContentType.LoggedIn
: Popup.ContentType.LoggedOut);
La divisione del metodo sarebbe simile a questa:
if (session.isUserLoggedIn()) {
popup.showLoggedInMessage();
} else {
popup.showLoggedOutMessage();
}
Questo sembra più lungo e porta anche alla duplicazione del codice se hanno parametri comuni:
if (session.isUserLoggedIn) {
popup.showLoggedInMessage(commonIntro);
} else {
popup.showLoggedOutMessage(commonIntro);
}
Secondo me, usare un argomento booleano è meglio di entrambi questi approcci.
Quindi, tutti gli argomenti booleani hanno un odore del codice o possono essere una tecnica valida?