Nome prefisso delle funzioni con "Prova"

-1

Ho letto nel libro "Clean Code" di Robert C. Martin (a pagina 71) che il modo migliore per gestire il blocco try / catch è separare il processo (la parte "try") dalla gestione degli errori (il " prendere parte "). Ogni parte dovrebbe avere una funzione dedicata

Esempio del libro, che illustra un modo migliore per gestire try / catch:

public void delete(Page page) {
    try {
        deletePageAndAllReferences(page);
    }
    catch (Exception e) {
        logError(e);
    }
}

private void deletePageAndAllReferences(Page page) throws Exception {
    deletePage(page);
    registry.deleteReference(page.name);
    configKeys.deleteKey(page.name.makeKey());
}

private void logError(Exception e) {
    logger.log(e.getMessage());
}

Sono totalmente d'accordo con questo consiglio. Tuttavia, mi chiedo il nome della funzione "cancella". IMHO, questo nome non è abbastanza esplicito su cosa sta facendo la funzione (che cosa sta eliminando?). Inoltre, penso che nasconda anche il fatto che qualsiasi eccezione sollevata sarà catturata all'interno di questa funzione e penso che aggiungere un prefisso al nome della funzione lo chiarirà.

Ma mi sto anche chiedendo di dare troppe informazioni che potrebbero aggiungere complessità inutile e una minore leggibilità. Quindi non so se rinominarlo "tryDeletePageAndAllReferences" sarà un nome migliore o meno.

E, in un contesto più generale, è meglio porre un prefisso a quel tipo di funzione (intendo solo con try catch blocks) con "try"?

Grazie per il tuo consiglio e anche il tuo feedback.

    
posta AriaOS 30.05.2018 - 10:49
fonte

2 risposte

3

Dovresti guardare dal punto di vista del cliente. Al cliente non importa se hai provato la dichiarazione all'interno della tua funzione o no, è un dettaglio di implementazione.

Prefisso "Prova *" che ho visto utilizzato quando la convenzione non genera eccezioni in caso di errore, ma restituisce false o qualche altro valore per indicare l'errore.

Quindi, per riassumere:

  • se gestisci l'eccezione all'interno della funzione e l'attività viene eseguita indipendentemente dall'eccezione o meno, non è necessario il prefisso "Prova".
  • se intendi restituire il valore dell'errore ( false o qualsiasi altra cosa), allora è opportuno denominare la funzione come "Prova *"
  • In realtà, ti consiglio di chiedere a te stesso: hai effettivamente bisogno di rilevare l'eccezione in quella funzione , forse hai bisogno di passarlo al livello successivo, o avvolgerlo in un'altra eccezione? Quindi penso che il prefisso non sia necessario.
risposta data 30.05.2018 - 11:12
fonte
0

Hai ragione sul fatto che il nome ora nasconda parte di ciò che sta facendo la funzione e che lo faccia apparire in apparenza non il migliore degli esempi. Non si tratta solo di eliminare la pagina, ma anche i riferimenti ad essa. Ma ora devi guardare il contesto. Cancellare i riferimenti è un dettaglio di implementazione di questa classe? Questi riferimenti sembrano uno stato interno, quindi aggiornerebbe semplicemente il suo stato interno ogni volta che una pagina viene eliminata e non è qualcosa di cui il client dovrebbe preoccuparsi quando elimina una pagina.

Anche il client che non conosce l'eccezione che viene catturata non dovrebbe essere un problema, supponendo che sia una cosa logica da fare per la funzione. Apparentemente, il programma non si trova in uno "stato eccezionale" quando l'eliminazione della pagina non è riuscita e tutto ciò che dobbiamo fare in risposta ad esso è registrare l'evento.

L'altro problema con il prefisso di tali funzioni con "prova" è che stai comunicando la funzione è consentita per fallire . Non vedrei un'eccezione come una possibilità di fallimento, come dovrebbe essere una "situazione eccezionale". Puoi anche vederlo in posti come .NET framework dove funzioni con prefisso try return a boolean che indica se l'operazione è riuscita o meno.

    
risposta data 30.05.2018 - 11:38
fonte

Leggi altre domande sui tag