簡體   English   中英

實現多種條件邏輯的最佳模式

[英]Best pattern to implement multiple conditional logic

首先,我已經閱讀並搜索了重構條件邏輯的方法-似乎建議了3種主要方法:多態(尚未嘗試過,但我認為在這種情況下我不能應用它),枚舉(已使用過)和策略模式(我已經使用過幾次並且喜歡它)。

但是我有大約6-7個布爾條件要檢查,並且根據每個條件是否正確,我想做不同的事情,即

true, false, false, true

false, false, true, false

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

布爾值由不同的首選項設置,這些首選項在某種程度上都相關,但是我需要根據是對還是錯來進行不同的處理。 偏好的數量也可能會增加,所以我追求的是可擴展和可維護的東西。

我知道我可以在這里使用“策略模式”,但是首先要進行很多條件檢查(我想避免這種情況)。

示例情況,該項目圍繞音樂應用程序,特別是曲目結束后的操作,以及指示接下來將發生什么的選項,即:

SHUFFLE

重復

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
  • 重復:REPEAT
  • 訂單:SHUFFLE

重復和順序每個僅包含一個元素,歌曲選擇基於從左到右的層次結構。 如果FROM_ARTIST為true,則FROM_ALBUM也隱式為true,因為專輯是藝術家制作的曲目的子集(除非您也計算功能,但在這里我將忽略它)。 因此,在分類之后,事情看起來已經很簡單了。

由於REPEAT和SHUFFLE處理它們自己的特定行為而不受其他任何標志的影響,因此我們可以通過瑣碎的if子句或將每個屬性映射到特定操作的變通方法來處理它們。 對於其他標志,最簡單的方法是利用層次結構並搜索覆蓋最大歌曲集的標志並將其設置為過濾器。

這里的主要技巧不是應用任何設計模式,而是實際上根據標志的含義對標志進行分類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM