Programmarchitektur
Sprachübergreifende Prinzipien und Konzepte für das strukturierte Schreiben, Warten und Erweitern von Quelltext
Einleitung
Zuerst wird der Unterschied zwischen Effektivität (Maximalprinzip) und Effizienz (Minimalprinzip) besprochen.
Entscheidend für die Effektivität bei der Erstellung von Quelltext und die Qualität (Fehlerfreiheit und Effizienz) von erzeugtem Maschinencode ist, wie Anweisungen zu Quelltextblöcken zusammengefasst und diese miteinander verbunden werden. In Anlehnung an die Erschaffung von Bauwerken wird dieser wichtige Teilbereich der Programmierung als "Programmarchitektur" bezeichnet.
Im Kurs werden zuerst Qualitätsanforderungen besprochen und dann Ziele für die Erfüllung der Anforderungen formuliert. Dabei wird nicht nur das Ergebnis in Form von Maschinencode betrachtet, sondern auch das Vorgehen bei der Erstellung des Quelltexts.
Zur Orientierung wird kurz auf einige etablierte Lösungsansätze (Pattern) hingewiesen.
Als Quintessenz des Kurses werden dann formale Prinzipien und inhaltliche Konzepte vorgestellt, mit denen die Ziele einfach und zuverlässig erreicht werden können.
Anforderungen an Quelltext
Erzeugter Maschinencode muss funktionieren.
Erzeugter Maschinencode muss effizient sein.
Erstellung des Quelltexts muss effektiv sein.
Wartung muss problemlos möglich sein.
Erweiterungen müssen problemlos möglich sein.
Ziele für die Umsetzung
Übersichtliche Projektstruktur
Keine redundanten Quelltextblöcke
Leicht nachvollziehbarer Programmierstil
Transparente Verbindung der Quelltextblöcke
Aussagekräftige Namensgebung
Formale Prinzipien für das Erreichen der Ziele
Für Klassen jeweils eine Datei
Trennung von View und Business Logic
Trennung der View in deklarative Markupsprache und Codebehind
Trennung der Business Logic nach Aufgabenbereichen
Trennung der Aufgabenbereiche in Controller und Services
Eigene Klasse für alle Konstanten
Eigene Klasse für in mehreren Klassen verwendete Variablen
Startup-Klasse für Setup von Variablen
Aussagekräftige Ordnerstruktur
Inhaltliche Konzepte für die Umsetzung der Ziele
Single-Responsibility-Prinzip für Klassen und Methoden
Verwendung der Zugriffsmethoden von Properties
Interfaces mit Interface Segregation
Klassenhierarchie mit Dependency Injection
Programmsteuerung mit Klassen und Methoden (Domain-Driven)
Programmsteuerung mit Events (Event-Driven)
Statische Variablen für Ergebnisse