相信大家在平时的开发过程中一定没法避免if-else分支结构的使用,有些时候确实无法避免,但有一些特定的场合我们可以合理的运用一些技巧来对给代买瘦身,本文列举了四种可行的方式,当然还有很多其他的场合或者方式,欢迎大家在评论区补充:
1- 卫语句(提前return)
卫语句(Guard clause)指的是在遇到异常情况时,提前进行抛出,这在一定程度上可以减少if-else分支结构的使用,可以在逻辑性和代码简洁性上得到提高
在阿里巴巴与Java社区开发者制定的《Java开发手册(华山版)》中有对控制语句的编程规约有如下的建议:
表达异常的分支时,少用if-else方式,这种方式可以改写成:
if (condition) {
...
return obj;
}
// 接着写else的业务逻辑代码;
说明:如果非使用if()…else if()…else…方式表达逻辑,避免后续代码维护困难,【强制】请勿超过3层。
正例:超过3层的 if-else 的逻辑判断代码可以使用卫语句、策略模式、状态模式等来实现,其中卫语句即代码逻辑先考虑失败、异常、中断、退出等直接返回的情况,以方法多个出口的方式,解决代码中判断分支嵌套的问题,这是逆向思维的体现。
示例如下:
public void findBoyfriend(Man man) {
if (man.isUgly()) {
System.out.println("本姑娘是外貌协会的资深会员");
return;
}
if (man.isPoor()) {
System.out.println("贫贱夫妻百事哀");
return;
}
if (man.isBadTemper()) {
System.out.println("银河有多远,你就给我滚多远");
return;
}
System.out.println("可以先交往一段时间看看");
}
再来看下面这段代码,在条件为真的情况下我们执行相关的业务代码,否则抛出异常
void Demo(...)
{
if (true_to_continue){
... //业务代码
}
else{
throw new SomeException();
}
}
如果,我们将if内的条件进行反转之后,同样的功能,但是我们减少了else的使用
void Demo(...)
{
if (!true_to_continue){
throw new SomeException();
}
... //业务代码
}
2- map映射
比如我们将英文单词转为化为对应的数字,如果用if-else分支结构可能会写成下面的代码:
int ConvertStr2Num(string strin){
if(strin == "one") return 1;
else if(strin == "two") return 2;
else if(strin == "three") return 3;
//其余的情况...
return 0;
}
这样看起来我们的代码会显得很冗长,在C++里面我们可以借助map来实现,即我们预先将逻辑分支的信息存储到map中,之后通过对键值的读取来获得相应的输出
int ConvertStr2Num(string strin) {
static const map<string, int> wordmap = {
{"one", 1},
{"two", 2},
{"three",3}
// 其余的情况...
};
const auto result = wordmap.find(strin);
if (result == wordmap.end()) return 0;
return result->second;
}
当然对于map这样键值对应的特性,我们也可以使用数组或者结构体等来实现相同的功能
3- 三元运算符
三元运算符使用的基本结构如下
[条件语句] ? [表达式1] : [表达式2]
这个大家可能都比较熟悉了,比如比较两个数的大小的时候可以为了简化if-else分支结构采用三元运算符进行替换,这里还值得注意的是,如果结合宏函数使用效果可能更好
#define MAX(a,b) (((a)>(b))?(a):(b))
4-利用继承和多态
对于减少if-else分支结构的使用的方法不得不提的就是面向对象的编程
关于小猫小狗的一段程序如下
if (animal.IsDog){//狗
animal.EatCookie();
animal.Bark();
}
else {//猫
animal.EatFishs();
animal.Meow();
}
在面向对象的编程过程中,我们只关心接口是什么,具体的实现我们并不关心,所以我们可以创建两个子类分别表示Cat和Dog,具体的实现方法放在子类中完成
class Animal {
public:
virtual void makeSound();
virtual void Eat();
};
class Cat: public Animal {
public:
void makeSound() {
cout<<"meow"<<endl;
}
};
class Dog : public Animal {
public:
void makeSound() {
cout<<"bark"<<endl;
}
};
最后,愿你我都可以写出优雅的代码!