避免嵌套如果Else/Switches - Java

Nat*_*anS 5 java polymorphism if-statement

我正在审查一些代码(Java)并根据业务逻辑流程图进行更改.当前的代码依赖于大量的if语句 - 我想尝试并远离它.我一直在阅读有关多态性的文章,并试图围绕如何将其应用于我的情况.我可以使它适用于单个条件级别,但努力在多个条件级别进一步扩展它.代码将在运行时执行,这个'Logic'方法将传递上一步的变量.

举例:我们有2个动物园,'动物园A'和'动物园B',以及'家'.每个都是'地方'.在每个动物园,我们有4个'位置','北','南','东'和'西'.'Home'只有一个位置.我们希望根据一些变量为一个人分配一个"目的地".这些变量是:'Place',它与我们的地方(Zoo A,Zoo B,Home)相关.'方向',与我们的位置相关,(N,S,E,W).流程图:

                |----- | 'HOME'
                |Place?| ----- >  *destination = 'home'*
                |----- |
     Zoo A          |                               Zoo B
    |---------------|----------------------------------------|
|----------|                                        |----------| 
|Direction?|                                        |Direction?| 
|----------|                                        |----------|
    |    North                                          |    North
    ----------- *destination = 'Zoo A North'            ----------- *destination = 'Zoo B North'
    |    East                                           |    East
    ----------- *destination = 'Zoo A East'             ----------- *destination = 'Zoo B East'
    |    South                                          |    South
    ----------- *destination = 'Zoo A South'            ----------- *destination = 'Zoo B South'
    |    West                                           |    West
    ----------- *destination = 'Zoo A West'             ----------- *destination = 'Zoo B West'
Run Code Online (Sandbox Code Playgroud)

因此,如果人物X有动物园A和南方向,他们应该有一个'动物园A南'的目的地

我使用If语句的代码目前非常难看:

if(Place = 'HOME')
    destination = 'HOME'
if(Place = 'Zoo A')
    if(Direction = North)
        destination = 'Zoo A North')
    if(Direct = East)
        destination = 'Zoo A East')
    ...
if(Place = 'Zoo B')
    if(Direction = North)
        destination = 'Zoo B North')
    if(Direct = East)
        destination = 'Zoo B East')
    ...
Run Code Online (Sandbox Code Playgroud)

我可以将这个转换为嵌套开关,变量为ENUMs.但我试图避免if - else/switch依赖,因为我有一个不好的习惯.我尝试使用Factory Design来生成Place类,然后在每个位置和目标上使用Polymorphism,但它开始变得过于复杂.是否值得远离if/switches?我只是想过度设计吗?

关于如何处理像这样的逻辑流的任何建议?谢谢

Eze*_*uns 3

这可以建模如下:

  1. Place使用带有方法的根类calculateDestination(Person)。地点可以由其内部的其他地点组成。
  2. PlaceZoo和创建子类ZooQuadrant(当然,因为这些是实际位置)。
  3. Person对象具有currentPlace和 的值currentDirection

现在您可以实例化这些类的对象来表示您的情况:

zooA = new Zoo("ZooA");
zooA.addChild(new ZooQuadrant(Direction.SOUTH));
... so on for every quadrant ...
... same for zooB ...
home = new Place("Home");
world = new Place("World");
world.addChild(home);
world.addChild(zooA);
world.addChild(zooB);
Run Code Online (Sandbox Code Playgroud)

当你想到达目的地时,你会打电话world.calculateDestination(myPerson)

calculateDestination(Person)是多态方法。继承层次结构中的每个级别都将根据该类的特定语义来覆盖它。

  1. Place将有一个通用实现,该实现将测试Person实例当前是否位于该节点(通过测试 的PersoncurrentPlace),如果不是,它将调用calculateDestination其每个子节点并返回该节点。
  2. Zoos 将需要检查是否currentPlace == this,如果是,则调用calculateDestination其每个象限并将任何正结果与其自己的结果相结合以返回this.name + quadrantResult
  3. 每个ZooQuadrant只需要检查 是否currentDirection等于自己的方向,并相应地返回一个值。

注意:这只是为了说明多态性如何工作,可能有更好的实现。另外,这里我们同时使用多态性和递归,两者是独立的。


编辑:

至于增加的复杂性是否合理,这取决于情况!在这里,我们正在使用一个简单的示例,其中的对象图非常小。一旦你有数十个动物园,必须在这些动物园中添加更多象限,或者需要做出额外级别的决策(例如,如果每个象限都有子象限),嵌套的 if-else-if 方法(程序)就变得真正毛茸茸的很快,而面向对象的方法仍然是可维护和可理解的。

与所有事情一样,如果您预见决策将变得如此复杂,请采用面向对象方法。否则,保持简单每次都会胜过美丽:使用正确的工具解决正确的问题。