Ich finde nicht, dass dein Posting überflüssig war. Es ist vielmehr ein schönes Beispiel für Legacy Code, wie er ist. Und es ist ein noch schöneres Beispiel dafür, warum es überhaupt dazu kommt und wie Prinzipien zu Cargo Cult werden können. Sorry, hört sich jetzt vielleicht etwas hart an, ist ja aber nicht persönlich gemeint. Du verhältst dich eben typisch, finde ich. Das ist total verständlich - doch ich glaube, wir müssen genau aus diesem Verhalten raus.
Also, was ich meine:
Du präsentierst uns hier einfach Code. Der ist so, wie er ist. Ohne Geschichte.
Und du formulierst ein Ziel: DIP anwenden.
So ist es ganz häufig. Ein anderer präsentiert ein Problem und hat das Ziel, darauf die TPL oder den EF oder das Strategy Pattern anzuwenden.
Das Muster ist: das Mittel wird zum Ziel, zum Zweck erhoben. Der Bock wird zum Gärtner gemacht. Das halte ich für Cargo Cult: "Wenn ich X anwende, dann wird alles gut. Und das muss doch irgendwie gehen."
Aus dem Blick verloren wird dabei Kontext. Das ist Tunnelblick.
Ich versuche es mal mit einer Analogie:
Da steht einer am Straßenrand mit seinem Auto und kaputtem Motor. Du hältst an und er fragt dich, ob du dich mit Motoren auskennst. Dann beugt ihr euch beide über den Motor und fangt an zu tüfteln. Das dauert Stunden. Am Ende gratuliert ihr euch, es ist geschafft. Der Motor läuft wieder - aber der Geschäftstermin des Autofahrers ist geplatzt.
Der Tunnelblick hat nur noch den Motor gesehen. Der Motor war das Ziel eures ganzen Trachtens. Dabei sind Auto und Motor nur Hilfsmittel, um den Fahrer zu einem Geschäftstermin zu bringen.
Wenn dann der Motor streikt, ist es verständlich, kurz mal zu überlegen, ob man ihn wieder in Gang bringen kann. Das ist ökonomisch. Nur wenn dafür sozusagen eine Timebox abgelaufen ist, tut man gut daran, Alternativen in den Blick zu nehmen, das das wahre Ziel zu erreichen: den Geschäftstermin zu halten.
Wirklich helfendes Verhalten hätte also als erstes danach gefragt, was das eigentliche Ziel ist. "Warum brauchen Sie das Auto?" Und dann hätte man die Alternativen kurz betrachtet und abgewogen. Eine ist natürlich, zu versuchen, den Motor wieder in Gang zu bringen.
Aber zurück zu deinem Code:
Da muss die erste Erkenntnis sein: das Problem ist eben nicht, wie du das DIP anwenden kannst. Das Problem ist, zunächst mal herauszufinden, was denn der Code soll. Worum geht es? Was passiert idealerweise aus Sicht des Anwenders? Das hat nichts mit Klassen oder DIP zu tun.
Im zweiten Schritt geht es um die Abwägung der Alternativen. Dass es vielleicht ganz ohne Code ginge, lasse ich mal außen vor ;-) Soviel nehme ich als Kontext und gesetzt an.
Abwägung der Alternativen bedeutet für mich, dass ich eine Idee davon entwickle, wie der Code eigentlich aussehen sollte für die gewünschte Funktionalität. Er sieht irgendwie aus, ist halt Legacy Code. Aber wie sollte er aussehen? Auch das hat noch immer nichts mit DIP zu tun.
DIP ist ein technisches Mittel, um einen Entwurf, in dem Funktionalität auf Klassen verteilt ist, zu implementieren.
Dann erst kommt für mich die Frage, wie denn der Entwurf zu implementieren wäre. Ob dabei DIP zum Einsatz käme, weiß ich nicht. Und ob dabei Interfaces zum Einsatz kämen, weiß ich auch nicht. Ich habe ja grad keine Problemidee und schon gar keinen Lösungsansatz (Entwurf).
Bottom line: Die CCD Prinzipien sind nur bescheidene Mittel. Keines muss eingesetzt werden. Welches von den SOLID Prinzipien gut angewandt ist, entscheidet der Kontext.
Wenn du etwas über DIP schreiben willst, dann kannst du entweder "die Mechanik" zeigen. Das wird meistens getan. Da sieht man, wie es funktioniert. Das Pattern. In einem Minikontext, wo es irgendwie plausibel ist.
Oder du hast wirklich, wirklich einen Kontext im Sinne eines Entwurfs und einer Übersetzung des Entwurfs, wo es Sinn macht. Wo sich aus dem Entwurf und der davor liegenden Problemstellung ergibt, dass DIP ein wichtiges Mittel zur Erreichung irgendeines explizit zu benennenden Zieles ist.
Ersteres willst du nicht, Leba - glaub ich zumindest.
Für das Zweite fehlen Aufgabenstellung und Entwurf - zumindest bei deinem Posting hier. Aber das ist aus meiner Sicht der einzig wertvolle Ansatz jenseits des Trivialen. Es geht ja um eine Seminararbeit, bei der du eine Transferleistung erbringen willst.
Versuch es doch nochmal. Liefere uns eine Problemstellung, von der du meinst, dass sie hinter dem Legacy Code steht. Schreibe eine kleine User Story. Da sollte beschrieben sein, wie ein Anwender mit dem Programm umgehen will. Was will der erreichen? Kann ja weiterhin eine Konsolenanwendung sein.
Und dann überlegen wir zusammen, wie ein "anatomisch gesunder" Entwurf dafür aussehen sollte.
Und dann überlegen wir, wie dafür Code aussehen sollte.
Und dann überlegen wir, wie der Legacy Code in welchen Schritten möglichst nah an das Ideal herangeführt werden kann.
Vielleicht kommen dabei ja auch SOLID-Prinzipien zum Einsatz :-)
Ich glaube ganz fest, dass wir nur so aus dem typischen reflexhaften Verhalten irgendeines Tooleinsatzes herauskommen. Nur so werden wir den CCD Bausteinen gerecht. Wir müssen sie als immer desponible Mittel sehen.