受控示例:
我们有2个动物园,’动物园A’和’动物园B’,’家’.每个都是’地方’.在每个动物园,我们有4个’位置’,’北’,’南’,’东’和’西’. ‘Home’只有一个位置.
我们希望根据一些变量为一个人分配一个“目的地”.
这些变量是:
‘地方’,与我们的地方(动物园A,动物园B,家)相关.
‘方向’,与我们的位置相关,(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'
因此,如果人物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') ...
我可以将这个转换为嵌套开关,变量为ENUMs.但我试图避免if – else / switch依赖,因为我有一个不好的习惯.我尝试使用Factory Design来生成Place类,然后在每个位置和目标上使用Polymorphism,但它开始变得过于复杂.是否值得远离if / switches?我只是想过度设计吗?
关于如何处理像这样的逻辑流的任何建议?
谢谢
解决方法
>使用方法calculateDestination(Person)的根类Place.地方可以包含其中的其他地方.
>为Zoo和ZooQuadrant创建Place子类(当然,因为它们是实际的位置).
> 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);
当你想要获得目的地时,你会打电话给world.calculateDestination(myPerson)
calculateDestination(Person)是多态方法.继承层次结构中的每个级别都将根据该类的特定语义覆盖它.
> Place将有一个通用实现,它将测试Person实例当前是否在该节点上(通过对currentPlace的Person值进行测试),如果不是,它将在每个子节点上调用calculateDestination并返回它.
>动物园将需要检查currentPlace == this,如果是,则在每个象限上调用calculateDestination并将任何正结果与其自身结合以返回this.name quadrantResult.
>每个ZooQuadrant只需要检查currentDirection是否等同于它自己的方向,并相应地返回一个值.
注意:这只是为了说明多态可能如何工作,可能有更好的实现.此外,这里我们使用多态和递归,两者是独立的.
编辑:
至于是否需要增加复杂性,这取决于!在这里,我们使用一个非常小的对象图的简单示例.一旦你拥有数十个动物园,就必须在这些动物园中添加更多象限,或者需要做出额外的决策(如果每个象限都有子参数),嵌套的if-else-if方法(程序)真的得到了毛茸茸的很快,而面向对象的方法仍然是可维护和可理解的.
像所有事情一样,如果您预见决策会变得那么复杂,那么请使用OO方法.否则,保持简单就是每次都能胜过美女:使用合适的工具来解决问题.