Design Pattern zur Implementierung von Business Rules mit Hunderten von if else in Java
Habe ich die Umsetzung bestimmter Geschäftsregeln mit Hunderten von Zeilen code unten
if this
then this
else if
then this
.
. //hundreds of lines of rules
else
that
Haben wir keine design-Muster, die effektiv implementieren diese oder die Wiederverwendung von code, sodass Sie angewendet werden können, um alle unterschiedlichen Regeln.
Ich habe gehört, der Spezifikation Muster, das erzeugt so etwas wie unten
public interface Specification {
boolean isSatisfiedBy(Object o);
Specification and(Specification specification);
Specification or(Specification specification);
Specification not(Specification specification);
}
public abstract class AbstractSpecification implements Specification {
public abstract boolean isSatisfiedBy(Object o);
public Specification and(final Specification specification) {
return new AndSpecification(this, specification);
}
public Specification or(final Specification specification) {
return new OrSpecification(this, specification);
}
public Specification not(final Specification specification) {
return new NotSpecification(specification);
}
}
Und danach die Umsetzung Ist,Und -, Oder-Methoden, aber ich denke, dass diese nicht speichern, die mir schreiben, die if -, else(kann mein Verständnis falsch ist)...
Gibt es keinen besten Ansatz zur Umsetzung eines solchen business-Regeln, die so viele if else-Anweisungen?
EDIT : Nur ein Beispiel.A,B,C usw. sind Eigenschaften, die einer Klasse.Abgesehen von diesen gibt es ähnlich wie viele andere Regeln.Ich wnat, um einen generischen code für diese.
If <A> = 'something' and <B> = ‘something’ then
If <C> = ‘02’ and <D> <> ‘02’ and < E> <> ‘02’ then
'something'
Else if <H> <> ‘02’ and <I> = ‘02’ and <J> <> ‘02’ then
'something'
Else if <H> <> ‘02’ and <I> <> ‘02’ and <J> = ‘02’ then
'something'
Else if <H> <> ‘02’ and <I> = ‘02’ and <J> = ‘02’ then
'something'
Else if <H> = ‘02’ and <I> = ‘02’ and <J> <> ‘02’ then
'something'
Else if <H> = ‘02’ and <I> <> ‘02’ and <J> = ‘02’ then
'something'
Else if <H> = ‘02’ and <I> = ‘02’ and <J> = ‘02’ then:
If <Q> = Y then
'something'
Else then
'something'
Else :
Value of <Z>
InformationsquelleAutor der Frage SCoder | 2013-05-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Strategie-Muster hier ganz nützlich sein könnte. Bitte überprüfen Sie Ersetzen Sie Bedingte Logik und Strategie
InformationsquelleAutor der Antwort vishal_aim
Können Sie Befehl Muster oder Factory pattern.
Befehl Muster kann verwendet werden, zu ersetzen, die sperrig-Schalter/if-Blöcke, die dazu neigen, zu wachsen, auf unbestimmte Zeit, wie Sie neue Optionen hinzufügen.
erstellen Sie dann eine
Map<String,Command>
Objekt, und füllen Sie es mit dem Befehl Instanzen:dann können Sie ersetzen Ihre if/else if-Kette mit:
In Fabrik-Muster Sie Ihre if/switch in einer Fabrik, die kümmert sich um die Hässlichkeit und blendet die fülle von ifs. Beispiel-code für die Fabrik-Muster.
InformationsquelleAutor der Antwort fortytwo
Etwas, das helfen könnte, ist eine Regel-engine wie Drools. Es ist nicht ein design-Muster, obwohl, so kann dies nicht die Antwort, die Sie suchen. Aber IMO sollten Sie es. Hier ist ein toller Artikel auf Wann sollten Sie die Verwendung einer rules engine.
InformationsquelleAutor der Antwort Daniel Kaplan
Einem design-Muster kann Ihnen helfen, um den code lesbarer zu gestalten oder zu verbessern die Verwaltbarkeit, aber wenn Sie wirklich brauchen, um zu bewerten eine solche Anzahl von Bedingungen, die IF-Anweisungen können nicht vermieden werden.
Ich würde sehen das problem aus einer anderen Sicht (z.B.: brauche ich wirklich hundert bedingte Anweisungen, um das problem zu lösen?) und ich würde versuchen zu verändern oder zu verbessern, die Algorithmus.
Einer Die Expression Language könnte einige helfen, weil Sie programmatisch einen string für jede IF-Anweisung und zu bewerten und das Ergebnis mit diesem Werkzeug, aber Sie haben immer noch das problem zu lösen mit der Ausführung der besonderen Logik, die mit jedem Zustand.
InformationsquelleAutor der Antwort Gabriel Aramburu
Einer einfachen Strategie demo mit python:
InformationsquelleAutor der Antwort lancerex
Sollten Sie sich die Regeln-Entwurfsmuster http://www.michael-whelan.net/rules-design-pattern/. Es sieht sehr ähnlich zu der von Beispiel-code, den Sie gab, und besteht aus einer Basis-Schnittstelle definiert eine Methode für die Bestimmung, wenn eine Regel erfüllt ist und dann verschiedene konkrete Implementierungen gemäß unterschiedlichen Regeln. Als ich verstehen es, Ihre switch-Anweisung würde in eine Art einfache Schleife, die nur bewertet Dinge, bis Ihre Zusammensetzung Regeln ist entweder zufrieden ist oder fehlschlägt.
Zusammensetzung Regeln:
Einige service-Methode läuft in der Regel auf eine Sache.
class SomeService {
public auswerten(IRule Regel, Sache, Ding) {
zurück Regel.isSatisfied(Sache);
}
}
Verwendung:
Diese wurde auch hier beantwortet: https://softwareengineering.stackexchange.com/questions/323018/business-rules-design-pattern
InformationsquelleAutor der Antwort bingles