Clean Code: un'altra domanda sui parametri booleani come parametri [duplicati]

4

Ho avuto una discussione, se il codice per chiamare le informazioni da un database può avere un interruttore per mostrare anche le voci cancellate.

Semplicemente il codice (C #) ha questo aspetto:

void searchEntry(string searchValue, bool searchDelete = false)

Solitamente, la maggior parte della base di codice non vuole mostrare le voci cancellate, ma se si desidera ripristinare una voce (e questo è il mio unico caso) voglio che venga cancellato, se devono non eliminato.

Sono giunto alla discussione che "booleano" dovrebbe essere evitato con questo metodo,

Sicuramente, posso fare un enum come:

enum DeletionFlag {
   DontSearchDeleted,
   SearchDeleted
}

Ma rende questo codice davvero più leggibile:

void searchEntry(string searchValue, DeletionFlag searchDelete = DeletionFlag.SearchDeleted)

La tabella del database ha un valore bool per "isDeleted" da definire, se la voce è contrassegnata come cancellata.

Quindi potrebbe usare il tipo di chiamate:

    db.searchEntry("somesearch", DeletionFlag.DontSearchDeleted);
    db.searchEntry("somesearch", DeletionFlag.SearchDeleted);

Questa sarebbe una soluzione migliore, o è ok, stare con booleano per questo?

Quali sono i tuoi suggerimenti?

    
posta Christian Müller 14.12.2018 - 16:07
fonte

2 risposte

13

Il mio consiglio è di evitare parametri opzionali, specialmente quando sono solo interruttori. Invece, crea due funzioni che descrivano chiaramente cosa fanno:

void searchEntry(string searchValue)
void searchEntryIncludeDeleted(string searchValue)

In tal modo, si evita un parametro booleano, si evita la necessità di enum, si evitano i parametri opzionali e si rende il codice più facile da leggere come bonus.

Per evitare la duplicazione del codice, entrambi i metodi chiamano semplicemente un metodo privato che esegue il lavoro. Nel caso del metodo privato, quel parametro booleano diventa accettabile in quanto la "distanza" tra la dichiarazione e il chiamante è molto piccola, evitando così i problemi con il fatto che non è ovvio ciò che il booleano rappresenta, ad esempio:

public void searchEntry(string searchValue)
{
    searchEntries(searchValue, false);
}

public void searchEntryIncludedDeleted(string searchValue)
{
    searchEntries(searchValue, true);
}

private void searchEntry(string searchValue, bool includeDeleted)
{
    ...
}

E poiché è privato e utilizzato solo dai due metodi del wrapper pubblico, non è necessario un parametro facoltativo.

    
risposta data 14.12.2018 - 16:23
fonte
5

Il solito consiglio è di evitare molti parametri di tipo value e bool in particolare perché si può finire con un codice difficile da leggere

var x = searchEntry(
    true,
    false,
    "helloworld"
    )

var y = searchEntry(
    false, //super important that this is different!!
    false,
    "goodbye"
    )

Ma c # ora ha argomenti con nome (a volte erroneamente chiamati parametri con nome)

var y = searchEntry(
    includeDeleted: false,
    recursive: false,
    searchTerm: "goodbye"
    )

Che risolve il problema senza dover creare classi / enumerazioni extra

    
risposta data 14.12.2018 - 16:28
fonte

Leggi altre domande sui tag