我正在尝试重构具有多个子条件的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 :(得分: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
;谢谢你的收获。
答案 1 :(得分: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]);
我更喜欢前者,因为它看起来更清晰。
在效率方面,isalpha
和isupper
调用都可能通过宏来实现,这些宏引用lookup table数组,例如__ctype_b_loc
(GCC,Clang)