Mehrere Bedingungen effizient prüfen [geschlossen]

8

Ich habe eine Situation, in der ich mehrere Bedingungen überprüfen muss, wobei jede Kombination ein anderes Ergebnis hat. In meiner spezifischen Bedingung habe ich 2 Variablen, die Enum-Typen sind, die jeweils 2 verschiedene Werte sein können.

%Vor%

Das gibt mir 4 mögliche Bedingungen, die 4 verschiedene Ergebnisse erfordern. Ich habe mir verschiedene Möglichkeiten ausgedacht, entweder if-Anweisungen oder switch-Anweisungen:

%Vor%

Oder:

%Vor%

Ich habe an andere gedacht, aber ich möchte das nicht mit Code füllen: P Ich würde gerne wissen, was der beste Weg ist, dies zu tun. Ich denke, der Schalter ist ein bisschen einfacher zu lesen, aber die Wenns sind kürzer. Ich denke, es wäre wirklich cool, wenn Switches mehrere Bedingungen haben könnten, aber ich habe noch nichts davon gehört. Dies wirft auch die Frage auf: Was ist der beste Weg, dies mit einer beliebigen Anzahl von Variablen und möglichen Werten zu tun?

    
Fromen 29.11.2016, 07:26
quelle

8 Antworten

9

Für Ihren kleinen Anwendungsfall würde ich wahrscheinlich verschachtelte if -Anweisungen verwenden. Aber wenn Sie viele enum -Konstanten haben, könnte ein Muster, das Streams verwendet, Ihren Code möglicherweise leichter lesen und warten lassen (für eine kleine Leistungseinbuße). Sie könnten es mit einem Stream wie folgt lösen:

%Vor%

Das würde eine unterstützende Klasse erfordern:

%Vor%     
Per Huss 29.11.2016 08:45
quelle
7

Leistungsunterschiede sind hier wahrscheinlich vernachlässigbar, deshalb würde ich mich auf Kürze und Lesbarkeit konzentrieren. Also würde ich einfach die if etwas vereinfachen, indem ich temporäre Variablen verwende:

%Vor%     
jpa 29.11.2016 10:59
quelle
3

Ich bevorzuge die if Variante ohne Verschachtelung, da sie kurz ist und Sie alle Bedingungen in einer Zeile haben.

Wenn Sie während des Debuggens den Code stoppen, kann es jedoch mühsam werden, da Sie alle vorhergehenden Bedingungen, die O (n) sind, übergehen müssen. Bei der Ausführung des Codes sollte dies keine Rolle spielen, da der Compiler den Code wahrscheinlich optimieren wird.

Es gibt keinen offensichtlichen besten Weg, also müssen Sie etwas experimentieren.

    
Roland Illig 29.11.2016 07:58
quelle
3

Ich bevorzuge definitiv die flache Version, es könnte einfach ein wenig weniger Duplizierung verwenden:

%Vor%

Führen Sie hier aus. Sie könnten es vielleicht sogar noch kürzer und weniger redundant machen, indem Sie einen statischen Import der Enums machen , um zu vermeiden, die Enum-Namen, z. %Code%. Oder wenn Sie bereit sind, einige Kompilierzeitsicherheit aufzugeben, können Sie eine Zeichenfolge übergeben, die in die zwei Enum-Werte konvertiert wird, z. tes.t(COND_1, COND_B) (die Implementierung bleibt dem Leser überlassen).

    
Alex Hall 29.11.2016 12:00
quelle
1

Vielleicht verrückte Idee, aber Sie könnten ein int oder ein Byte mit den Flags konstruieren und es in einem einzigen Schalter verwenden.

%Vor%

...

%Vor%

...

Ich denke, das ist weit davon entfernt, sauberer Code zu sein, aber es sieht besser aus.

    
ELO8C8 29.11.2016 08:08
quelle
1

Wenn ich Sie wäre, würde ich mich auf Bit-Flags verlassen, um nur einen byte zu haben (da Sie nur 4 Anwendungsfälle haben), um eine switch -Anweisung auf diesem byte zu verwalten Anwendungsfälle.

In etwa so:

%Vor%

Dann wären Ihre Tests:

%Vor%     
Nicolas Filotto 29.11.2016 08:26
quelle
1

Ich persönlich würde das vorziehen:

%Vor%

Und die Namen der Methoden könnten lauten: isOrderShippedAndDelivered (), isRequestSendAndAckRecieved ().

Der Grund ist, dass dadurch der Code viel lesbarer wird. Wenn Sie keine Daten haben, die Sie zu diesen if-Anweisungen zurückführen, wird es nicht viel Gewinn machen, diese zu optimieren.

Siehe: Ссылка

    
Yogesh_D 29.11.2016 08:53
quelle
0

Die Art hängt von der Komplexität des Codes und der Anzahl der Kombinationen ab, aber eine andere Option ist ein Wörterbuch mit dem Schlüssel, der ein Tupel Ihrer Enumerationen und einen Wert eines Delegaten für den Code enthält.

    
LoztInSpace 29.11.2016 12:59
quelle

Tags und Links