精简代码之帮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;
      }
};

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

代码精简if-else语句的方法有几种。一种方法是使用三目运算符。如果只存在两种结果,可以使用三目运算符来替代if-else语句。例如,可以将原始的if-else语句: ``` if (state) { // do Something return true; } else { return false; } ``` 精简为: ``` return state ? true : false; ``` 另一种方法是使用策略模式。策略模式将每个条件分支抽象为一个策略对象,然后根据条件选择相应的策略对象执行。这样可以避免多个if-else语句的嵌套。例如,可以定义一个接口或抽象类来表示策略对象,然后实现多个具体的策略类。根据不同的条件,选择相应的策略对象执行。这样可以使代码更加清晰和可扩展。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [在代码精简IF-ELSE的方法](https://blog.csdn.net/m0_55337678/article/details/126474080)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [公司系统if-else语句太多了,我用设计模式消除了if-else](https://blog.csdn.net/wujialv/article/details/109109402)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值