2017-02-18 12 views
1

if文を複数のサブ条件でリファクタリングしようとしています。私の現在の試行から、私は条件を2回書くか、目的の終了関数を2回書く必要があります。私はよりクリーンな方法が欲しい。サブブランチングのためのより良い設計文サブ条件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私はそれのすべてです。コードは機能し、より良いスタイルを探しているだけでなく、より良いソリューションを全体的に言うと思います。 2番目のバージョンでは、私が何をしているのか明確にする必要があります。 –

+0

誰かが解決策が正しいかどうか尋ねると、私は原則として解決策を信頼しません。あなたの解決策がまったく正しいかどうかはわかりません。だから、あなたの問題を最初に述べ、実装を示すことに感謝します。とにかく、あなたの質問は[コードレビュー](https://codereview.stackexchange.com)に適しています。 – Downvoter

答えて

4

条件についての質問に答えるには、テストの2つの部分の結果をキャッシュする2つのローカル変数を導入します。

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コールは、__ctype_b_loc(GCC、クラン)としてlookup table配列を参照マクロを介して実現される可能性があります。