2010-04-07 49 views
5

我有一個相當長的switch-case語句。有些案例真的很短小。一些更長,需要一些變量從未使用過其他地方,像這樣:爲switch語句的情況在本地塊中定義一個變量是個好主意嗎?

switch (action) { 
    case kSimpleAction: 
     // Do something simple 
     break; 
    case kComplexAction: { 
     int specialVariable = 5; 
     // Do something complex with specialVariable 
     } break; 
} 

另一種方法是再進switch這樣來聲明變量:

int specialVariable = 5; 
switch (action) { 
    case kSimpleAction: 
     // Do something simple 
     break; 
    case kComplexAction: 
     // Do something complex with specialVariable 
     break; 
} 

這可以變得相當混亂,因爲不清楚該變量屬於哪個case,並且它使用一些不必要的內存。

但是,我從來沒有在其他地方看到過這種用法。
您是否認爲在塊中爲一個case本地聲明變量是一個好主意?

回答

11

如果在開關塊之後沒有使用specialVariable,則將其聲明在「case」塊中。

一般來說,變量應該儘可能在最小的範圍內聲明。

+0

每種情況都是範圍嗎?我問,因爲一個案件本身沒有開關沒有意義,當然? – gbn 2010-04-07 19:03:43

+4

@gbn - 本身,「case」不會創建新的範圍。代碼需要添加'{}'來引入新的範圍(如OP在他的第一個示例中所做的那樣)。 – 2010-04-07 19:06:57

+0

是的,你需要創建一個「範圍」的情況下,你打算在情況下使用變量(雙關語)變量將只在這種情況下使用。 – Max 2010-04-07 19:30:17

3

是在需要的最窄範圍內定義變量。

因此,示例1是優選的。

1

同意Max - 儘可能小的範圍。這樣,當下一個人需要更新它時,他/她不必擔心在switch語句的其他部分是否使用了該變量。

3

如果switch語句變得難以管理的巨大,您可能想要轉換爲函數指針表。通過將每個案例的代碼放在不同的函數中,您不必擔心變量聲明和定義。

另一個優點是您可以將每個case函數放入單獨的轉換單元。這將通過編譯已更改的case來加速構建過程。通過隔離對最小範圍的更改來提高質量。

1

我自己的switch語句規則是每個case中應該有一個單獨的語句的最大值,不包括中斷。這意味着該語句可以是初始化,分配或函數調用。把一個更復雜的代碼放在一個案例中是一種災難 - 我「深情地」記住我所見過的所有Windows代碼(受Petzold啓發),它們在Windows程序的同一個案例中處理消息參數。

所以調用一個函數,並把變量放在那裏!

2

我所有的

case X: 
    { 
     type var; 
     ...; 
    } 
    break; // I like to keep breaks outside of the blocks if I can 

如果在那裏的東西變得太複雜,開始變得在你的能力,看看整個交換機/箱的開關/箱,然後考慮將盡可能多的方式因爲您可以將其轉換爲由案例代碼調用的一個或兩個內聯函數。這可以提高可讀性,而不會在其中引發函數調用開銷。

相關問題