2012-03-08 52 views
1

我有一個方法,需要檢索一個類型的大小,例如我需要一個字符串被返回,說「小」,「中」或「大」。所以我打電話GetSize(int size)。但我也需要知道我想如何返回尺寸,我想返回「小」還是想返回「s」。所以方法增長到GetSize(int size, enum format)如何有效地設計一種方法,其中每個條件都依賴於另一個條件?

現在我可以做一個開關的情況下,但它會

switch (size)  
{  
    case SMALL_SIZE: 
     switch(format) 
      case format::short 
      case format::long 
} 

所以我會做任何情況下爲「大小」裏面的開關情況。我也可以將其分解並調用一種方法來獲取每種大小的格式。

這看起來像很多工作,我只有3個大小的情況下,但想象這是其他事情的10個案例。我的解決方案最好還是有更好的方法?

+2

怎麼樣的地圖<對,字符串>或類似的? – PlasmaHH 2012-03-08 14:28:42

+0

這將取決於每個'case format :: X'中實際採取的操作。如果有規則,那麼你很可能會考慮因素。如果每個案例都是特定的,那將會更困難。試着提供更多關於該方法的用途(更理想的代碼)。 – 2012-03-08 14:29:14

+0

兩種不同的功能呢? 'GetSizeShort(int size)'和'GetSizeLong(int size)' – Tim 2012-03-08 14:38:51

回答

3

看來您的方法可以被一個簡單的二維數組所取代。

// Use actual sizes in the declaration below 
static string FormattedSize[2][2] = { 
    {"small", "s"} 
, {"medium", "m" } 
// and so on... 
}; 

string GetSize(int size, enum format) { 
    return FormattedSize[size][format]; 
} 
+0

使用一對作爲關鍵字的映射會更高效嗎? – Pittfall 2012-03-08 15:14:12

+0

@Pittfall通常,以效率擊敗數組幾乎是不可能的。但是,在這種情況下,它絕對沒有關係:只有十個項目要搜索,除非在非常緊密的循環中將此函數調用數十億次,否則不會發現任何差異。 – dasblinkenlight 2012-03-08 15:19:21

0

你也可以做線沿線的東西:

switch(true) { 
case ((size == SMALL_SIZE) && (format == format::short)): 
case ((size == MEDIUM_SIZE) && (format == format::short)): 
    return "s"; 
    break; 
case ((size == LARGE_SIZE) && (format == format::short)): 
case ((size == SMALL_SIZE) && (format == format::long)): 
    return "m"; 
    break; 
case ((size == MEDIUM_SIZE) && (format == format::long)): 
case ((size == LARGE_SIZE) && (format == format::long)): 
    return "l"; 
    break; 
} 
相關問題