Ich bin ziemlich neu in den SOLID- Designprinzipien. Ich verstehe ihre Gründe und Vorteile, aber ich kann sie nicht auf ein kleineres Projekt anwenden, das ich als praktische Übung zur Anwendung der SOLID-Prinzipien umgestalten möchte. Ich weiß, dass es nicht notwendig ist, eine perfekt funktionierende Anwendung zu ändern, aber ich möchte sie trotzdem überarbeiten, damit ich Designerfahrung für zukünftige Projekte sammeln kann.
Die Anwendung hat die folgende Aufgabe (eigentlich viel mehr als das, aber lassen Sie es uns einfach halten): Sie muss eine XML-Datei lesen, die Definitionen für Datenbanktabellen / Spalten / Ansichten usw. enthält, und eine SQL-Datei erstellen, die zum Erstellen verwendet werden kann ein ORACLE-Datenbankschema.
(Hinweis: Bitte diskutieren Sie nicht, warum ich es brauche oder warum ich kein XSLT verwende. Es gibt Gründe, aber sie sind nicht thematisch.)
Zunächst habe ich mich nur mit Tabellen und Einschränkungen befasst. Wenn Sie Spalten ignorieren, können Sie dies folgendermaßen angeben:
Eine Einschränkung ist Teil einer Tabelle (oder genauer Teil einer CREATE TABLE-Anweisung), und eine Einschränkung kann auch auf eine andere Tabelle verweisen.
Zuerst erkläre ich, wie die Anwendung im Moment aussieht (ohne SOLID):
Derzeit verfügt die Anwendung über eine "Table" -Klasse, die eine Liste von Zeigern auf Einschränkungen der Tabelle sowie eine Liste von Zeigern auf Einschränkungen enthält, die auf diese Tabelle verweisen. Immer wenn eine Verbindung hergestellt wird, wird auch die Rückwärtsverbindung hergestellt. Die Tabelle verfügt über eine createStatement () -Methode, die wiederum die createStatement () -Funktion jeder Einschränkung aufruft. Diese Methode verwendet selbst die Verbindungen zur Eigentümertabelle und zur referenzierten Tabelle, um deren Namen abzurufen.
Dies gilt natürlich überhaupt nicht für SOLID. Beispielsweise gibt es zirkuläre Abhängigkeiten, die den Code in Bezug auf erforderliche Methoden zum Hinzufügen / Entfernen und einige Destruktoren für große Objekte aufgebläht haben.
Es gibt also ein paar Fragen:
- Sollte ich die zirkulären Abhängigkeiten mithilfe der Abhängigkeitsinjektion auflösen? In diesem Fall sollte die Einschränkung die Tabelle owner (und optional die Tabelle, auf die verwiesen wird) in ihrem Konstruktor erhalten. Aber wie könnte ich dann die Liste der Einschränkungen für eine einzelne Tabelle durchgehen?
- Wenn in der Table-Klasse sowohl der Status von sich selbst (z. B. Tabellenname, Tabellenkommentar usw.) als auch die Links zu Einschränkungen gespeichert sind, handelt es sich dabei um eine oder zwei "Verantwortlichkeiten", die sich auf das Prinzip der Einzelverantwortung beziehen?
- Falls 2. richtig ist, sollte ich nur eine neue Klasse in der logischen Business-Schicht erstellen, die die Links verwaltet? Wenn ja, wäre 1. offensichtlich nicht mehr relevant.
- Sollten die "createStatement" -Methoden Teil der Table / Constraint-Klassen sein oder sollte ich sie auch verschieben? Wenn ja, wohin? Eine Manager-Klasse pro Datenspeicherklasse (dh Tabelle, Einschränkung, ...)? Oder lieber eine Managerklasse pro Link erstellen (ähnlich 3.)?
Immer wenn ich versuche, eine dieser Fragen zu beantworten, renne ich irgendwo im Kreis.
Das Problem wird natürlich viel komplexer, wenn Sie Spalten, Indizes usw. einbeziehen. Wenn Sie mir jedoch mit der einfachen Sache "Tabelle / Einschränkung" helfen, kann ich den Rest möglicherweise selbst herausfinden.