精简代码之帮if-else瘦身

相信大家在平时的开发过程中一定没法避免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;
      }
};

最后,愿你我都可以写出优雅的代码!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值