Okay, wir haben hier ein Dienstprogramm, das Geschäftsmodellklassen aus unseren Datenbanktabellen und -ansichten generiert, die einem ORM ähnlich sind (aber nicht ganz genau). Bei der Pflege ist mir aufgefallen, dass sich die Daten in den Schemata wahrscheinlich nicht sehr ändern werden. Die Funktionalität könnte jedoch. Wir möchten möglicherweise zusätzliche Funktionalität auf dem Weg hinzufügen. Wir möchten vielleicht etwas von dieser Funktionalität generieren, und wir möchten sie möglicherweise erweitern..NET Teilklassen vs. Vererbung
Die Klassen, die wir erstellen, befinden sich in einer Klassenbibliothek für die Verwendung durch andere Bibliotheken und Anwendungen. Keine große Überraschung dort. Aber der Stumper ist hier, wie generierte Klassen so entworfen werden, dass wir so wenig Code wie möglich zerstören, wenn wir eine Klasse neu generieren. Wenn beispielsweise Code zu einer Eigenschaft hinzugefügt wurde (die eine Spalte in einer Datenbanktabelle darstellt), möchten wir diese nicht verlieren.
So gibt es zwei Ansätze, die den Sinn springen:
Klassisches Erbe, wo die ganze Sache in einer einzigen „monolithischen“ Klasse gemacht wird und die Verbraucher sind frei, die Basisimplementierung außer Kraft zu setzen. Dies wird jedoch von Zeit zu Zeit etwas schwierig und wirft häufig Casting-Kopfschmerzen auf. Wenn die abgeleitete Klasse nicht vorsichtig ist und vergisst, Basisklassenfunktionen aufzurufen, können die Dinge schnell schiefgehen.
Teilklassen. In diesem Schema trennen wir das Geschäftsobjekt in verschiedene Teile: die Eigenschaften (die den Spalten zugeordnet werden) und die Verhaltensweisen. Verhaltensweisen könnten sogar weiter in generierte Verhaltensweisen und benutzerdefinierte Verhaltensweisen unterteilt werden. Das Problem mit diesem Ansatz ist, wie Sie sehen können, seine inhärente Komplexität. Außerdem gibt es das Problem der Namensgebung.
Hier ist meine Frage für Sie Leute: Wenn Sie mit einem solchen Szenario (wenn Sie jemals haben), oder wenn Sie mit einem solchen Szenario vorgestellt wurden, welche Lösungen würden Sie in Betracht ziehen, und warum?
Nur um das Benennungsproblem zu kommentieren - meine Erfahrung mit Codegenerierungswerkzeugen ist, dass sie normalerweise nur eine große Datei mit all Ihren Klassen darin erzeugen. Auf diese Weise können Sie Ihren benutzerdefinierten Code einfach in Klassendateien einfügen, die nach Ihrer Klasse benannt sind. Normalerweise kommentieren wir die Kopfzeile, um deutlicher zu machen, dass an anderer Stelle generierter Code vorhanden ist. – womp
Ich stimme diesem Ansatz nicht zu. Langfristige Entwickler pflegen Code in zwei verschiedenen Dateien und kurzfristige Entwickler unterliegen Änderungen außerhalb ihrer Kontrolle (Wenn Sie die Wiederherstellung auf einen bestimmten Zeitplan beschränken, wäre hilfreich). Viel Glück. – eschneider