Perché l'opzione / Forse considerata una buona idea e le eccezioni controllate non lo sono?

23

Alcuni linguaggi di programmazione come ad es. Scala ha il concetto di tipi Option (chiamato anche Maybe ), che può contenere o meno un valore.

Da quello che ho letto su di loro sono considerati ampiamente un modo superiore di affrontare questo problema rispetto a null , perché costringono esplicitamente il programmatore a considerare i casi in cui potrebbe non esserci un valore invece di esplodendo durante il runtime.

Le eccezioni controllate in Java, d'altro canto, sembrano essere considerate una cattiva idea e Java sembra essere l'unico linguaggio ampiamente utilizzato che le implementa. Ma l'idea alla base sembra essere in qualche modo simile al tipo Option , per forzare esplicitamente il programmatore ad affrontare il fatto che potrebbe essere lanciata un'eccezione.

Ci sono altri problemi con le eccezioni controllate che i tipi Option non hanno? O queste idee non sono così simili come penso, e ci sono buone ragioni per forzare la gestione esplicita per le Opzioni e non per le Eccezioni?

    
posta Mad Scientist 29.03.2013 - 13:07
fonte

3 risposte

24

Perché Option s è componibile. Esistono molti metodi utili su Option che consentono di scrivere codice conciso, consentendo comunque un controllo preciso sul flusso: map , flatMap , toList , flatten e altro. Ciò è dovuto al fatto che Option è un particolare tipo di monade, alcuni oggetti che conosciamo molto bene come comporre. Se non avevi questi metodi e dovevi corrispondere sempre a modelli con Option , o chiamare isDefined spesso, non sarebbero altrettanto utili.

Invece, mentre le eccezioni controllate aggiungono un po 'di sicurezza, non c'è molto che puoi fare con loro se non prenderle o lasciarle sbucare nello stack (con il boilerplate aggiunto nella dichiarazione del tipo).

    
risposta data 29.03.2013 - 14:17
fonte
14

Mentre gli oggetti correlati, le eccezioni e Maybe non affrontano lo stesso tipo di problemi.

Eccezioni

Le eccezioni brillano davvero quando devi affrontare situazioni non locali con una situazione eccezionale (che in alcuni casi è un errore). Ad esempio, si sta analizzando un CSV e si desidera proteggersi dalle linee con una formattazione errata. Il luogo in cui si scopre che qualcosa non va può essere alcune chiamate di funzione lontane dall'iterazione della riga. Se si lancia un'eccezione al livello più profondo (in cui si rileva il problema di formattazione), è possibile recuperarla nel ciclo, registrare l'errore e passare alla riga successiva. Non devi modificare nulla nel resto del codice.

L'eccezione verificata aggiunge molto dolore perché tutte le funzioni intermedie devono dichiarare il tipo di lancio. La funzionalità sconfigge lo scopo originale, motivo per cui non sono popolari al giorno d'oggi.

Forse oggetti

Forse gli oggetti dovrebbero essere scelti quando si è in grado di trattare localmente con un "fallimento". In questo senso, sostituiscono un codice di ritorno + passano per riferimento api o un tipo nullable.

Il vantaggio dell'oggetto Maybe è che dichiari esplicitamente che qualcosa potrebbe essere sbagliato. In haskell, un oggetto non può avere un valore, altrimenti il programma non verrà compilato.

Il problema con i tipi nullable è che devi controllare sempre nulla per essere assolutamente sicuro. Lo stato "qualcosa potrebbe essere sbagliato" è quello predefinito.

Il problema con i codici di ritorno + passa per apis di riferimento è che sono meno leggibili per la maggior parte delle persone.

    
risposta data 29.03.2013 - 13:57
fonte
1

perché con Maybe puoi posticipare la gestione dell'errore finché non hai effettivamente bisogno del valore (che potrebbe essere qualche richiamo di metodo)

mentre l'eccezione controllata deve essere gestita nella posizione della chiamata

l'unico aspetto positivo delle eccezioni è che è possibile passare più informazioni sul perché non ha funzionato (a meno che qualcuno non sviluppi un MaybeError con un campo da buttare quando si tratta di un errore)

    
risposta data 29.03.2013 - 13:47
fonte

Leggi altre domande sui tag