Refactoring einer komplizierten If-Bedingung

7

Kann jemand den besten Weg vorschlagen, die meisten Bedingungen zu vermeiden? Ich habe unten Code, ich möchte die meisten Fälle vermeiden, wenn Bedingungen, wie es geht? Jede Lösung ist eine große Hilfe;

%Vor%     
kumar kasimala 05.05.2010, 10:21
quelle

10 Antworten

6

Ich denke, das funktioniert. Ich habe deine boolesche Logik grundlegend verallgemeinert. Beim nächsten Mal sollten Sie einige Diagramme zeichnen, um Ihre Gedanken zu löschen.

Bearbeiten: Ich möchte aus den Kommentaren zu diesem Post hervorheben, dass die XOR-Lösung von Marcelo und BlueRaja in ihrer Funktion identisch ist.

%Vor%     
Xavier Ho 05.05.2010, 10:38
quelle
18

Wie man das macht ... Lassen Sie uns ein paar Methoden herausarbeiten, damit wir die Logik besser sehen können.

%Vor%

Nun, wenn ich es anschaue, diesen ersten Block

%Vor%

macht nur a() , wenn adjustment.increaseVATLine ansonsten den gleichen Wert wie adjustment.vatItem.isSalesType , b() hat. Also können wir es reduzieren:

%Vor%

Und der verbleibende Block ist derselbe, indem nur a() und b() umgekehrt werden:

%Vor%

Wir beginnen also, die Logik zu sehen. Wenn es sich um eine Erhöhung handelt und die increaseVATLine dem isSalesType entspricht, werden wir belasten, andernfalls kreditieren, aber wenn es sich um eine Abnahme handelt, werden wir nur gutgeschrieben, wenn sie nicht übereinstimmen. Was ist eine gute Art das auszudrücken? Nun, zum einen, nenne a () und b () schlauer - jetzt, wo wir sehen können, was sie tun

%Vor%

Und jetzt ist es noch ein bisschen klarer. Soll das Konto abgebucht werden, wenn es sich um ein Kontokorrentkonto und eine Mehrwertsteuererhöhung handelt, und um eine Umsatzart, oder wenn es sich um eine Kürzung handelt, handelt es sich entweder um eine Umsatzsteuerzeile oder um eine Verkaufsart, aber nicht um beides. Hilft diese Wahrheitstabelle? Die erste Spalte ist adjustmentAmount.isIncrease ; Sekunde ist adjustment.increaseVATLine ; Das dritte ist adjustment.vatItem.isSalesType . Vierte Spalte ist D für Debit, C für Kredit; In Klammern steht die Anzahl der TRUE-Werte unter den Flags.

%Vor%

Jetzt können Sie sehen, warum die Lösung von @Xavier Ho funktioniert; die ungeraden Summen sind alle Abbuchungen, die geraden alle Abschriften.

Dies ist nur ein explorativer Pfad; Ich hoffe, es ist hilfreich.

    
Carl Manaster 05.05.2010 17:06
quelle
8

Ich habe die Logik nicht gründlich überprüft, aber das ist die Grundidee:

%Vor%

Ich sollte beachten, dass diese Logik insofern etwas anders ist, als sie einen negativen Wert von adjustment.total richtig behandelt, während das Original (vielleicht richtig) davon ausgeht, dass der Wert immer nicht negativ sein wird.

    
Marcelo Cantos 05.05.2010 10:32
quelle
6

Sie könnten eine Wahrheitstabelle wie folgt verwenden:

%Vor%

Es gibt keine Wenns und Sie können leicht sehen, in welchen Fällen die Last 0 ist. Dasselbe gilt für den Kredit.

    
kgiannakakis 05.05.2010 10:34
quelle
5

An Martin Smith Kommentar Ich füge hinzu:

Denken Sie daran, Karnaugh kann Ihnen helfen, den Zustand des if zu vereinfachen.

    
Toni Penya-Alba 05.05.2010 10:36
quelle
4

Frage wurde beantwortet, aber ich werde hier für diejenigen posten, die sich um eine sauberere Lösung sorgen:

%Vor%     
quelle
3

Es sieht so aus, als hätten Sie nur 2 Fälle, also könnten Sie sie mit ODER UND usw. kombinieren.

%Vor%     
Martin Smith 05.05.2010 10:28
quelle
1

Wenn Sie eine bedingte Logik haben (z. B. etwas tun, wenn eine Bedingung erfüllt ist), warum sollten Sie diese überhaupt vermeiden?

    
Owen Orwell 05.05.2010 10:25
quelle
1

Was Sie normalerweise tun können, um die Situation etwas zu erleichtern, ist die Verwendung der Vererbung.

Wenn Sie zum Beispiel zwei Klassen Increase und NonIncrease haben, die Unterklassen derselben Oberklasse sind, können Sie eine Methode doSomething haben, die - naja - etwas, was immer Sie gerade haben. Sie müssen dann nicht überprüfen, "ob Objekt X ist", sondern einfach .doSomething () aufrufen und es tut was immer es tun soll.

Sie können dann weiter gehen und mehr und mehr Unterklassen haben, um "weiter zu verfeinern" und "mehr Wenns zu vermeiden".

Es gibt andere Möglichkeiten (hauptsächlich abhängig von Ihrer Umgebung / Ihren Anforderungen) wie Funktionszeiger, Delegaten, das Strategie-Pattern (GoF) oder solche Konstrukte.

    
scherand 05.05.2010 10:33
quelle
1

Die beste Lösung besteht darin, einem Designmuster zu folgen. Ein zustandsbasiertes Entwurfsmuster definiert eine Klasse für jeden Zustand.

Die Zustandsklasse kapselt dann den Handlungsablauf für diesen bestimmten Zustand ein. Dies verhindert nicht nur eine große Menge von if -else-Anweisung Mesh.

    
frictionlesspulley 05.05.2010 20:40
quelle