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?我只是想过度设计吗?
关于如何处理像这样的逻辑流的任何建议?谢谢
这可以建模如下:
Place
使用带有方法的根类calculateDestination(Person)
。地点可以由其内部的其他地点组成。Place
为Zoo
和创建子类ZooQuadrant
(当然,因为这些是实际位置)。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)
是多态方法。继承层次结构中的每个级别都将根据该类的特定语义来覆盖它。
Place
将有一个通用实现,该实现将测试Person
实例当前是否位于该节点(通过测试 的Person
值currentPlace
),如果不是,它将调用calculateDestination
其每个子节点并返回该节点。Zoo
s 将需要检查是否currentPlace == this
,如果是,则调用calculateDestination
其每个象限并将任何正结果与其自己的结果相结合以返回this.name + quadrantResult
。ZooQuadrant
只需要检查 是否currentDirection
等于自己的方向,并相应地返回一个值。注意:这只是为了说明多态性如何工作,可能有更好的实现。另外,这里我们同时使用多态性和递归,两者是独立的。
编辑:
至于增加的复杂性是否合理,这取决于情况!在这里,我们正在使用一个简单的示例,其中的对象图非常小。一旦你有数十个动物园,必须在这些动物园中添加更多象限,或者需要做出额外级别的决策(例如,如果每个象限都有子象限),嵌套的 if-else-if 方法(程序)就变得真正毛茸茸的很快,而面向对象的方法仍然是可维护和可理解的。
与所有事情一样,如果您预见决策将变得如此复杂,请采用面向对象方法。否则,保持简单每次都会胜过美丽:使用正确的工具解决正确的问题。