Scaleton
Scaleton ist eine Programmbibliothek und ein VisualStudio-PlugIn für die Generierung von Quellcode für Domänenmodelle.
Scaleton ist eine Programmbibliothek und ein VisualStudio-Plugin für das Generieren von Quellcode für Domänenmodelle.
Ziel des Projektes ist es, sich wiederholende und nicht kreative Arbeit bei der Implementierung von Klassen für ein Domänenmodell zu automatisieren.
Der Bedarf für einen solchen Code-Generator ergab sich für mich aus dem Programmiereralltag mit C#. Um ein Modell für eine konkrete Anwendungsdomäne zu implementieren reicht es in der Regel nicht, die Klassen und Attribute zu definieren. Meist werden die Klassen im Zusammenhang mit einem UI- und Persistenz-Framework verwendet, was dazu führt, dass für jede Klasse zusätzliche Schnittstellen implementiert werden müssen. Des Weiteren müssen für einige Klassen oft auch Methoden wie Equals(), GetHashCode() oder ToString() überschrieben werden. Und auch wenn die Anzahl der zusätzlich zu implementierenden Methoden oft überschaubar bleibt, kann man gerade bei diesen Grundlagen eine ganze Reihe schwer zu erkennender Fehler machen. Die Implementierung dieser Schnittstellen erfordert jedoch keine neue Algorithmen, Strategien oder Lösungsansätze. Im Gegenteil - das Implementieren von Framework-Schnittstellen wie IComparable<T> oder INotifyPropertyChanged ist sehr mechanisch. Durch die vielen Zeilen manuelle geschriebenen Quellcode, der eigentlich keinen inhaltlichen Beitrag zum Modell leistet, wird es bei größeren Modellen aber zunehmend aufwändig das Modell zu ändern oder es zur Zusammenarbeit mit einem neuen Framework zu bewegen.
Scaleton als Code-Generator begegnet diesen Schwierigkeiten mit einem einfachen Ansatz: Das Domänenmodell mit seinen Klassen und Attributen wird in einer XML-Datei beschrieben und das VisualStudio-PlugIn generiert dafür automatisch den entsprechenden Quellcode. Die Vorteile sind eine garantiert fehlerfreie Implementierung von Schnittstellen und überschriebenen Methoden und die Möglichkeit Schnittstellen für einzelne Klassen oder ein ganzes Modell einfach an- und abschalten zu können. Klassen und Attribute werden also unabhängig von den benötigten Schnittstellen definiert. Das Modell kann so deutlich schneller an neue Erfordernisse angepasst werden. Typischerweise muss man für ein Modell das in 1000 Zeilen C#-Code implementiert wird nur 100 Zeilen XML schreiben. Und die Modelldefinition in XML ist dazu noch wesentlich übersichtlicher und kann auch einfach als Grundlage für weitere Artefakte wie z.B. eine Modellübersicht verwendet werden.
Es gibt verschiedene Philosophien für ein Domänenmodell. So gibt es die ereignisgetriebenen Komponenten wie sie in z.B. Windows Forms zum Einsatz kommen und Datenbindungen erlauben. Mit dem WPF-Framework wurde das Konzept von Dependency-Properties eingeführt. Es gibt die Philosophie der POCOs (Plain old CLR Objects) und dann gibt es natürlich noch im aktuellen Siegeszuges der funktionalen Programmiersprachen die unveränderlichen Wert-Typen. Diese Philosophien sind weitgehend unabhängig von den semantischen Elementen eines Domänenmodells (Klassen, Attribute, Relationen) und doch dominieren sie die Implementierung der Modelle.
Mit Scaleton kann ein Domänenmodell auf semantischer Ebene definiert werden und die Entscheidung, ob das Modell in Form von ereignisgetriebenen Komponenten oder durch unveränderliche Werttypen implementiert werden soll, kann jederzeit ohne Implementierungsaufwand geändert werden.
Ein Fernziel des Projektes ist es, über die einfachen Framework-Schnittstellen wie INotifyPropertyChanged, IChangeTracking und IRevertableChangeTracking hinaus auch die Aktivierung einer Modell-History zu unterstützen. So dass die aufwändige und fehleranfällige Implementierung von Rückgängig-Befehlen für interaktive Anwendungen vereinfacht wird.
Die Entwicklung von Scaleton ist besonders interessant, da sie viele Bereiche der Informatik und Programmierung berührt. Unter anderem Compiler-Bau, aspektorientierte Programmierung und Metaprogrammierung.