La programación es sobre el trabajo
Creo que la forma más fácil de responder a esto es entender el progreso que ha logrado OOP a lo largo de los años. Todo lo que se hace en OOP (y la mayoría de los paradigmas de programación, en realidad) se modela en torno a que necesita trabajo realizado .
Cada vez que se llama a un método, la persona que llama dice "No sé cómo hacer este trabajo, pero usted sabe cómo hacerlo, así que lo hace por mí".
Esto presentaba una dificultad: ¿qué sucede cuando el método llamado generalmente sabe cómo hacer el trabajo, pero no siempre? Necesitábamos una forma de comunicarnos "Quería ayudarte, realmente lo hice, pero no puedo hacer eso".
Una metodología temprana para comunicar esto fue simplemente devolver un valor de "basura". Tal vez espere un entero positivo, por lo que el método llamado devuelve un número negativo. Otra forma de lograr esto era establecer un valor de error en algún lugar. Desafortunadamente, ambas formas dieron lugar a un código que me permite verificar-aquí-para-asegurar-todo-es-kosher . A medida que las cosas se complican, este sistema se desmorona.
Una analogía excepcional
Digamos que tienes un carpintero, un fontanero y un electricista. Usted quiere que el fontanero arregle su fregadero, entonces él lo mira. No es muy útil si solo le dice a usted, "Lo siento, no puedo arreglarlo. Está roto". Demonios, es aún peor si tuviera que echarle un vistazo, dejarlo y enviarle un correo. Carta diciendo que no podía arreglarlo. Ahora tienes que revisar tu correo antes de saber que él no hizo lo que querías.
Lo que preferirías es que te diga, "Mira, no pude arreglarlo porque parece que tu bomba no está funcionando".
Con esta información, puede concluir que desea que el electricista revise el problema. Quizás el electricista encuentre algo relacionado con el carpintero, y usted necesitará que el carpintero lo arregle.
Vaya, es posible que ni siquiera sepa que necesita un electricista, o que no sepa quién necesita. Usted solo es de gerencia media en un negocio de reparación de viviendas, y su enfoque es la plomería. Entonces le dice a su jefe sobre el problema y luego él le dice al electricista que lo arregle.
Esto es lo que las excepciones están modelando: los modos de falla complejos de una manera desacoplada. El plomero no necesita saber acerca de un electricista, ni siquiera necesita saber que alguien de la cadena puede solucionar el problema. Él acaba de informar sobre el problema que encontró.
Entonces ... ¿un anti-patrón?
Ok, entonces el primer paso es entender el punto de las excepciones. Lo siguiente es entender qué es un anti-patrón.
Para calificar como un anti-patrón, necesita
- resuelve el problema
- tiene consecuencias definitivamente negativas
El primer punto se cumple fácilmente: el sistema funcionó, ¿no?
El segundo punto es más pegajoso. La razón principal para usar excepciones como flujo de control normal es mala porque ese no es su propósito. Cualquier pieza dada de funcionalidad en un programa debe tener un propósito relativamente claro, y la cooptación de ese propósito conduce a una confusión innecesaria.
Pero eso no es un daño definitivo . Es una manera pobre de hacer las cosas, y es raro, ¿pero un anti-patrón? No. Solo ... extraño.