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