2017-02-18 55 views
1

我想重構一個if語句與多個子條件。從我目前的嘗試中,我要麼寫兩次條件,要麼寫兩次。我想要一個更清潔的方式。更好的設計爲分支如果語句子條件

這裏是最初的代碼我曾寫道:

if((s[i] >= 'A' && s[i] <= 'Z') || (s[i] >= 'a' && s[i] <= 'z')){ // cipher uppercase letters 
     bool uppercase = true; 
     if (s[i] >= 'a' && s[i] <= 'z') { // cipher lowercase letters 
      bool uppercase = false; 
     } 
     printf("%c", cipher_letter(s[i], true, k)); 
    } 
    else { // do nothing on non-alphabet letters 
     printf("%c", s[i]); 
    } 

的更清潔的方式,我發現現在是這樣的:

if(s[i] >= 'A' && s[i] <= 'Z') { // cipher uppercase letters 
    printf("%c", cipher_letter(s[i], true, k)); 
} 
else if (s[i] >= 'a' && s[i] <= 'z') { // cipher lowercase letters 
    printf("%c", cipher_letter(s[i], false, k)); 
} 
else { // do nothing on non-alphabet letters 
    printf("%c", s[i]); 
} 

但後來我不得不重複cipher_letter功能。

什麼樣的設計更好?

+0

你想要做什麼?可能不是關於優化你的解決方案,而是尋找一個完全*新的解決方案。 – Downvoter

+0

@Downvoter我完全贊成。代碼起作用,我只是尋找更好的風格,或者你說整體上更好的解決方案。第二個版本應該明確我在做什麼。 –

+0

如果有人問他們的解決方案是否正確,我不相信他們的解決方案。我不知道你的解決方案是否正確。所以,我會很感激你先說明你的問題,然後展示一個實現。無論如何,你的問題看起來更適合[Code Review](https://codereview.stackexchange.com)。 – Downvoter

回答

4

要回答有關條件的問題,請引入兩個局部變量來緩存測試的兩個部分的結果。

bool isUpper = s[i] >= 'A' && s[i] <= 'Z'; 
bool isLower = s[i] >= 'a' && s[i] <= 'z'; 

if (isUpper || isLower) { 
    printf("%c", cipher_letter(s[i], isUpper, k)); 
} 
else { // do nothing on non-alphabet letters 
    printf("%c", s[i]); 
} 

附加的名稱也更加明確有關測試的目的,幫助理解別人讀取代碼後面(這可能包括你)。

更新:我已經通過了錯誤的布爾到cipher_letter;感謝收穫。

+0

太棒了,這正是我尋找的那種重構。每當這個問題再次出現時,會幫助我很多。 –

1

爲了更好的設計,它可能會被簡化成:

if (isalpha(s[i])) 
    putchar(cipher_letter(s[i], isupper(s[i]), k)); 
else 
    putchar(s[i]); 

甚至:

putchar(isalpha(s[i]) ? cipher_letter(s[i], isupper(s[i]), k) : s[i]); 

我寧願是前者,因爲它看起來更清晰。

在效率的情況下,兩個isalphaisupper呼叫有可能被經由宏,引用lookup table陣列,例如__ctype_b_loc(GCC,鏘)來實現。