Refactor einen Schalter Fall mit Java-Lambdas

8

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%     
Sudheer 09.11.2015, 06:52
quelle

2 Antworten

5

Du bist schon da. Wenn Sie eine Methode haben, die die gleiche Signatur Ihrer Schnittstelle hat, können Sie sie auch an Ihr Operations-Repository übergeben:

%Vor%     
Flown 16.11.2015, 08:24
quelle
0

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:

%Vor%

Ich finde diese Lösung näher am Open / Close-Prinzip (das O in SOLID-Prinzipien):

  1. Jetzt muss ich nur noch eine weitere Operator-Klasse hinzufügen, die eine von mir anders definierte Operator -Schnittstelle implementiert, sie in der supportedOperators -Karte und in SupportedOperatorsRegex hinzufügt, ohne sie zu ändern der Geschäftslogik der Klasse OperatorFactory .
  2. Außerdem müssen die Client-Klassen nicht wissen, was in OperatorFactory passiert, und das ist weniger Kopplung.
avi613 30.11.2016 23:00
quelle

Tags und Links