首先,我已经阅读并搜索了重构条件逻辑的方法 - 似乎建议了 3 种主要方法:多态性(尚未尝试,但不认为我可以在这种情况下应用它),枚举(已使用)和策略模式(我已经使用过几次并且喜欢它)。
但是我有大约 6-7 个 boolean 条件需要检查,并且根据每个条件是否为真/假,我想做一些不同的事情,即
true, false, false, true
false, false, true, false
true, true, ... you get the picture..
boolean 值是由不同的首选项设置的,这些首选项都以某种方式相关,但我需要根据哪些是 true 或 false 进行不同的处理。首选项的数量也可能会增加,因此我所追求的是可扩展和可维护的东西。
我知道我可以在这里使用策略模式,但首先必须进行大量条件检查(我试图避免)。
示例情况,该项目以音乐应用程序为中心,特别是轨道完成后要做什么,以及哪些选项决定接下来会发生什么,即:
随机播放
重复
PLAY_FROM_ALBUM_SONGS
PLAY_FROM_ARTIST
PLAY_FROM_GENRE
PLAY_FROM_ALL_SONGS
所以一个基本的例子是第一个和最后一个是真的(从所有歌曲中随机播放和播放)而其余的是假的。在某些情况下,如果一个为真,另一个就必须为假 - 如果您只播放一张专辑,则无法播放库中的所有歌曲,因此当选择某些选项时,它们会自动更改它们直接影响的其他选项。
任何关于如何重构这种基于多个条件(6/7+)的条件逻辑的建议,这样它就不会看起来像一个丑陋的代码庞然大物。
最佳答案
在您的示例中,您应该首先对条件进行分类。有些是排他性的,有些可能相互影响,所有这些都可以根据它们指定的行为部分进行分组。
在您的示例中,分类可能如下所示:
- 歌曲选择:FROM_ALBUM、FROM_ARTIST、FROM_GENRE、FROM_ALL_SONGS
- 重复:重复
- 顺序:随机排列
重复和顺序各只包含一个元素,歌曲选择基于从左到右的层次结构。如果 FROM_ARTIST 为 true,则 FROM_ALBUM 也隐式为 true,因为专辑是艺术家制作的轨道的子集(除非您也计算功能,但我在这里忽略这一点)。所以分类之后,事情看起来就简单多了。
由于 REPEAT 和 SHUFFLE 处理它们自己的特定行为而不受任何其他标志的影响,因此我们可以通过一个简单的 if 子句或一些将每个属性映射到特定操作的解决方法来处理它们。对于其他标志,最简单的方法是利用层次结构并搜索涵盖最大歌曲集的标志并将其设置为过滤器。
这里的主要技巧不是应用任何设计模式,而是实际上根据标志的含义对标志进行分类。
关于java - 实现多个条件逻辑的最佳模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36438165/