减少if else 语句使用的个人集锦

python如果减少if else的使用会怎么样? 在Python编程中,if语句作为流程控制的核心成员,常被用于逻辑判断。然而,过度依赖if可能导致代码结构冗长、难以维护,特别是在面对复杂逻辑时。让我们深入探讨这一问题,并探索如何使代码更加清爽高效。 阅读详情

是否你有过这样的体验:天天写着if (){...if(){..}}else{...}的代码,天天脑海里一直模拟的程序的运行场景。如果是那请看下面文章:↓

if语句的第一个问题在于,通常出现if语句的代码很容易越改越糟。我们试着写个新的if语句:

public void theProblem(boolean someCondition) {
        // SharedState

        if(someCondition) {
            // CodeBlockA
        } else {
            // CodeBlockB
        }
}
这时候还不算太糟,但已经存在一些问题了。在阅读这段代码时,我必须得去查看对同一个SharedState来说,CodeBlockA和CodeBlockB有什么改动。最开始这段代码很容易阅读,但随着CodeBlock越来越多,耦合越来越复杂之后,就会很难读。
上面这种CodeBlock进一步嵌套if语句与本地return的滥用情况也很常见,很难搞懂业务逻辑是选择了哪种路径。
if语句的第二个问题在于:复制时会有问题,也就是说,if语句缺失domain的概念。很容易由于在不需要的情况下,由于将内容放在一起而增加耦合性,造成代码难读难改。
而第三个问题在于:开发者必须在头脑中模拟执行实现情况——你得让自己变成一台小型电脑,从而造成脑细胞浪费。开发者的精力应当用来思考如何解决问题,而不是浪费在如何将复杂的代码分支结构编织在一起之上。
虽然想要直截了当地写出替代方案,但首先我得强调这句话:
凡事中庸而行,尤其是中庸本身
if语句通常会让代码更加复杂,但这不代表我们要完全抛弃if语句。我曾经看到过一些非常糟糕的代码,只是为了消除所有的if语句而刻意避开if语句。我们想要绕开这个误区, 
下面我给出的每种模式,都会给出使用范围。
单独的if语句如果不复制到其他地方,也许是不错的句子。在复制if语句时,我们会希望预知危险的第六感起效。
在代码库之外,在与危险的外部世界交流时,我们会想要验证incoming response,并根据其作出相应的修改。但在自己的代码库中,由于有可靠的gatekeeper把关,我觉得这是个很好的机会,我们可以尝试使用简单、更为丰富与强大的替代方案来实现。
 模式1:布尔参数(Boolean Params)

背景: 有方法在修改行为时使用了boolean。

public void example() {
    FileUtils.createFile("name.txt", "file contents", false);
    FileUtils.createFile("name_temp.txt", "file contents", true);
}

public class FileUtils {
    public static void createFile(String name, String contents, boolean temporary) {
        if(temporary) {
            // save temp file
        } else {
            // save permanent file
        }
    }
}
问题: 在看到这段代码时,实际上你是将两个方法捆绑到一起,布尔参数的出现让你有机会在代码中定义一个概念。
适用范围: 通常看到这种情况,如果在编译时我们可以算出代码要采用哪种路径,就可以放心使用这种模式。
解决方案: 将这个方法拆分成两个新的方法,然后if就不见了。
模式2:使用多态(Polymorphism)
  背景: 根据类型switch时。
public class Bird {

    private enum Species {
        EUROPEAN, AFRICAN, NORWEGIAN_BLUE;
    }

    private boolean isNailed;
    private Species type;

    public double getSpeed() {
        switch (type) {
            case EUROPEAN:
                return getBaseSpeed();
            case AFRICAN:
                return getBaseSpeed() - getLoadFactor();
            case NORWEGIAN_BLUE:
                return isNailed ? 0 : getBaseSpeed();
            default:
                return 0;
        }
    }

    private double getLoadFactor() {
        return 3;
    }

