2017-02-18 30 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,锵)来实现。