La programmazione riguarda il lavoro
Penso che il modo più semplice per rispondere a questo è capire i progressi compiuti dall'OOP nel corso degli anni. Tutto ciò che è stato fatto in OOP (e nella maggior parte dei paradigmi di programmazione, per così dire) è modellato intorno a che richiede lavoro svolto .
Ogni volta che viene chiamato un metodo, il chiamante sta dicendo "Non so come fare questo lavoro, ma sai come, quindi lo fai per me."
Questo ha presentato una difficoltà: cosa succede quando il metodo chiamato generalmente sa come fare il lavoro, ma non sempre? Avevamo bisogno di un modo per comunicare "Volevo aiutarti, davvero, ma non posso farlo".
Una prima metodologia per comunicare questo era semplicemente restituire un valore "spazzatura". Forse ti aspetti un intero positivo, quindi il metodo chiamato restituisce un numero negativo. Un altro modo per farlo era impostare un valore di errore da qualche parte. Sfortunatamente, in entrambi i casi il codice let-me-check-over-here-to-make-sure-kosher è stato sostituito. Man mano che le cose si complicano, questo sistema va in pezzi.
Un'analogia eccezionale
Diciamo che hai un falegname, un idraulico e un elettricista. Tu vuoi l'idraulico per aggiustare il lavandino, così lui ci dà un'occhiata. Non è molto utile se ti dice solo, "Scusa, non riesco a sistemarlo. È rotto." Inferno, è ancora peggio se dovesse dare un'occhiata, andarsene e mandarti una mail lettera dicendo che non poteva aggiustarlo. Ora devi controllare la tua posta prima ancora di sapere che non ha fatto quello che volevi.
Ciò che preferiresti è che ti dica, "Guarda, non potrei aggiustarlo perché sembra che la tua pompa non funzioni."
Con queste informazioni, puoi concludere che vuoi che l'elettricista dia un'occhiata al problema. Forse l'elettricista troverà qualcosa relativo al falegname e dovrai far aggiustare il falegname.
Diamine, potresti anche non sapere che hai bisogno di un elettricista, potresti non sapere chi hai bisogno. Sei solo una middle management in un'azienda di riparazioni a domicilio e il tuo obiettivo è l'idraulica. Quindi dici che sei il capo del problema, e poi lui dice all'elettricista di ripararlo.
Questo è ciò che le eccezioni stanno modellando: modalità di fallimento complesse in modo disaccoppiato. L'idraulico non ha bisogno di sapere sull'elettricista, non ha nemmeno bisogno di sapere che qualcuno in cima alla catena può risolvere il problema. Riferisce solo sul problema che ha incontrato.
Quindi ... un anti-pattern?
Ok, capire il punto delle eccezioni è il primo passo. Il prossimo è capire cos'è un anti-pattern.
Per qualificarsi come anti-modello, è necessario
- risolvi il problema
- hanno conseguenze definitivamente negative
Il primo punto è facilmente soddisfatto - il sistema ha funzionato, giusto?
Il secondo punto è più appiccicoso. Il motivo principale per l'utilizzo di eccezioni come normale flusso di controllo è negativo è perché non è il loro scopo. Qualsiasi dato elemento di funzionalità in un programma dovrebbe avere uno scopo relativamente chiaro e la cooptazione di tale scopo porta a confusione inutile.
Ma questo non è un danno definitivo . È un modo povero di fare le cose, e strano, ma un anti-modello? No. Solo ... strano.