    private double getBaseSpeed() {
        return 10;
    }
}
问题: 在添加新的类型时,我们必须要记得更新switch语句,此外随着不同bird的概念添加进来,bird类的凝聚力越来越糟。
适用范围:根据类型做单次切换是可行的,如果switch太多,在添加新类型时如果忘记更新现有隐藏类型中的所有switch,就会导致bug出现,8thlight博客关于这种情况有详细描述。
解决方案: 使用多态,添加新类型时大家都不会忘记添加相关行为。 
注意:上例为了简洁只写了一个方法,但在有多个switch时更有用。
public abstract class Bird {

    public abstract double getSpeed();

    protected double getLoadFactor() {
        return 3;
    }

    protected double getBaseSpeed() {
        return 10;
    }
}

public class EuropeanBird extends Bird {
    public double getSpeed() {
        return getBaseSpeed();
    }
}

public class AfricanBird extends Bird {
    public double getSpeed() {
        return getBaseSpeed() - getLoadFactor();
    }
}

public class NorwegianBird extends Bird {
    private boolean isNailed;

    public double getSpeed() {
        return isNailed ? 0 : getBaseSpeed();
    }
}


 模式3:将内联语句(Inline statements)转为表达式 
背景: 在计算布尔表达式时,包含if语句树。

public boolean horrible(boolean foo, boolean bar, boolean baz) {
    if (foo) {
        if (bar) {
            return true;
        }
    }

    if (baz) {
        return true;
    } else {
        return false;
    }
}
问题:这种代码会导致开发者必须用大脑来模拟计算机对方法的处理。
适用范围:很少有不适用的情况,像这样的代码可以合成一行,或者拆成不同的部分。
解决方案: 将if语句树合成单个表达式。

	public boolean horrible(boolean foo, boolean bar, boolean baz) {
    return foo && bar || baz;
}
 模式4:给出应对策略 
背景:在调用一些其他代码时,无法确保路径是成功的。

public class Repository {

    public String getRecord(int id) {
        return null; // cannot find the record
    }
}

public class Finder {
    public String displayRecord(Repository repository) {
        String record = repository.getRecord(123);
        if(record == null) {
            return "Not found";
        } else {
            return record;
        }
    }
}


问题: 这类if语句增加了处理同一个对象或者数据结构的时间,其中包含隐藏耦合——null的情况。其它对象可能会返回其他代表没有结果的magic value。

 适用范围:最好将这类if语句放在一个地方,由于不会重复,我们就能将为空对象的magic value删除。 

   解决方案:针对被调用代码,给出应对策略。Ruby的Hash#fetch就是很好的案例,Java也用到了类似的方法。这种模式也可以用在删除例外情况时。

private class Repository {
    public String getRecord(int id, String defaultValue) {
        String result = Db.getRecord(id);

        if (result != null) {
            return result;
        }

        return defaultValue;
    }
}

public class Finder {
    public String displayRecord(Repository repository) {
        return repository.getRecord(123, "Not found");
    }
}





相关推荐

RK3588 MPP视频编码实战:从环境搭建到高效封装

本文详细介绍了在RK3588平台上利用MPP(Media Process Platform)进行硬件视频编码的完整实战流程。从MPP库的环境搭建、编译安装,到核心编码参数(如码率控制、GOP、图像对齐)的深入解析,并提供了一个可复用的C++编码器类封装方案,帮助开发者快速实现高效的H.264/H.265视频编码,显著降低CPU占用。

weixin_29192211的博客 348

程序中减少使用if语句的方法集锦

大约十年前,我听说了反if的活动,觉得这个概念非常荒谬。如果不用if语句,又怎么能写出有用的程序呢?这简直太荒谬了。  但之后你会开始思考:是否还记得上周你拼命想读懂的深度嵌套代码?糟透了对么?要是有办法能简化它该多好。  反if活动的网站上没给出多少实用性建议,因此在本文中,作者将会提供一系列模式,也许你会用得上。但首先我们来关注一下if语句到底造成了什么问题。  if语句的问

