La programación es sobre el trabajo.
Creo que la forma más fácil de responder a esto es entender el progreso que OOP ha logrado a lo largo de los años. Todo lo que se hace en OOP (y la mayoría de los paradigmas de programación, para el caso) se basa en la necesidad de trabajar .
Cada vez que se llama a un método, la persona que llama dice "No sé cómo hacer este trabajo, pero tú sabes cómo hacerlo, así que lo haces 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 "basura". Tal vez espere un número 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 alguna parte. Desafortunadamente, ambas formas resultaron en un código repetitivo de " déjenme revisar-aquí-para-asegurar-todo-kosher ". A medida que las cosas se vuelven más complicadas, este sistema se desmorona.
Una analogía excepcional
Digamos que tienes un carpintero, un plomero y un electricista. Desea que el plomero arregle su fregadero, así que él lo mira. No es muy útil si solo te dice: "Lo siento, no puedo arreglarlo. Está roto". Demonios, es aún peor si él echara un vistazo, se fuera y le enviara una carta diciéndole que no podía arreglarlo. Ahora tiene que revisar su correo antes de saber que él no hizo lo que usted quería.
Lo que preferiría es que le dijera: "Mire, no pude arreglarlo porque parece que su bomba no funciona".
Con esta información, puede concluir que desea que el electricista analice el problema. Quizás el electricista encuentre algo relacionado con el carpintero, y necesitará que el carpintero lo arregle.
Demonios, es posible que ni siquiera sepas que necesitas un electricista, es posible que no sepas a quién necesitas. Usted es solo una gerencia intermedia en un negocio de reparación de viviendas, y su enfoque es la plomería. Entonces le dices a tu jefe sobre el problema, y luego le dice al electricista que lo arregle.
Esto es lo que las excepciones son el modelado: modos de falla complejos de manera desacoplada. El plomero no necesita saber acerca de electricista, ni siquiera necesita saber que alguien en la cadena puede solucionar el problema. Simplemente informa sobre el problema que encontró.
Entonces ... ¿un antipatrón?
Ok, entonces entender el punto de excepciones es el primer paso. Lo siguiente es entender qué es un antipatrón.
Para calificar como un antipatrón, necesita
- resolver el problema
- tener consecuencias definitivamente negativas
El primer punto se cumple fácilmente: el sistema funcionó, ¿verdad?
El segundo punto es más pegajoso. La razón principal para usar excepciones ya que el flujo de control normal es malo es porque ese no es su propósito. Cualquier pieza de funcionalidad dada en un programa debe tener un propósito relativamente claro, y cooptar ese propósito conduce a una confusión innecesaria.
Pero eso no es un daño definitivo . Es una forma pobre de hacer las cosas, y raro, pero ¿un antipatrón? No. Solo ... extraño.