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%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%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:
Und der verbleibende Block ist derselbe, indem nur a()
und b()
umgekehrt werden:
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.
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.
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.
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.
An Martin Smith Kommentar Ich füge hinzu:
Denken Sie daran, Karnaugh kann Ihnen helfen, den Zustand des if zu vereinfachen.
Frage wurde beantwortet, aber ich werde hier für diejenigen posten, die sich um eine sauberere Lösung sorgen:
%Vor%Es sieht so aus, als hätten Sie nur 2 Fälle, also könnten Sie sie mit ODER UND usw. kombinieren.
%Vor%Wenn Sie eine bedingte Logik haben (z. B. etwas tun, wenn eine Bedingung erfüllt ist), warum sollten Sie diese überhaupt vermeiden?
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.
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.
Tags und Links java conditional refactoring if-statement