簡體   English   中英

以下情況的替代方法

[英]an alternative to the following case

我遇到了一個無法找到易於維護且易於閱讀的解決方案的問題。

我基本上是在寫一個“主狀態機”,我有一個節點,它接收來自其他3個從屬節點的枚舉,這些枚舉獨立地執行其操作並進入某個狀態並將其報告給主節點。

從站1輸出枚舉之一:

enum slave1 {
A,
B
}

從站2輸出枚舉之一:

enum slave2 {
1,
2
}

從站3輸出枚舉之一:

enum slave3 {
a,
b,
c
}

重要的是要注意,我對從屬節點的行為,結構和輸出沒有任何控制權

現在,基於收到的值,我的主節點具有以下邏輯

val_slave_1 = getSlave1Val();
val_slave_2 = getSlave2Val();
val_slave_3 = getSlave3Val();

switch(val_slave_1):
  case A:
    switch(val_slave_2):
      case 1:
        switch(val_slave_3):
          case a: {do Z}
          case b: {do Y}
          case c: {do X}
      case 2:
        switch(val_slave_3):
          case a: {do W}
          case b: {do V}
          case c: {do U}
  case B:
    switch(val_slave_2):
      case 1:
        switch(val_slave_3):
          case a: {do T}
          case b: {do S}
          case c: {do R}
      case 2:
        switch(val_slave_3):
          case a: {do Q}
          case b: {do P}
          case c: {do O}

此代碼的優點是-

  1. 給定3個數字,我可以確切地找到期望的行為。
  2. 很容易調試。
  3. 不必維護多個布爾值或if語句。

此代碼的問題是-

  1. 當前代碼是排列在一起的(2,2,3)個案例的組合,但實際上我有很多枚舉(3、4、7)。 這使得閱讀和維護變得極為困難。
  2. 如果將來有一個奴隸更改枚舉的數量,則說奴隸2添加另一個枚舉。 我將需要添加大量的案例來使這項工作變得很難測試
  3. 如果有另一個獨立的從屬設備(從屬設備4)出現並提供信息,那么我就搞砸了。

我對大家的問題是,有沒有更好的方法可以做到這一點? 我讀過很多地方說多態性通常是解決switch語句的好方法,但是我試圖使我的代碼具有多態性,但似乎無法確定解決方案。 盡管很多人都給出了一些簡單的例子,例如車輛和貓,但我似乎無法將其應用於我的問題。

另一個重要說明:它可能很明顯,但我仍然會寫。 編寫switch case語句的順序無關緊要。為了保持理智,我將選擇以最大到最小枚舉的順序編寫它,以節省代碼行(我認為)

我找到的最接近該問題的線程是-

是否有任何設計模式可避免嵌套開關盒?

但是,有比維護枚舉字典映射到函數更好的方法嗎?

因為您的枚舉值很小,所以從枚舉組合到函數的映射可能只是一個數組。 當您具有3、4和7個值(分別為2、2和3位)時,可以使用單個字節索引到函數指針數組中。 像這樣:

using Handler = void (*)();
std::array<Handler, 128> handlers = { doA, doB, doB, doG, nullptr, ..., doFoo };

int v1 = slave1(); // 0-6
int v2 = slave2(); // 0-3
int v3 = slave3(); // 0-2

int index = (v2 << 5) | (v1 * 3 + v3);
handlers[index]();

如果枚舉值從0到n不連續,則可能必須將它們重新映射到該值。

您可能想提出一種巧妙的方法來填充數組,因為在某些更改可能需要一段時間后才能手動重新計算索引。 我現在可以想到的一種方法是constexpr函數,該函數采用許多結構,每個結構均包含枚舉值和函數指針,並從中填充一個數組。 結構將計算索引,函數將僅從索引分配函數指針。 或類似的東西。

暫無
暫無

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

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