Design Pattern для рэалізацыі бізнес-правілаў з сотнямі, калі астатняе ў Java

Я павінен рэалізаваць пэўныя бізнес-правілы з сотняй радкоў ніжэй коды

if this
      then this
else if
      then this
.
.//hundreds of lines of rules
 else
      that

Ці ёсць у нас якія-небудзь шаблон праектавання, які можа эфектыўна рэалізаваць гэта ці паўторна выкарыстоўваць код так, што ён можа быць ужыты да ўсіх іншых правілах. Я чуў спецыфікацыі шаблону, які стварае нешта, як паказана ніжэй

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);
}
}

І тады рэалізацыя ёсць, і, ці метады, але я думаю, што гэта не можа выратаваць мяне напісанне, калі яшчэ (можа быць маё разуменне няправільна) ...

Ці ёсць лепшы падыход да рэалізацыі такіх бізнес-правілах, якія маюць так шмат, калі іншаму заяву?

EDIT: Проста ўзор example.A, B, C і г.д., ўласцівасці class.Apart з іх ёсць падобныя шмат іншых rules.I wnat зрабіць агульны код для гэтага.

    If  = 'something' and  = ‘something’ then If  = ‘02’ and  <> ‘02’ and < E> <> ‘02’ then 'something' Else if  <> ‘02’ and  = ‘02’ and  <> ‘02’ then 'something' Else if  <> ‘02’ and  <> ‘02’ and  = ‘02’ then 'something' Else if  <> ‘02’ and  = ‘02’ and  = ‘02’ then 'something' Else if  = ‘02’ and  = ‘02’ and  <> ‘02’ then 'something' Else if  = ‘02’ and  <> ‘02’ and  = ‘02’ then 'something' Else if  = ‘02’ and  = ‘02’ and  = ‘02’ then: If  = Y then 'something' Else then 'something' Else : Value of  
18
Вы можаце даць некаторую выбарку з вашага, калі іншага заявы? калі ёсьць якая-небудзь падабенства
дададзена аўтар stinepike, крыніца
Я думаю, што «ланцужок абавязкаў» -Pattern можа быць выкарыстаны тут: oodesign.com /chain-of-responsibility-pattern.html
дададзена аўтар Marco Forberg, крыніца
Выкарыстанне дзяржаўнага ўзору?
дададзена аўтар Fendy, крыніца

6 адказы

Strategy pattern could be useful here. Please check Replace Conditional Logic with Strategy

8
дададзена
гэта можа быць не ўпісваецца ў мае requirement.I адрэдагавалі маё пытанне, каб уключыць ўзор умоўных logic.I маюць ўмоўную логіку на некаторых уласцівасцях класа для аднаго правіла і некаторых іншых уласцівасцяў (можа ўключаць у сябе некаторыя ўласцівасці, якія выкарыстоўваюцца ў правіле адзін) для правіла два
дададзена аўтар SCoder, крыніца

Вы можаце выкарыстоўваць <�моцны> каманда або <�моцны> завод шаблон .

Command pattern can be used to replace cumbersome switch/if blocks which tend to grow indefinitely as you add new options.

public interface Command {
     void exec();
}

public class CommandA() implements Command {

     void exec() {
         //... 
     }
}
// etc etc

then build a Map object and populate it with Command instances:

commandMap.put("A", new CommandA());
commandMap.put("B", new CommandB());

то вы можаце замяніць ваш, калі/інакш, калі ланцуг з:

commandMap.get(value).exec();

In Factory Pattern you include your if/switch in a Factory which takes care of the ugliness and hides the abundance of ifs. Example code for Factory Pattern.

5
дададзена
Дзякуй за info.Can вы даць некаторыя прыклады прыклады, калі гэтыя мадэлі могуць дапамагчы ў зніжэнні калі/іншае.
дададзена аўтар SCoder, крыніца
Падобна на тое, добры прыклад, але можа быць не ўпісваюцца ў мае requirement.I адрэдагавалі маё пытанне, каб уключыць ўзор contional logic.I мае ўмоўную логіку на некаторых уласцівасцях класа для аднаго правіла і некаторых іншых уласцівасцяў (можа ўключаць у сябе некаторыя ўласцівасці, якія выкарыстоўваюцца ў правіле адзін) для правілы два.
дададзена аўтар SCoder, крыніца
Дайце крэдыты на арыгінальны адказ :): stackoverflow.com/questions/1199646/…
дададзена аўтар Dherik, крыніца

Нешта, што можа дапамагчы гэта рухавік правілы, як Drools . Гэта не шаблон дызайну, хоць, так што гэта не можа быць адказ, які вы шукаеце. Але ИМО, вы павінны разгледзець яго. Вось вялікі артыкул на , калі вы павінны выкарыстоўваць правіла рухавік .

1
дададзена
Дзякуй, але маё патрабаванне не выкарыстоўваць якія-небудзь правілы рухавік, прычыны праекта :(, так што я шукаю некаторыя шаблоны праектавання
дададзена аўтар SCoder, крыніца
Ўзгоднена з tieTYT. Рухавік правілаў з'яўляецца ідэальным кандыдатам для рэалізацыі БЗ. У маім асабістым вопыце, ён вырабляе код, супер чысты і просты ў абслугоўванні. І скарачае час распрацоўкі на некалькі парадкаў.
дададзена аўтар Kingz, крыніца

Дызайн шаблон можа дапамагчы вам, каб зрабіць код больш чытэльным або палепшыць рамонтапрыдатнасць, але калі вам сапраўды трэба ацаніць такія колькасці умоў, аператары IF нельга пазбегнуць.

Я хацеў бы разгледзець, бачачы праблему з іншага пункту гледжання (напрыклад: мне сапраўды трэба сто ўмоўных аператараў для вырашэння праблемы), і я хацеў бы паспрабаваць змяніць або палепшыць алгарытм.

Expression Language можа забяспечыць некаторую дапамогу, таму што вы маглі б стварыць праграмна радок, якая прадстаўляе кожнае IF заяву і ацаніць вынік з дапамогай гэтага інструмента, але вам усё роўна прыйдзецца вырашаць праблему, звязаную з выкананнем пэўнай логікі, звязанай з кожным станам.

1
дададзена

Простая стратэгія дэма з пітонам:

class Context(object):
  def __init__(self, strategy):
    self.strategy = strategy

  def execute(self, num1, num2):
    return self.strategy(num1, num2)

class OperationAdd(object):
  def __call__(self, num1, num2):
    return num1 + num2


class OperationSub(object):
  def __call__(self, num1, num2):
    return num1 - num2


if __name__ == '__main__':
  con = Context(OperationAdd())
  print "10 + 5 =", con.execute(10, 5)

  con = Context(OperationSub())
  print "10 - 5 =", con.execute(10, 5)
1
дададзена

Вы павінны праверыць шаблон Правілы дызайну http://www.michael-whelan.net/правілы дызайн-шаблон/. Ён вельмі падобны на прыклад кода, які вы далі, і складаецца з базавага інтэрфейсу, які вызначае спосаб вызначэння, калі правіла выконваецца, а затым розныя канкрэтныя рэалізацыі ў розных правілаў. Як я разумею, ваш камутатар заяву ператворыцца ў нейкі просты цыкл, які проста ацэньвае рэчы, пакуль ваш склад правіл не з'яўляецца альбо задаволены або не ўдаецца.

interface IRule {
    bool isSatisfied(SomeThing thing);
}

class RuleA: IRule {
    public bool isSatisfied(SomeThing thing) {
        ...
    }
}

class RuleA: IRule {
    ...
}

class RuleC: IRule {
    ...
}

Склад Правіла:

class OrRule: IRule {
    private readonly IRule[] rules;

    public OrRule(params IRule[] rules) {
        this.rules = rules;
    }

    public isSatisfied(thing: Thing) {
        return this.rules.Any(r => r.isSatisfied(thing));
    }
}

class AndRule: IRule {
    private readonly IRule[] rules;

    public AndRule(params IRule[] rules) {
        this.rules = rules;
    }

    public isSatisfied(thing: Thing) {
        return this.rules.All(r => r.isSatisfied(thing));
    }
}

// Helpers for AndRule/OrRule

static IRule and(params IRule[] rules) {
    return new AndRule(rules);
}

static IRule or(params IRule[] rules) {
    return new OrRule(rules);
}

Некаторы метад абслугоўвання, які працуе правіла на рэч.     клас SomeService {         грамадская адзнака (правіла IRule, Рэч рэч) {             вярнуцца rule.isSatisfied (рэч);         }     }

выкарыстанне:

// Compose a tree of rules
var rule = 
    and (
        new Rule1(),
        or (
            new Rule2(),
            new Rule3()
        )
    );

var thing = new Thing();

new SomeService().evaluate(rule, thing);

This was also answered here: https://softwareengineering.stackexchange.com/questions/323018/business-rules-design-pattern

0
дададзена