Advanced Design and Programming - Cheatsheet
Erzeugungsmuster: Singleton, Factory
Definition:
Erzeugungsmuster verwalten die Instanziierung von Objekten, Singleton stellt sicher, dass eine Klasse nur eine Instanz hat, Factory erzeugt Objekte auf Basis von Parametern oder Eingaben.
Details:
- Singleton: Nur eine Instaz einer Klasse, oft für Konfigurationsklassen genutzt.
- Factory Method: Erzeugt Objekte durch Aufruf einer Methode, ermöglicht flexible und erweiterbare Objektgenerierung.
- Abstract Factory: Bietet eine Schnittstelle zur Erstellung verwandter Objekte, ohne deren konkrete Klassen zu spezifizieren.
- Vorteile: Erhöht Modularität und unterstützt die Trennung von Implementierung und Nutzung.
- Nachteile: Kann zu schwer verständlichem Code führen, da die Instanziierung nicht explizit erscheint.
Verhaltensmuster: Observer
Definition:
Ein Verhaltensmuster, bei dem ein Objekt (Subject) eine Liste von abhängigen Objekten (Observer) verwaltet und diese über Zustandsänderungen benachrichtigt.
Details:
- Subject: Verwaltet Observer und benachrichtigt sie bei Zustandsänderungen.
- Observer: Wird über Zustandsänderungen im Subject informiert und reagiert darauf.
- Methoden: \texttt{attach()}, \texttt{detach()}, \texttt{notify()}.
- Schnittstellen: \texttt{Subject}, \texttt{Observer}.
- Vorteile: Entkopplung von Subject und Observer, einfache Erweiterbarkeit.
- Nachteile: Komplexität kann bei vielen Observern steigen, Performance-Overhead möglich.
Fortgeschrittene OOP-Konzepte
Definition:
Fortgeschrittene OOP-Konzepte befassen sich mit komplexeren Aspekten und Techniken der objektorientierten Programmierung, die über die Grundlagen hinausgehen.
Details:
- Vererbung: Hierarchie, Mehrfachvererbung, Diamond Problem
- Abstrakte Klassen: Definition, Unterschiede zu Interfaces
- Interfaces: Implementierung, Bedeutung, Vergleich mit abstrakten Klassen
- Polymorphie: Dynamisches Binden, Überschreiben vs. Überladen
- Design Patterns: Singleton, Factory, Observer, MVC
- Exception Handling in OOP: Ausnahmebehandlung und Fehlerfallmanagement
- Reflection: Laufzeit-Typüberprüfung und -manipulation
- Generics: Typsicherheit, Anwendung in Sammlungen
- Solid Principles: Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion
Generics und Lambda-Ausdrücke
Definition:
Generics ermöglichen es, Klassen, Schnittstellen und Methoden mit Typenparametern zu definieren. Lambda-Ausdrücke ermöglichen es, anonyme Funktionen zu definieren und zu verwenden.
Details:
- Generics erhöhen die Typsicherheit und Wiederverwendbarkeit von Code.
- Syntax Generics:
Klasse
oder Methode(T param)
- Beispiel Generics:
List stringList = new ArrayList<>();
- Lambda-Ausdrücke bieten eine prägnante Syntax für Implementierungen funktionaler Schnittstellen.
- Syntax Lambda:
(Parameter) -> Ausdruck
oder (Parameter) -> {Anweisung}
- Beispiel Lambda:
list.sort((a, b) -> a.compareTo(b));
Parallele Programmierung: Synchronisationstechniken
Definition:
Techniken, um die Koordination und Konsistenz von parallel laufenden Prozessen oder Threads sicherzustellen.
Details:
- Mutex (Mutual Exclusion): Verhindert gleichzeitigen Zugriff auf eine Ressource
- Semaphore: Zählt verfügbare Ressourcen, kontrolliert Zugriff mehrerer Konsumenten
- Spinlock: Aktives Warten auf die Freigabe einer Ressource, oft in Multithread-Systemen genutzt
- Barrier: Synchronisationspunkt, an dem alle Threads warten, bis alle den Punkt erreicht haben
- Condition Variable: Wartet auf eine bestimmte Bedingung oder signalisiert diese
- Lock-free and Wait-free Algorithms: Techniken, bei denen keine Locks verwendet werden, um Deadlocks zu vermeiden
- Atomic Operations: Unteilbare Operationen, die keine Zwischenzustände erlauben
Schichtenarchitektur vs. Mikroservices
Definition:
Schichtenarchitektur: Eine Softwarearchitektur, bei der das System in verschiedene Schichten unterteilt ist, wobei jede Schicht eine bestimmte Funktion erfüllt. Mikroservices: Eine Architekturmethode, bei der eine Anwendung aus kleinen, unabhängigen Diensten besteht, die jeweils eine spezifische geschäftliche Funktion haben.
Details:
- Schichtenarchitektur: Aufteilung in Präsentationsschicht, Logikschicht, Datenschicht.
- Mikroservices: Unabhängige Bereitstellung, Skalierbarkeit, Nutzung verschiedener Technologien pro Service.
- Schichten bieten Modularität, klare Zuständigkeiten.
- Mikroservices erfordern aufwendigere Kommunikation, Datenmanagement.
- Schichtenarchitektur einfacher zu implementieren, Mikroservices bieten bessere Skalierbarkeit.
Automatisierte Testframeworks
Definition:
Automatisierte Testframeworks ermöglichen die automatisierte Ausführung von Unit-, Integrations-, System- und Abnahmetests.
Details:
- Ermöglichen schnelle Rückmeldung über Codequalität und Funktionalität.
- Nutzung von Assertions zur Validierung der Testergebnisse.
- Testabdeckung erhöht den Software-Vertrauenslevel.
- Beliebte Frameworks: JUnit (Java), pytest (Python), NUnit (.NET).
- Continuous Integration/Continuous Deployment (CI/CD) Integration.
- \textit{Test Driven Development} (TDD) unterstützend.
- Reduzierung menschlicher Fehler und Zeitaufwand.
Refactoring: Code-Smells und Tools
Definition:
Verbesserung des bestehenden Codes ohne dessen Funktionalität zu ändern. Identifizierung und Behebung von Code-Smells.
Details:
- Code-Smells: Anzeichen für potenziell schlechte Codequalität. Beispiele: Duplizierter Code, lange Methoden, große Klassen, Switch Anweisungen.
- Refaktorisierungstechniken: Extrahiere Methode, Variablennamen umbenennen, Klassen aufteilen, Parameterlisten reduzieren.
- Tools: IntelliJ IDEA, Eclipse, Visual Studio, SonarQube zur Erkennung von Code-Smells und automatischen Refaktorisierungen.