Beim Programmieren geht es um Arbeit
Ich denke, der einfachste Weg, dies zu beantworten, besteht darin, die Fortschritte zu verstehen, die OOP im Laufe der Jahre gemacht hat. Alles, was in OOP (und in den meisten Programmierparadigmen) gemacht wird, basiert darauf, dass die Arbeit erledigt werden muss .
Jedes Mal, wenn eine Methode aufgerufen wird, sagt der Aufrufer: "Ich weiß nicht, wie diese Arbeit zu erledigen ist, aber Sie wissen, wie, also tun Sie es für mich."
Dies stellte eine Schwierigkeit dar: Was passiert, wenn die aufgerufene Methode im Allgemeinen weiß, wie die Arbeit zu erledigen ist, aber nicht immer? Wir brauchten einen Weg zu kommunizieren "Ich wollte dir helfen, das habe ich wirklich getan, aber das kann ich einfach nicht."
Eine frühe Methode, dies zu kommunizieren, bestand darin, einfach einen "Müll" -Wert zurückzugeben. Möglicherweise erwarten Sie eine positive Ganzzahl, sodass die aufgerufene Methode eine negative Zahl zurückgibt. Eine andere Möglichkeit, dies zu erreichen, bestand darin, irgendwo einen Fehlerwert festzulegen. Unglücklicherweise führten beide Wege zu einem Kesselschild , auf dem ich nachschauen musste , um sicherzustellen, dass alles koscher war . Wenn die Dinge komplizierter werden, fällt dieses System auseinander.
Eine außergewöhnliche Analogie
Angenommen, Sie haben einen Tischler, einen Klempner und einen Elektriker. Sie möchten Ihr Waschbecken reparieren, damit er es sich ansieht. Es ist nicht sehr nützlich, wenn er nur dir sagt: "Entschuldigung, ich kann es nicht reparieren. Es ist kaputt." Verdammt, es ist noch schlimmer, wenn er einen Blick darauf wirft, geht und dir einen Brief schickt, in dem er sagt, er könne ihn nicht reparieren. Jetzt müssen Sie Ihre E-Mails überprüfen, bevor Sie überhaupt wissen, dass er nicht das getan hat, was Sie wollten.
Was Sie bevorzugen, ist, dass er Ihnen sagt: "Sehen Sie, ich konnte es nicht reparieren, weil es so aussieht, als ob Ihre Pumpe nicht funktioniert."
Mit diesen Informationen können Sie den Schluss ziehen, dass der Elektriker einen Blick auf das Problem werfen soll. Vielleicht findet der Elektriker etwas, das mit dem Schreiner zu tun hat, und Sie müssen es vom Schreiner reparieren lassen.
Vielleicht wissen Sie gar nicht, dass Sie einen Elektriker brauchen, vielleicht wissen Sie auch nicht, wen Sie brauchen. Sie sind nur das mittlere Management eines Reparaturunternehmens, und Ihr Fokus liegt auf dem Sanitärbereich. Also sagen Sie , Sie sind Chef über das Problem, und dann er sagt dem Elektriker , es zu beheben.
Dies sind die Ausnahmen, die modelliert werden: Komplexe Fehlermodi werden entkoppelt. Der Klempner muss nichts über Elektriker wissen - er muss nicht einmal wissen, dass jemand in der Kette das Problem beheben kann. Er berichtet nur über das Problem, auf das er gestoßen ist.
Also ... ein Anti-Muster?
Ok, also ist es der erste Schritt , den Punkt der Ausnahmen zu verstehen . Das nächste ist zu verstehen, was ein Anti-Pattern ist.
Um sich als Anti-Pattern zu qualifizieren, muss es so sein
- das Problem lösen
- definitiv negative Folgen haben
Der erste Punkt ist leicht zu erfüllen - das System hat funktioniert, oder?
Der zweite Punkt ist klebriger. Der Hauptgrund für die Verwendung von Ausnahmen als normalen Kontrollfluss ist, dass dies nicht deren Zweck ist. Jede Funktion in einem Programm sollte einen relativ klaren Zweck haben, und die Auswahl dieses Zwecks führt zu unnötiger Verwirrung.
Aber das ist kein definitiver Schaden. Es ist eine schlechte Art und Weise, Dinge zu tun, und seltsam, aber ein Anti-Muster? Nein, nur ... seltsam.