Zum einen sind große Klumpen von if/else
Blöcken nicht einfach zu testen . Jeder neue "Zweig" fügt einen weiteren Ausführungspfad hinzu und erhöht somit die zyklomatische Komplexität . Wenn Sie Ihren Code gründlich testen möchten, müssen Sie alle Ausführungspfade abdecken, und für jede Bedingung müssen Sie mindestens einen weiteren Test schreiben (vorausgesetzt, Sie schreiben kleine, fokussierte Tests). Auf der anderen Seite stellen Klassen, die Strategien implementieren, normalerweise nur eine öffentliche Methode zur Verfügung, die leicht zu testen ist.
Wenn if/else
Sie also geschachtelt sind, werden Sie am Ende viele Tests für einen einzelnen Teil Ihres Codes haben, während Sie mit Strategy wenige Tests für jede der mehreren einfacheren Strategien haben werden. Mit letzterem ist es einfach, eine bessere Abdeckung zu erhalten, da es schwieriger ist, Ausführungspfade zu übersehen.
Wie für Erweiterbarkeit , stellen Sie sich einen Rahmen schreiben, wo die Nutzer sollen der Lage sein , ihr eigenes Verhalten zu injizieren. Beispielsweise möchten Sie eine Art Steuerberechnungsrahmen erstellen und Steuersysteme verschiedener Länder unterstützen. Anstatt sie alle zu implementieren, möchten Sie den Framework-Benutzern lediglich die Möglichkeit geben, eine Implementierung zur Berechnung bestimmter Steuern bereitzustellen.
Hier ist das Strategiemuster:
- Sie definieren z. B. eine Schnittstelle
TaxCalculation
und Ihr Framework akzeptiert Instanzen dieses Typs, um Steuern zu berechnen
- Ein Benutzer des Frameworks erstellt eine Klasse, die diese Schnittstelle implementiert und an Ihr Framework übergibt. Auf diese Weise können Sie einen Teil der Berechnungen durchführen
Sie können nicht dasselbe mit tun if/else
, da dies eine Änderung des Code des Frameworks erforderlich machen würde. In diesem Fall wäre es kein Framework mehr. Da Frameworks häufig in kompilierter Form verteilt werden, ist dies möglicherweise die einzige Option.
Selbst wenn Sie nur normalen Code schreiben, ist Strategy von Vorteil, da es Ihre Absichten klarer macht. Es heißt "Diese Logik ist steckbar und bedingt", dh es kann mehrere Implementierungen geben, die je nach Benutzeraktionen, Konfiguration oder sogar Plattform variieren können.
Die Verwendung des Strategy-Musters kann die Lesbarkeit verbessern, da eine Klasse, die eine bestimmte Strategie implementiert, normalerweise einen beschreibenden Namen haben sollte. Beispielsweise USAIncomeTaxCalculator
sind if/else
Blöcke "namenlos", im besten Fall nur kommentiert, und Kommentare können lügen. Außerdem ist es nach meinem persönlichen Geschmack if/else
nicht lesbar , nur mehr als drei Blöcke hintereinander zu haben, und bei verschachtelten Blöcken wird es ziemlich schlimm.
Das Open / Closed-Prinzip ist ebenfalls sehr relevant, da Sie mit Strategy, wie im obigen Beispiel beschrieben, eine Logik in einigen Teilen Ihres Codes erweitern können ("Open for Extension"), ohne diese Teile neu schreiben zu müssen ("Closed for Modification"). ).