zero_295813128的专栏 715

S-function入门及案例详解(3)——S-function进阶案例

目录1.案例描述2.案例详解3.输出波形4.对输入参数进行Mask打包 1.案例描述 设计一个蹦极系统 h为离地面高度,输入参数为长度、质量、离地面高度。 2.案例详解 步骤1.可以修改sfuntmpl函数的名称(这里修改为bengji),并在括号内增加输入参数 参数len,weight,dist分别表示长度、质量、离地面高度;长度用来初始化x0,质量用来初始化m,离地面高度用来初始化h。 function [sys,x0,str,ts,simStateCompliance] = bengji(t,x,u

Wendy的博客 1万+

【高级C语言】关于if-else的性能问题

if-else 这样写可以提升27%的代码性能

从善若水的博客 3430

沈阳计算机研究所复试,沈阳计算所复试试题附答案.doc

沈阳计算所复试试题附答案目录数据结构1200612007220085200914操作系统16200616200718200818200919组成原理20200620200720200821200921经典算法22数据结构2006数据结构部分(共25分,第1题10分,第2题15分)在(下图)所示的有向图中:v1 v2v4 ...

weixin_42511053的博客 862

比较器和运算放大器-2

今天继续了解输入阻抗问题,观察下图:首先考虑在我们没有接运放时,A点输出电压为6V,当接入如图所示的阻抗时电压还是6V吗?共模电阻和红框内对地电阻并联,阻值变小,相当于5k,通过计算可以求得A点电压变为4V,这样A的值发生了改变,试想一下这样的信号接入到运放的两端是不是相当于比较的两端信号发生了改变,那结果一定会发生偏离。信号源一般内阻是不确定的,一般也不是很小,如果不想改变输入阻抗,那唯一的办法就是改变运放的内阻了,比如内阻改为100K,1M等,越大越好,是不是A点电压就会无限接近6V。

weixin_42855218的博客 1312

嘁,都2020了,你咋还在单纯的使用if-else?

众所周知:if-else在复杂、多选择、大数据量情况下的“反应”总是不如人意。本文给出了几种改善if带来的问题的方案。。。其实,这篇文章算是粉丝福利吧,嘿嘿(本文默认java代码)

flying meng的菜鸟居 1418

Claude Code与Vibe Coding:2026年AI编程实战指南

AI编程助手是基于大语言模型的智能代码生成工具,通过理解编程上下文提供精准的代码补全和重构建议。其核心原理是利用深度学习技术分析代码语义,将自然语言指令转化为可执行代码。这种技术能显著提升开发效率,减少重复性编码工作,特别适用于快速原型开发和复杂问题求解。在实际应用场景中,AI编程助手可与Vibe Coding方法论结合,建立流畅的人机协作工作流。Claude Code作为先进的AI编程工具,支持多语言开发和智能错误检测,而Vibe Coding则强调自然交互和迭代优化,两者协同为开发者提供完整的AI编程解

weixin_29057695的博客 343

如何避免在代码中大量使用if-else?

微信公众号:Java随笔录 关注可了解更多Java相关的技术分享。问题或建议,欢迎公众号留言! 如果你觉得JiangNanMax对你有帮助,欢迎赞赏! 文章目录前言使用枚举使用Optional表驱动法提前判断返回其他公众号赞赏 前言 前段时间,相信大家肯定和小录一样,被各个公众号的一篇标题为“CTO:再写if-else,逮着罚款1000”的推送轮番轰炸。而关于if else,小录也做了点总结,可供参考。 说到逻辑控制语句,相信大家最先想到的就是if…else…。确实,在我们的日常编码中,尤其是算法题目.

JiangNanMax的博客 2212

H无穷控制学习笔记——加权灵敏度H无穷控制问题

一、加权灵敏度H无穷问题 系统结构如上图所示。被控对象P的状态空间方程为(Ap,Bp,Cp,DpA_p,B_p,C_p,D_pAp​,Bp​,Cp​,Dp​),加权函数W1的状态空间方程为(A1,B1,C1,D1A_1,B_1,C_1,D_1A1​,B1​,C1​,D1​),加权函数W2的状态空间方程为(A2,B2,C2,D2A_2,B_2,C_2,D_2A2​,B2​,C2​,D2​),加权函数W3的状态空间方程为(A3,B3,C3,D3A_3,B_3,C_3,D_3A3​,B3​,C3​,D3​)。

一饮丶一啄的博客 4350

【Windows Server 2019】Active Directory Certificate Services 证书颁发机构的安装,配置和管理Ⅰ——AD CS的安装和配置

博文主要介绍了Windows Server 2019的证书颁发机构的安装和配置方法。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 4833

c++if语句(else if)if嵌套语句

if 语句 if语句是一种基本的条件控制语句,它的语法基本跟自然语言中的英语一样(if something happens, do something)。if语句后面还可以选择的加上 else 语句(if something happen,do something ,else ,do other things)。 基本if语句 #include <iostream> using namespace std; //基本if语句 int main() { int num = 5 ; if

m0_62870588的博客 2万+

11.1华为OD机试真题 新系统 - 整理学生编号 (Java/Py/C/C++/Js/Go)

11.1华为OD机试真题 新系统 - 整理学生编号 (Java/Py/C/C++/Js/Go)

算法大师! 422

【C++】深入理解 if-else 语句

在 C++ 编程中,条件判断语句是逻辑控制的核心部分。if-else 语句是编写条件逻辑的基础,用于根据不同条件来执行不同的操作路径。本篇文章将详细阐述 if、else if、嵌套 if 以及常见的 “悬空 else” 问题,并配以代码示例和深入的概念分析,旨在帮助读者彻底掌握这些关键概念,为编写健壮且可维护的代码打下坚实基础。 2024.12.5-✍-54min

禅宗里有一个词叫做“因缘和合”。 所谓因缘,是指事件要发生所必须的条件。因缘和合就是当你聚集了这件事的一切条件,它就会自然而然的发生。“它就会自然而然的发生”,这种朴素而坚定的价值观让我们感到无比安心,安心到可以不用有任何担心焦虑。 2505

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Python条件语句:if-else

希望这篇博客帮助你理解了 Python 中的条件语句。你学习了 if、else、if-elif-else 以及嵌套的 IF 语句,条件语句是编程中非常基础且重要的部分,它们让你的程序可以根据不同的条件作出不同的响应,从而实现更复杂的逻辑。

疯一样的码农 2864

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SoC芯片设计——为什么使用assign语句,来避免使用if-else或者case来设计电路。

0.介绍 对于一块芯片的设计,尤其是芯片CPU内核,为什么你写的代码,别人不敢用,功能正确,验证通过,综合,编译通过,为什么还是没有人会使用?答案很简单,一个主要原因是,你写出的code,性能不高,风险较高,不满足严谨的工业级的开发标准。 下面介绍一下,一个最基本的RTL编写原则——尽量使用阶梯式的assign语句来编写,代替if-else,case的编写。 虽然if-else,case有很多优势,如: 有优先级顺序; 件覆盖率容易debug,这点对于验证来说,能够更快的debug出条件的覆盖率等 1.

用心记录每天的学习,提升自己,虽然有的很基础但真的很重要! 9105

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

python的else if语句_Python if else语句

if 语句是用来检查一个条件:如果条件为真(true),我们运行一个语句块(你为if块),否则(else),我们执行另一个语句块(称为else块)。else子语句是可选的。例如(保存为 if.py):number = 23guess = int(input(‘请输入一个整数:’)) #等待输入整数if guess == number:print('恭喜,你猜对了。') # 新块从这...

weixin_39681161的博客 1902

在vue项目中,减少if-else的使用方法

Vue项目中过度使用if-else会导致代码难以维护。本文提出8种优化方案: 计算属性简化条件判断; 动态组件按条件渲染; 策略模式处理复杂分支; v-if/v-show控制显示; 映射对象管理状态码; 过滤器格式化文本; 配置驱动UI显示; 渲染函数/JSX灵活控制。通过业务场景案例对比各方案优缺点,如计算属性适合简单逻辑但缺乏扩展性,策略模式可维护复杂逻辑但需额外对象。最终推荐根据场景选择合适方案,提升代码可读性和可维护性。

m0_64455070的博客 1476

聊聊java中一些减少if else 的编码习惯

前言 前段时间在阅读别人所写的代码的时候 , 发现其中一些业务相关的方法体内 , 出现了比较多的if-else语句多层嵌套的情况 . 首先我个人不是不提倡写if-else语句 , 不得不说 , 很多时候 , 在写某些逻辑 使用if-else 去做判断 , 代码看起来还是十分直观的 , 但是如果滥用if-else , 形成多层嵌套或者形成, 其中每个case 还包含了大量的逻辑 , 此时从可读性...

wanghao112956的博客 3319

if…else语句、嵌套if…ELSE语句和case语句实现分支选择的区别

If…else语句是从上到下判断,当条件满足,则执行语句体; 嵌套if…ELSE语句是当外面的if条件成立才判断里面的if; Case语句是只需访问对应索引号的表项从而到达定位分支的目的; if else: if…else if语句和多个if语句的区别还是很大的,if…else if在任何一个环节满足条件的时候就将会终止判断,只处理一个满足条件的情况;而对于多个if语句,将会对每一个判断条件进行判断,自然而然会导致程序的执行效率降低。在多个判断条件的情况下,使用if…else if语句相对于使用多个if语句

xiaotiancaililuo的博客 4386

使用php如何减少if else 的多重嵌套判断语句

使用php减少if else 的多重嵌套判断语句优化代码 在平时的代码中,为了代码的高质量和可读性,建议使用if-return代替if-else的结构,既符合单一出口的原则,又实现了代码的嵌套逻辑向平行逻辑转换,应该具备这种设计思想! 优化代码 if层次越少越好 function getThumbQrcodeSize($material_pic_height) { $thumb_qrcode_size = 150; //如果高度小于2000,则生成280*280的二维

徊忆羽菲 1487

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

分享传递价值 2万+

SpringBoot中优化if-else语句的七种方法实战

通过策略模式、枚举与策略模式结合、状态模式, 多态性、Lambda表达式与函数接口、命令模式以及保护子句等策略,我们可以有效地减少Spring Boot项目中`if-else`语句的使用,提升代码的可读性、可维护性和模块化水平。每种策略都有其适用的场景,合理选择和组合这些策略,可以帮助我们编写出更简洁、更高效的代码。

码到三十五 1万+

减少该死的 if else 嵌套!

点击上方“Java后端技术”,选择“置顶或者星标”你关注的就是我关心的!作者:安卓大叔写在前面不知大家有没遇到过像“横放着的金字塔”一样的if else嵌套:我并没夸大...

Java后端技术 1379

减少该死的 if else 嵌套

Linux编程点击右侧关注,免费入门到精通!作者丨java团长写在前面不知大家有没遇到过像“横放着的金字塔”一样的if else嵌套:if (true) {   if (...

<sdffdsfsdfdfs>sfsfsfsdfsdffds</sdfsDS>Fsd 1611

【 python 中 if 的用法(if else, if not, elif)】

本文介绍了常见的if语句的各种用法

F_Y202172的博客 5万+
上一篇: 最详细的 HTTPS 介绍
下一篇: 微信小程序的认识
yi博说
博客等级 码龄11年 20粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值