实现多条件逻辑的最佳模式

时间:2016-04-05 22:25:26

标签: java design-patterns refactoring

首先,我已经阅读并搜索了重构条件逻辑的方法 - 似乎提出了3种主要方法:多态性(没有尝试,但不认为我可以应用它这种情况),Enums(已使用)和战略模式(我已经多次使用并喜欢它)。

但是我要检查大约6-7个布尔条件,并且根据每个是否为真/假我想做一些不同的事情,即

true, false, false, true

false, false, true, false

true, true, ... you get the picture..

布尔值由不同的首选项设置,这些首选项在某种程度上都是相关的,但我需要根据哪些是真或假来区别对待。偏好量也可能会增加,因此可扩展和可维护的东西就是我所追求的。

我知道我可以在这里使用策略模式,但不是先没有很多条件检查(我试图避免)。

示例情况,该项目以音乐应用程序为中心,具体如何在轨道完成时做什么,以及有哪些选项决定接下来会发生什么,例如:

SHUFFLE

REPEAT

PLAY_FROM_ALBUM_SONGS

PLAY_FROM_ARTIST

PLAY_FROM_GENRE

PLAY_FROM_ALL_SONGS

所以一个基本的例子是第一个和最后一个是真的(Shuffle& Play from all songs),其余的都是假的。在某些情况下,如果一个是真的,另一个必须是假的 - 如果你只是在播放一张专辑,你就无法播放你图书馆里的所有歌曲,所以当选择一些选项时,它们会自动改变他们直接影响的其他选项。

任何建议如何根据多个条件(6/7 +)对这种条件逻辑进行重构,以便它看起来不像丑陋的代码庞然大物。

1 个答案:

答案 0 :(得分:2)

在您的示例中,您应该首先对条件进行分类。有些是独占的,有些可能相互影响,所有可以根据它们指定的行为的哪个部分进行分组。

在您的示例中,分类可能如下所示:

  • 歌曲选择:FROM_ALBUM,FROM_ARTIST,FROM_GENRE,FROM_ALL_SONGS
  • 重复:REPEAT
  • 订单:SHUFFLE

重复和顺序每个只包含一个元素,歌曲选择基于从左到右的层次结构。如果FROM_ARTIST为真,则FROM_ALBUM也隐式为真,因为专辑是艺术家制作的曲目的子集(除非你也计算了特征,但我会在这里忽略它)。因此,在分类之后,事情看起来已经非常简单了。

由于REPEAT和SHUFFLE处理它们自己的特定行为而不受任何其他标志的影响,我们可以通过一个简单的if子句或一些将每个属性映射到特定操作的解决方法来处理它们。对于其他标志,最简单的方法是利用层次结构并搜索覆盖最大歌曲集的标志并将其设置为过滤器。

这里的主要技巧不是应用任何设计模式,而是根据其含义对标志进行分类。

相关问题