This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
design_patterns [2025/06/27 20:16] 172.19.0.1 old revision restored (2024/10/12 04:21) |
design_patterns [2025/07/03 10:35] (current) 172.19.0.1 old revision restored (2025/07/01 01:11) |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Design Patterns ====== | ||
+ | |||
+ | **//Ein Muster//** ist eine Lösung eines Problems in einem bestimmten Kontext. | ||
+ | * Der **Kontext** ist die Situation, in der das Muster angewendet wird. Es sollte eine wiederkehrende Situation sein | ||
+ | * Das **Problem** umfasst das Ziel, das Sie in diesem Kontext erreichen möchten, aber auch alle Einschränkungen (oder Randbedingungen), | ||
+ | * Die **Lösung** ist das, was Sie gern hätten: Ein allgemeiner Entwurf, mit dem jeder das Ziel erreichen und diesen Satz von Einschränkungen überwinden kann. | ||
+ | |||
+ | **// | ||
+ | |||
+ | Musterkategorien: | ||
+ | |||
+ | **// | ||
+ | * Singleton | ||
+ | * Builder | ||
+ | * Prototype | ||
+ | * Factory Method | ||
+ | * Abstract Factory | ||
+ | |||
+ | **// | ||
+ | * Mediator | ||
+ | * Visitor | ||
+ | * Template Method | ||
+ | * Iterator | ||
+ | * Command | ||
+ | * Memento | ||
+ | * Interpreter | ||
+ | * Observer | ||
+ | * Chain of Responsibility | ||
+ | * State | ||
+ | * Strategy | ||
+ | |||
+ | **// | ||
+ | * Proxy | ||
+ | * Decorator | ||
+ | * Composite | ||
+ | * Facade | ||
+ | * Flyweigth | ||
+ | * Bridge | ||
+ | * Adapter | ||
+ | |||
+ | **// | ||
+ | Packt ein Objekt ein und fügt dabei neues Verhalten hinzu | ||
+ | |||
+ | **// | ||
+ | Kapselt zustandsbasiertes Verhalten und wechselt durch Delegieren zwischen den Verhaltensweisen. | ||
+ | |||
+ | **// | ||
+ | Bietet eine Möglichkeit, | ||
+ | |||
+ | **// | ||
+ | Vereinfacht die Schnittstelle für eine Gruppe von Klassen. | ||
+ | |||
+ | **// | ||
+ | Kapselt austauschbares Verhalten und entscheidet mittels Delegierung, | ||
+ | |||
+ | **// | ||
+ | Umschließt ein Objekt und kontrolliert so den Zugriff darauf | ||
+ | |||
+ | **//Factory Method// | ||
+ | Unterklassen entscheiden, | ||
+ | |||
+ | **// | ||
+ | Umschließt ein Objekt und stellt eine andere Schnittstelle dafür zur Verfügung. | ||
+ | |||
+ | **// | ||
+ | Ermöglicht die Benachrichtigung von Objekten, wenn sich eine Zustand ändert. | ||
+ | |||
+ | **// | ||
+ | Unterklassen entscheide, wie die Schritte ein einem Algorithmus implementiert werden. | ||
+ | |||
+ | **// | ||
+ | Clients behandeln Sammlungen von Objekten und Einzelobjekten auf gleiche Weise. | ||
+ | |||
+ | **// | ||
+ | Sorgt dafür, dass nur genau ein Objekt erzeugt wird. | ||
+ | |||
+ | **// | ||
+ | Ermöglicht des einem Client, Familien von Objekten zu erstellen, ohne konkrete Klassen anzugeben. | ||
+ | |||
+ | **// | ||
+ | Kapselt einen Auftrag als in Objekt. | ||
+ | |||
+ | Punkt für Punkt: | ||
+ | * Verwenden Sie Muster in Ihren Entwürfen nur dann, wenn es sich auf natürliche Weise ergibt, und nicht zwangsweise, | ||
+ | * Entwurfsmuster sind nicht in Stein gemeißelt; Sie können sie so anpassen und zurecht biegen, wie Sie sie gerade brauchen. | ||
+ | * Verwenden Sie immer die einfachste Lösung, die Ihren Anforderungen entspricht, selbst wen sie kein Muster umfasst. | ||
+ | * Studieren Sie Musterkataloge, | ||
+ | * Mit Musterklassifikationen (oder -kategorien) lassen sich Muster in Gruppen einteilen. Wenn es Ihnen weiterhilft, | ||
+ | * Um selbst Muster zu schreiben, müssen Sie viel Engagement, Zeit und Geduld mitbringen, und Sie müssen bereit sein, eine Menge Code-Verbesserungen durchzuführen. | ||
+ | * Denken Sie daran, dass die meisten Muster, denen Sie begegnen werden, Anpassungen existierender Muster sind und keine neuen Muster. | ||
+ | * Erweitern Sie das gemeinsame Vokabular in Ihrem Team - einer der größten Vorteile, die Sie aus der Verwendung von Mustern ziehen können. | ||
+ | * Wie jede Gemeinschaft hat auch die Mustergemeinde ihren eigenen Fachjargon. Lassen Sie sich davon nicht abschrecken. | ||
+ | |||
===== OO-Basics ===== | ===== OO-Basics ===== | ||
Line 6: | Line 99: | ||
* Inheritance | * Inheritance | ||
+ | ===== OO-Principles ===== | ||
+ | * Kapseln Sie das, was variiert. | ||
+ | * Ziehen Sie die Komposition der Vererbung vor. | ||
+ | * Programmieren Sie auf ein Schnittstelle, | ||
+ | * Streben Sie für Objekte, die interagieren, | ||
+ | * Klassen sollten für Erweiterung offen, aber für Veränderung geschlossen sein. | ||
+ | * Stützen Sie sich auf Abstraktionen. Stützen Sie sich nicht auf konkrete Klassen (Dependency Inversion Principle). | ||
+ | * Sprechen Sie nur mit Ihren engsten Freunden (Prinzip der Verschwiegenheit). | ||
+ | * Versuchen Sie nicht, uns anzurufen, wir rufen Sie an (Hollywood-Prinzip). | ||
+ | * Eine Klasse sollte nur einen Grund haben, sich zu ändern. | ||
+ | |||
+ | Dependency Inversion Principle - Policies: | ||
+ | * Keine Variable sollte eine Referenz auf eine konkrete Klasse halten. Wenn Sie **new** verwenden, halten Sie eine Referenz auf eine konkrete Klasse.Verwenden Sie eine Factory, um das zu umgehen. | ||
+ | * Keine Klasse sollte von einer konkreten Klasse abgeleitet sein. Wenn Sie von einer konkreten Klasse ableiten, sind Sie von einer konkreten Klasse abhängig. Leiten Sie von einer Abstraktion wie einem Interface oder einer abstrakten Klasse ab. | ||
+ | * Keine Methode sollte eine implementierte Methode einer ihrer Basisklassen überschreiben. Wenn Sie eine implementierte Methode überschreiben, | ||
+ | Das Prinzip der Verschwiegenheit - Policies: | ||
+ | * Jede Methode eines Objektes sollte nur Methoden aufrufen, die zum Objekt selbst, | ||
+ | * zu Objekten, die der Methode als Parameter übergeben wurde, | ||
+ | * zu Objekten, die die Methode erstellt oder instantiiert, | ||
+ | * zu Komponenten des Objekts gehören. | ||
===== OO-Patterns ===== | ===== OO-Patterns ===== | ||