Advanced Design and Programming (5-ECTS) - Cheatsheet
Definition und Zweck von Entwurfsmustern
Definition:
Wiederverwendbare Lösungen für wiederkehrende Probleme in der Softwareentwicklung.
Details:
- Standardisierte Entwürfe für komplexe Softwarestrukturen
- Verbessern Kommunikation unter Entwicklern
- Ermöglichen effektive und effiziente Entwicklung
- Reduzieren Entwicklungszeit und Fehler
- Beispiele: Singleton, Factory, Observer
Wichtige Design Patterns wie Singleton, Factory, Observer und Strategie
Definition:
Design Patterns: Wiederverwendbare Lösungen für häufig auftretende Probleme in der Softwareentwicklung.
Details:
- Singleton: Stellt sicher, dass eine Klasse nur eine Instanz hat und bietet einen globalen Zugriffspunkt.
- Factory: Ermöglicht die Erstellung von Objekten, ohne den genauen Klassennamen der zu erstellenden Objekte anzugeben.
- Observer: Definiert ein 1-zu-N-Abhängigkeitsverhältnis zwischen Objekten, sodass bei einer Zustandsänderung eines Objekts alle abhängigen Objekte benachrichtigt und aktualisiert werden.
- Strategie: Definiert eine Familie von Algorithmen, kapselt jeden Algorithmus und macht sie untereinander austauschbar.
Prinzipien und Werte des Agilen Manifests
Definition:
Prinzipien und Werte des Agilen Manifests betonen Flexibilität, Zusammenarbeit und Reaktionsfähigkeit in der Softwareentwicklung.
Details:
- Individuen und Interaktionen über Prozesse und Werkzeuge
- Funktionierende Software über umfassende Dokumentation
- Zusammenarbeit mit dem Kunden über Vertragsverhandlung
- Reagieren auf Veränderung über das Befolgen eines Plans
- 12 Prinzipien: Kundenzufriedenheit, Willkommene Änderungen, Häufige Auslieferung, Tägliche Zusammenarbeit, Motivierte Einzelpersonen, Face-to-Face-Kommunikation, Funktionierende Software, Nachhaltige Entwicklung, Technische Exzellenz, Einfachheit, Selbstorganisierte Teams, Regelmäßige Reflexion und Anpassung
Identifikation von Code-Smells
Definition:
Erkennen von Programmiermustern, die auf ein Problem im Code hinweisen, aber keine direkten Bugs sind.
Details:
- Common types: z.B. 'Duplicate Code', 'Long Method', 'Large Class'
- Tools für Erkennung: z.B. SonarQube, PMD
- Ziele: Verbesserung der Code-Qualität und Wartbarkeit
- Kategorie: Erkennungsmuster, Antipatterns
- Meistens Hinweis auf tieferliegende Designprobleme
Grundprinzipien und Vorteile von Testgetriebener Entwicklung (TDD)
Definition:
Kurze Iterationen bei der Softwareentwicklung: Test schreiben, bevor der Code geschrieben wird. Zyklus: Test schreiben, Code schreiben, Refaktorisieren.
Details:
- Red-Green-Refactor-Zyklus: Erst testen (rot), dann minimaler Code (grün), schließlich Refaktorisierung.
- Erhöhte Code-Qualität und weniger Fehler.
- Bessere Testabdeckung und Wartbarkeit.
- Fokussierung auf Anforderungen und schnelle Rückmeldung.
- Ermöglicht kontinuierliche Integration.
Prinzipien des modularen Designs
Definition:
Konzepte zur Unterteilung eines Systems in kleinere, unabhängige Module, die getrennt entwickelt und gewartet werden können.
Details:
- Kohäsion: Einheitliche Funktionalität innerhalb eines Moduls
- Kopplung: Minimierung der Abhängigkeiten zwischen Modulen
- Wiederverwendbarkeit: Module können in verschiedenen Kontexten wiederverwendet werden
- Erweiterbarkeit: Einfache Erweiterung oder Veränderung von Modulen ohne Einfluss auf andere Teile des Systems
- Verfolgbarkeit: Nachvollziehbarkeit der Abhängigkeiten zwischen Modulen
Verwendung von Schnittstellen und Abstraktionen
Definition:
Verwendung von Schnittstellen (Interfaces) und Abstraktionen zur Förderung der Modularität und Flexibilität im Systemdesign.
Details:
- Trennen von Implementierung und Schnittstelle
- Fördert Wiederverwendbarkeit und Testbarkeit
- Ermöglicht polymorphes Verhalten
- Statische Typprüfung bei Verwendung von Interfaces
- \textbf{Syntax Beispiele:} \texttt{interface IExample} für Schnittstellen; \texttt{abstract class Example} für abstrakte Klassen
- Interfaces: keine Implementierung (nur Methodensignaturen)
- Abstrakte Klassen: können sowohl abstrakte Methoden (ohne Implementierung) als auch konkrete Methoden enthalten
Schreiben effektiver Unit-Tests
Definition:
Effektive Unit-Tests prüfen isoliert die kleinsten testbaren Einheiten des Codes, typischerweise Funktionen oder Methoden, um sicherzustellen, dass sie wie erwartet funktionieren.
Details:
- Verwendung von Assertionen zur Überprüfung der erwarteten Ausgaben: \texttt{assertEqual(), assertTrue(), assertFalse()}
- Isolierung der Testfälle: Verwendung von Mocking, um Abhängigkeiten von externen Systemen zu vermeiden
- Testabdeckung sicherstellen: alle möglichen Codepfade und Randfälle abdecken
- Kurze, prägnante Tests schreiben, die nur eine Sache überprüfen
- Automatisierte Ausführung und kontinuierliche Integration verwenden