实现多个条件逻辑的最佳模式
Best pattern to implement multiple conditional logic
首先,我已经阅读并搜索了重构条件逻辑的方法 - 似乎建议了 3 种主要方法:多态性(没试过,但我认为我不能在这种情况下应用)、枚举(有used) 和 The Strategy Pattern (用过几次,很喜欢)
但是我有大约 6-7 个布尔条件要检查,并且取决于每个条件是否 true/false 我想做一些不同的事情,即
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
所以一个基本的例子是第一个和最后一个为真(随机播放所有歌曲),其余为假。 some cases if one is true, another has to be false - you cant play all songs from your library if you're playing just an album, so when some options are chosen they automatically change other ones they directly affect.
关于如何重构这种基于多个条件 (6/7+) 的条件逻辑,使其看起来不像丑陋代码的庞然大物的任何建议。
在您的示例中,您应该首先对条件进行分类。有些是排他性的,有些 可能 相互影响,所有这些都可以根据它们指定的行为部分进行分组。
在您的示例中,分类可能如下所示:
- 歌曲选择:FROM_ALBUM、FROM_ARTIST、FROM_GENRE、FROM_ALL_SONGS
- 重复:重复
- 订单:随机播放
Repetition 和 Order 各只包含一个元素,歌曲选择是基于从左到右的层次结构。如果 FROM_ARTIST 为真,则 FROM_ALBUM 也隐式为真,因为专辑是艺术家制作的曲目的子集(除非您也计算特征,但我将在这里忽略它)。所以经过分类之后,事情看起来就简单多了。
由于 REPEAT 和 SHUFFLE 处理它们自己的特定行为而不受任何其他标志的影响,我们可以通过一个简单的 if 子句或一些将每个 属性 映射到特定操作的变通方法来处理它们。对于其他标志,最简单的方法是利用层次结构并搜索涵盖最大歌曲集的标志并将其设置为过滤器。
这里的主要技巧不是应用任何设计模式,而是根据标志的含义对标志进行分类。
首先,我已经阅读并搜索了重构条件逻辑的方法 - 似乎建议了 3 种主要方法:多态性(没试过,但我认为我不能在这种情况下应用)、枚举(有used) 和 The Strategy Pattern (用过几次,很喜欢)
但是我有大约 6-7 个布尔条件要检查,并且取决于每个条件是否 true/false 我想做一些不同的事情,即
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
所以一个基本的例子是第一个和最后一个为真(随机播放所有歌曲),其余为假。 some cases if one is true, another has to be false - you cant play all songs from your library if you're playing just an album, so when some options are chosen they automatically change other ones they directly affect.
关于如何重构这种基于多个条件 (6/7+) 的条件逻辑,使其看起来不像丑陋代码的庞然大物的任何建议。
在您的示例中,您应该首先对条件进行分类。有些是排他性的,有些 可能 相互影响,所有这些都可以根据它们指定的行为部分进行分组。
在您的示例中,分类可能如下所示:
- 歌曲选择:FROM_ALBUM、FROM_ARTIST、FROM_GENRE、FROM_ALL_SONGS
- 重复:重复
- 订单:随机播放
Repetition 和 Order 各只包含一个元素,歌曲选择是基于从左到右的层次结构。如果 FROM_ARTIST 为真,则 FROM_ALBUM 也隐式为真,因为专辑是艺术家制作的曲目的子集(除非您也计算特征,但我将在这里忽略它)。所以经过分类之后,事情看起来就简单多了。
由于 REPEAT 和 SHUFFLE 处理它们自己的特定行为而不受任何其他标志的影响,我们可以通过一个简单的 if 子句或一些将每个 属性 映射到特定操作的变通方法来处理它们。对于其他标志,最简单的方法是利用层次结构并搜索涵盖最大歌曲集的标志并将其设置为过滤器。
这里的主要技巧不是应用任何设计模式,而是根据标志的含义对标志进行分类。