Ich bin in letzter Zeit besorgt über die Verwendung von abstrakten Klassen.
Manchmal wird im Voraus eine abstrakte Klasse erstellt, die als Vorlage für die Funktionsweise der abgeleiteten Klassen dient. Das bedeutet mehr oder weniger, dass sie einige Funktionen auf hoher Ebene bieten, aber bestimmte Details auslassen, die von abgeleiteten Klassen implementiert werden müssen. Die abstrakte Klasse definiert die Notwendigkeit dieser Details, indem sie einige abstrakte Methoden einführt. In solchen Fällen funktioniert eine abstrakte Klasse wie eine Blaupause, eine allgemeine Beschreibung der Funktionalität oder wie auch immer Sie sie nennen möchten. Es kann nicht alleine verwendet werden, sondern muss spezialisiert sein, um die Details zu definieren, die bei der Implementierung auf hoher Ebene nicht berücksichtigt wurden.
Manchmal kommt es vor, dass die abstrakte Klasse nach der Erstellung einiger "abgeleiteter" Klassen erstellt wird (da die übergeordnete / abstrakte Klasse nicht vorhanden ist, wurden sie noch nicht abgeleitet, aber Sie wissen, was ich meine). In diesen Fällen wird die abstrakte Klasse normalerweise als Ort verwendet, an dem Sie jede Art von allgemeinem Code einfügen können, den aktuell abgeleitete Klassen enthalten.
Nachdem ich die obigen Beobachtungen gemacht habe, frage ich mich, welcher dieser beiden Fälle die Regel sein sollte. Sollten irgendwelche Details in die abstrakte Klasse eingeblasen werden, nur weil sie derzeit in allen abgeleiteten Klassen gemeinsam sind? Sollte allgemeiner Code vorhanden sein, der nicht Teil einer High-Level-Funktionalität ist?
Sollte Code vorhanden sein, der für die abstrakte Klasse selbst möglicherweise keine Bedeutung hat, nur weil er zufällig für die abgeleiteten Klassen gleich ist?
Lassen Sie mich ein Beispiel geben: Die abstrakte Klasse A hat eine Methode a () und eine abstrakte Methode aq (). Die Methode aq () verwendet in beiden abgeleiteten Klassen AB und AC eine Methode b (). Sollte b () nach A verschoben werden? Wenn ja, dann würde die Existenz von b () nicht viel Sinn machen, wenn jemand nur A ansieht (tun wir so, als wären AB und AC nicht da)! Ist das eine schlechte Sache? Sollte jemand in der Lage sein, einen Blick in eine abstrakte Klasse zu werfen und zu verstehen, was vor sich geht, ohne die abgeleiteten Klassen zu besuchen?
Um ehrlich zu sein, glaube ich im Moment, dass das Schreiben einer abstrakten Klasse, die Sinn macht, ohne in die abgeleiteten Klassen schauen zu müssen, eine Frage von sauberem Code und sauberer Architektur ist. Ι Die Idee einer abstrakten Klasse, die sich wie ein Speicherauszug für jede Art von Code verhält, ist in allen abgeleiteten Klassen nicht üblich.
Was denkst / übst du?
Writing an abstract class that makes sense without having to look in the derived classes is a matter of clean code and clean architecture.
-- Warum? Ist es nicht möglich, dass ich beim Entwerfen und Entwickeln einer Anwendung feststelle, dass mehrere Klassen gemeinsame Funktionen haben, die natürlich in eine abstrakte Klasse umgewandelt werden können? Muss ich hellsichtig genug sein, um dies immer vorwegzunehmen, bevor ich Code für abgeleitete Klassen schreibe? Wenn ich nicht so klug bin, darf ich dann kein solches Refactoring durchführen? Muss ich meinen Code rauswerfen und von vorne beginnen?