2012-10-01 90 views
0

以下哪兩種實現方式的,在編碼風格的方面之前測試中的錯誤和清理?正確的方法來回報

UINT Fn1() 
{ 
    HKEY hRegKey; 

    if(RegOpenKeyEx(..., KEY_NAME, &hRegKey) != ERROR_SUCCESS) 
     return ERROR_KEY_OPEN; 
    if(RegQueryValueEx(hRegKey, VAL_A_NAME, ...) != ERROR_SUCCESS) 
    { 
     RegCloseKey(hRegKey); 
     return ERROR_KEYVAL_A; 
    } 

    if(RegQueryValueEx(hRegKey, VAL_B_NAME, ...) != ERROR_SUCCESS) 
    { 
     RegCloseKey(hRegKey); 
     return ERROR_KEYVAL_B; 
    } 

    RegCloseKey(hRegKey); 
    return ERROR_SUCCESS; 
} 

UINT Fn2() 
{ 
    UINT rVal; 
    HKEY hRegKey; 

    if(RegOpenKeyEx(..., KEY_NAME, &hRegKey) == ERROR_SUCCESS) 
    { 
     if(RegQueryValueEx(hRegKey, VALUE_A_NAME, ...) == ERROR_SUCCESS) 
     { 
      if(RegQueryValueEx(hRegKey, VALUE_B_NAME, ...) == ERROR_SUCCESS) 
       rVal = ERROR_SUCCESS; 
      else 
       rVal = ERROR_KEYVAL_B; 
     } 
     else 
      rVal = ERROR_KEYVAL_A; 
     RegCloseKey(hRegKey); 
    } 
    else 
     rVal = ERROR_KEY_OPEN; 

    return rVal; 
} 

此外,有沒有靜止更好的辦法?
注:請不要無變亂的片段的細節 - 強調碼流和風格。

+2

這個答案將是C或C++不同,但你有標記。而且,這是一個相當主觀的問題。 – Benj

+0

請回答 - 對於*通用情況*。我沒有把這個問題轉化爲更通用的形式,讓它變得更真實。 –

+1

這個問題已經被問過:[這裏](http://stackoverflow.com/q/4369822/274261)和[Programmers.SE(http://programmers.stackexchange.com/q/18454)。這兩次,回答者都喜歡「早日退貨」(即您的第一個版本) – ArjunShankar

回答

1

這是非常個人的喜好問題。我個人認爲它們看起來都不是很好,或者很容易遵循。 C語言中的形式,我個人比較喜歡的是:

int 
fn(void) 
{ 
    struct foo *foo; 
    int error = 0; 
    if ((foo = foo_open(...)) == NULL) 
     return FOO_ERROR_OPEN; 
    if (foo_do_something(1)) { 
     error = FOO_ERROR_1; 
     goto out; 
    } 
    if (foo_do_something(2)) { 
     error = FOO_ERROR_2; 
    } 
out: 
    foo_close(foo); 
    return error; 
} 

但正如所說,這是一個品味的問題,並有關於這個問題,很多意見,也有程序員。我更喜歡這種風格,因爲這是我在職業生涯早期曾經工作過的很多代碼,並且這些代碼使它成爲我最易讀的代碼。

如果我不得不選擇你所呈現的風格之一,我會用1走,因爲犬牙交錯的,因爲2只是看起來凌亂。根據我的經驗,可讀性隨着壓痕深度而降低。

+0

hmm是'goto'並不是那裏的一個選項的壞處。 –

+1

@UjjwalSingh有一個資源來釋放它主要是矯枉過正,但是當你最終在一個函數中持有三個鎖和五個臨時分配的內存塊時,goto真的會清除一切。 – Art

+0

你說得對 - 我以第一名結束。 –