Ich versuche einen Legacy-Code neu zu faktorisieren und in diesem Fall habe ich einen riesigen Block von switch case, der entscheidet, welcher Befehl ausgeführt werden soll
%Vor%Ansatz 1: Verwendung von Polymorphismus
%Vor%Füllen Sie dann eine Karte mit den verfügbaren Implementierungen:
%Vor%Dann kann ich die Karte verweisen, wenn ich eine Operation durchführen muss.
Die Probleme, die ich mit diesem Ansatz habe, sind die, dass ich eine große Anzahl von Klassen / anonymen Klassen erstellen muss
Ansatz 2: Verwenden von Enum
%Vor%Dieser Ansatz ist eigentlich besser von den zwei, aber ich sah ein anderes Beispiel in Java 8 und möchte so etwas verwenden
Da alle einem Muster folgen, habe ich versucht Functional Interface und Maps
zu verwenden %Vor%Aber das hat wieder die Nachteile des ersten Ansatzes, also wollte ich sehen ob ich lambdas benutzen kann wie ich Enum Implementierung benutzt habe In Java 8 gibt es eine partielle Funktionsimplementierung, die ich verwenden wollte Beispiel:
%Vor%Da BiFunction nur zwei Parameter akzeptiert, habe ich eine Trifuktion wie
erstellt %Vor%Dies wird das Problem in einem gewissen Ausmaß lösen, aber ich bin nicht in der Lage, herauszufinden, wie ich das zur Karte hinzufügen und Werte dynamisch übergeben kann
%Vor% Thx für Ihre Frage, als ich über genau das gleiche Problem stolperte. Ich suchte nach einer Möglichkeit, if if if
oder switch
Blöcke in meinem Code für einige Zeit zu beseitigen.
Ich habe mich für den Ansatz Map
+ Supplier
entschieden, der in einer Factory wie im folgenden Code-Schnipsel implementiert ist:
Ich finde diese Lösung näher am Open / Close-Prinzip (das O in SOLID-Prinzipien):
Operator
-Schnittstelle implementiert, sie in der supportedOperators
-Karte und in SupportedOperatorsRegex
hinzufügt, ohne sie zu ändern der Geschäftslogik der Klasse OperatorFactory
. OperatorFactory
passiert, und das ist weniger Kopplung.