软件代码坏味道之滥用switch

人工智能-CS188 Project 2: Multi-agents 一、项目介绍 项目介绍网页 项目代码下载 本项目是采用Berkeley的CS188课程内容实习二的内容,在这个项目中,我们将为经典版本的Pacman 设计自动算法,包括幽灵。在此过程中,我们将实现 minimax 和 expectimax 搜索并尝试评估函数设计 完成作业只需要完成5个题目,按照项目介绍的步骤进行完成,主要是在multiAgents.py文件中进行补充代码 二、代码详情 1、Question1:Reflex Agent 略 2、Question2:Minimax 套用ppt上的minm 阅读详情

switch是一种开关,是一种选择语句,用法简单,就是多分支选择语句,就是与多个if语句一样,功能上,switch与if两者可以完全可以相互取代,如果嵌套的if比较少时(三个以内),使用if比较简单,如果选择的分支比较多时,使用if会导致层数比较深,程序冗长,可读性下降;如果分支选择比较多,并且选择的类型码也比较固定的时候,可以使用switch来处理。

但是如果过度使用switch,分支选择不确定,增加或者修改一种类型码,其case分支场景就需要增加或者修改,而且会依赖case分支,不断增加场景,导致后期难以维护;那么这种情况就存在坏味道了,需要考虑重构,使用一些重构手法将switch代替掉。

常见switch坏味道有:

 1)每新增类型码时,都要增加case分支,导致分支越来越多,函数不再短小简洁,违反了开闭原则(OCP)

 2)单个case分支中多了很多事情,导致函数冗长,包含多个抽象层级,违反了单一职责原则(SRP)

 3)switch依赖类型码判断,而类型码往往通过一个统一的类来管理,如果相同的switch语句散布在多个函数中,新增类型码时,必须找出所有switch语句并修改他们,散弹式修改容易遗漏出错

不是switch坏味道的情况:

1)switch只是很简单的逻辑

2)有些设计模式必须存在switch时(如工厂设计模式)

如果解决这些switch坏味道?

1)如果是面向对象语言,可以使用多态的特性来替换它,先提取每个switch-case语句到一个函数中,再将该函数搬移到具体多态性的类中,通过子类/状态/策略取代类型码,用多态特性取代条件表达式。

2)如果面向过程语言,case分支超过5个,可以考虑使用表驱动的方式替换,如果可以预见类型码不会增加,则可以使用策略模式,将控制和处理分离,提高拓展性,符合开闭原则。

代码实现消除switch坏味道

(1)使用多态特性消除switch

public class SwitchBadCode {

    public static void main(String[] args) {

        SwitchBadCode switchBadCode =new SwitchBadCode();

        // 优化switch之前:

        switchBadCode.switchMoth("typeA");

        switchBadCode.switchMoth("typeB");

        switchBadCode.switchMoth("typeC");

        //优化之后:

        switchBadCode.switchMothAfter(new typeAImpl());

        switchBadCode.switchMothAfter(new typeBImpl());

        switchBadCode.switchMothAfter(new typeCImpl());

    }

    // switch 优化之前

    public void switchMoth(String type) {

        switch (type) {

            case "typeA":

                System.out.println("type A");

                break;

            case "typeB":

                System.out.println("type B");

                break;

            case "typeC":

                System.out.println("type C");

                break;

            default:

                System.out.println("default");

        }

    }

    // switch优化之后

    public void switchMothAfter(abstractInter abs) {

        abs.doMeth();

    }

}

/**

 * switch优化,使用多态

 * 1.抽象每个Switch 类型码 ,做成一个抽象类,抽象方法为case的执行的函数

 * 2.每个case,作为一个子类,实现抽象类,并实现其抽象方法,方法就内容就是case的内容

 * 3.使用使用子类来代替类型码,执行case的语句

 * */

interface abstractInter {

    void doMeth();

}

class typeAImpl implements abstractInter {

    @Override

    public void doMeth() {

        System.out.println("type a");

    }

}

class typeBImpl implements abstractInter {

    @Override

    public void doMeth() {

        System.out.println("type b");

    }

}

class typeCImpl implements abstractInter {

    @Override

    public void doMeth() {

        System.out.println("type c");

    }

}

(2)使用策略模式优化switch

使用策略模式也是借用多态的特性,在多态的手法上再封装一下,抽象类变成策略接口,具体实现类保持不变为业务类实现了策略,再创建一个策略类,实例化只能通过策略接口为参数的构造方法,实例化策略类之后,就可以执行策略接口定义的方法;根据不同业务实现类调用相同的方法而具备不同的行为,这就是策略模式的核心目的,同时还可以再优化一下我们如何简单的实例化策略类,可以利用工厂模式,再创建一个工厂类,只需要传递一个switch的状态码就可以实现创建不同的策略类实例,去完成不同的行为。

【项目实战】TARA威胁分析和风险评估 TARA是信息安全领域中的一种风险评估方法,在汽车信息安全的上下文中,TARA分析特别重要,因为它可以帮助识别和管理与智能网联车辆相关的各种威胁,包括数据泄露、未经授权的访问、远程操控等。通过TARA分析,企业可以制定出针对性的安全目标、产品要求和产品安全声明,以确保汽车及其零部件符合相关的信息安全标准和法规。此外,TARA分析还可以与数字化建模系统结合,以更系统化和高效的方式进行风险评估和管理。 阅读详情

相关推荐

Silvaco TCAD仿真4——DeckBuild实战:从示例库到自定义设计

本文详细介绍了Silvaco TCAD仿真工具DeckBuild的实战应用,从示例库的使用到自定义设计的全过程。通过具体案例和参数修改技巧,帮助用户快速掌握TCAD仿真技术,提升半导体器件设计的效率和精度。特别适合需要从基础入门到进阶操作的工程师和研究人员。

weixin_29284657的博客 434

重构改善既有代码设计总结之代码坏味道

一、代码坏味道 1、神秘命名 意义: 使函数、模块、变量和类,能清晰的表明自己的功能和用法(如果想不出一个好名字,说明背后可能潜藏着更深的设计问题) 常用重构手法: (1)改变函数声明(124) (2)变量改名(137) (3)字段改名(244) 2、重复代码 意义: 如果要修改重复代码,你必须找出所有的副本来修改,如果在一个以上的地点看到相同代码结构,设法将它们合而为一 常用重构手法: (1)“同一个类的两个函数含有相同表达式”可以提炼函数(106)提炼出重复代码 (2)如果

zhujian82637的博客 976

Aurix TC3XX Cache memory分析

Aurix Cache memory 分析

qwe0405080615的博客 4346

switch case,一个糟糕的设计!!!

1 什么时候需要使用switch case?说到switch case我们通常都会想到 if else,相较于if else支持任何数据类型、表达式和变量,而switch case只是支...

u012516914的专栏 791

进程间通信的七种方法实战演示!值得收藏!

线程和进程间的通讯(Inter-Process Communication, IPC)是操作系统中的一个重要概念,用于实现不同进程或同一进程中的不同线程之间的数据交换和协调。以下是几个常见的进程间通信的方式:管道、消息队列、共享内存、信号、套接字、信号量、文件映射

十年饮冰,难凉热血,保持热爱,奔赴星海! 2816

【DL经典回顾】距离度量大汇总(7-余弦距离(Cosine Distance))

余弦距离(Cosine Distance)衡量的是两个向量在方向上的差异性,而不是在大小上的差异。

悦学共鸣,温柔以待,汇聚光芒,共同成长 2579

switch语句长点心吧

c语言基础但是自己容易迷的地方 switch语句长点心吧 如下图所示,输出会是什么样子 a=1,b=0 !!! 很明显把break语句忘了,switch(x)的case1后没有 break啊!! 2.switch ( 变量表达式 ) { case 常量1 :语句;break; case 常量2 :语句;break; case 常量3 :语句;break; … case 常量n:语句;brea...

ear217的博客 304

使用epiDisplay包中的logistic

其中的logistic.display函数可以用于获取逻辑回归模型的汇总统计信息,包括自变量的优势比和置信区间,以及回归系数的Wald检验的p值。最后,我们使用print函数打印出汇总统计信息。使用epiDisplay包中的logistic.display函数获取逻辑回归模型的汇总统计信息(包括自变量的初始和调整后的优势比及置信区间,回归系数的Wald检验的p值)- R语言。通过使用logistic.display函数,我们可以方便地获取逻辑回归模型的重要统计信息,并对自变量的影响进行解释和推断。

CyberJolt的博客 608

如何解决大量的if语句或switch case语句?

洪流学堂,让你快人几步。 本篇内容来自洪流读书会解读书籍《代码大全2》。 很多面试官喜欢问这样的问题,如何解决大量的if语句或switch case语句?如果你仅仅在优化的层面回答,可能不能让面试官满意。 那怎么回答更好呢? 表驱动法 在这种情况下可以使用表驱动法。 表驱动法是一种编程模式(scheme)一从表里面查找信息而不使用逻辑语句(if和case)。事实上,凡是能通过逻辑语句来选择的事物,都可以通过查表来选择。对简单的情况而言,使用逻辑语句更为容易和直白。但随着逻辑链的越来越复杂,查表法也就愈发.

大智_Unity探路者 1524

高通SA8295P音频接口深度解析:全面掌握SA8295P的LS-I2S、PCM/TDM与高性能音频处理技术设计

SA8295P提供丰富的音频接口选项,包括LS-I2S、PCM/TDM和HS-I2S接口,具备灵活的配置选项,适合各种高保真音频和高速数据传输应用。结合LS-I2S和PCM/TDM接口:在复杂的音频编解码器设计中,可结合使用LS-I2S和PCM/TDM接口,以处理和传输不同的音频数据流。使用HS-I2S接口:在软件定义无线电(SDR)系统中,高速I2S接口可处理高速数据流,如无线电信号的解码和处理。LS-I2S(低速I2S)接口是SA8295P的一部分,提供了丰富的音频数据传输选项。

weixin_43199439的博客 1405

DFT笔记 DC/AC mode与Func

DFT scan可以分为DC和AC两种,区别如下图。

m0_61544122的博客 5723

switch case语句太多的一种解决方式

比如case从1到100,那么将其分几段处理,先判断处于那一段,再进入case语句处理。

qasxc78563的博客 3215

[VCS]门级仿真及SDF反标

摘要:门级仿真在STA工具普及后仍是验证的重要环节,主要用于检查SDC完备性、异步电路时序、网表完整性及为功耗分析提供波形。门级仿真分为不带时序反标的前仿和带SDF反标的后仿,后仿需加载SDF文件提供精确延时信息。VCS提供多种仿真选项控制时序检查行为,SDF反标可通过命令或系统函数实现。后仿需特别注意关闭notimingcheck选项以确保时序检查有效性,并建议检查SDF反标报告和波形验证延时一致性。

元直的博客 9790

代码中的坏味道

前言 在日常生活中,当我们买的水果放久了之后会发出一种难闻的气味(“坏味道”),这个时候我们就应该把它扔掉。同样,代码也有“坏味道”,当然确定什么是和不是代码“坏味道”是主观的,它会随语言、开发人员和开发方法的不同而不同。在工作当中,很多时候都是在维护之前的项目和在此基础上增加一些新功能,为了能让项目代码易于理解和维护,要时刻注意代码中的“坏味道”,当发现代码如果有坏味道了,要及时去重构它使其变成...

Meldoy_mgh的博客 692

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

25种代码坏味道总结+优化示例

前言 什么样的代码是好代码呢?好的代码应该命名规范、可读性强、扩展性强、健壮性......而不好的代码又有哪些典型特征呢?这25种代码坏味道大家要注意啦 1. Duplicated Code (重复代码) 重复代码就是不同地点,有着相同的程序结构。一般是因为需求迭代比较快,开发小伙伴担心影响已有功能,就复制粘贴造成的。重复代码很难维护的,如果你要修改其中一段的代码逻辑,就需要修改多次,很可能出现遗漏的情况。 如何优化重复代码呢?分三种情况讨论: 同一个类的两个函数含有相同的表达式 class A

uuuyy_的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【教程】代码的坏味道

本文总结了8种代码坏味道及其改进方法,分为可读性和结构组织两类。可读性问题包括神秘命名(建议重命名)和过度注释(建议提炼函数);结构问题包括重复代码(提炼函数)、过长函数(分解为小函数)、过长参数列表(封装为对象)、冗余元素(内联移除)、过度通用性(简化设计)和过大的类(拆分职责)。每种坏味道都提供了C++代码示例,展示了如何通过重构技术(如重命名、提取函数/类等)改善代码质量,使代码更清晰、可维护且符合单一职责原则。

码的世界 863

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

代码坏味道之滥用面向对象

:notebook: 本文已归档到:「blog」 翻译自:https://sourcemaking.com/refactoring/smells/oo-abusers 滥用面向对象(Object-Orientation Abusers)这组坏味道意味着:代码部分或完全地违背了面向对象编程原则。 Switch 声明 Switch 声明(Switch Statements) 你有一个复杂的 ...

weixin_34293059的博客 316

java 代码坏味道_代码中的坏味道

前言在日常生活中,当我们买的水果放久了之后会发出一种难闻的气味(“坏味道”),这个时候我们就应该把它扔掉。同样,代码也有“坏味道”,当然确定什么是和不是代码“坏味道”是主观的,它会随语言、开发人员和开发方法的不同而不同。在工作当中,很多时候都是在维护之前的项目和在此基础上增加一些新功能,为了能让项目代码易于理解和维护,要时刻注意代码中的“坏味道”,当发现代码如果有坏味道了,要及时去重构它使其变成优...

weixin_42298164的博客 1110

《重构》笔记摘录 - 2.代码坏味道

写下的代码应该直观明了。整洁代码最重要的一环就是好的名字,所以我们会深思熟虑如何给函数、模块、变量和类命名,使它们能清晰地表明自己的功能和用法。改名不仅仅是修改名字而已。如果你想不出一个好名字,说明背后很可能潜藏着更深的设计问题。为一个恼人的名字所付出的纠结,常常能推动我们对代码进行精简。

lnluozi的博客 871

重复的switch(Repeated Switches):坏味道识别与重构实战指南

重复的switch是指相同的switch语句在多个地方重复出现,应该使用多态替代。就像同一份菜单的多个副本,当需要更新菜单时,必须同步更新所有副本,否则就会出现不一致。核心问题switch语句通常表示类型相关的行为,应该使用多态来实现。多态可以让每个类型自己处理自己的行为,避免重复的switch语句。使用的重构手法用多态替代条件表达式(Replace Conditional with Polymorphism):将switch语句替换为多态提取类(Extract Class)

随心随手随意随记 1984

重构总结 - 代码的坏味道

本文总结了代码重构中常见的22种"坏味道",包括重复代码、过长函数、过大类、过长参数列等典型问题。每种问题都提出了对应的重构方法,如提炼函数、分解类、引入对象参数等。文章强调重构的核心原则是将总是一起变化的东西放在一起,通过合理的代码组织消除冗余、提高可维护性。其中特别指出,过度注释往往是需要重构的信号,应当通过提炼方法、重命名等手段让代码自解释。这些重构技巧可以帮助开发者改善代码质量,使系统更易于理解和修改。

小人物的草稿本 1088

识别代码中的坏味道(一)

在前面的文章中,我们介绍了 《提升编程效率:重构》 以及 《何时开始重构?》。了解了那些能够更好的辅助团队或者个人进行重构,但是要让重构真正产生作用是需要能够代码中的坏味道,并消除代码中的坏味道。 如下图是工作中常见的代码的坏味道: 上图中的坏味道出自《重构》这本书,虽然并不是全部,但是涵盖了日常中最常见的一些代码坏味道。 接触这些坏代码可以分为三类: 见名知意的代码坏味道: 稍微解释即可掌握的代码坏味道; 通过一些例子即可掌握的代码的坏味道; 本文主要聚焦在“见名知意的代码坏味道”,后.

PageThinker 1148

重构笔记——代码的坏味道(上)

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.youkuaiyun.com/pistolove/article/details/42041757 在重构入门篇中,简单地介绍了重构的定义、为何重构、何时重构等。我想对于重构是如何运作的,你已经有了较好的理解了。但是对于代码中的坏味道,你可能知道的并不多。坏味道可能是无形中产生的,也可能是开发人员偷懒造成的,还可能是其它某些因素导致的。不管怎么样,代码中的坏味道对程序没有半点好处,它会促使程序腐烂,甚至变质。对于开发人员,真的是很有必要

皮斯特劳沃 1万+

代码的坏味道

代码坏味道:是指在代码之中潜在问题的警示信号。并非所有的坏味道所指示的确实是问题,但是对于大多数坏味道,均很有必要加以查看,并作出相应的修改。 1. 重复的代码 如果你在一个以上的地点看到相同的程序结构,那么当可肯定:设法将它们合而为一,程序会变得更好。 同一个class内的两个函数中含有重复的代码段 两个兄弟class的成员函数中含有重复的代码段 两个毫不相关的cl

风马的专栏 540
上一篇: 对软件代码坏味道的认识
下一篇: 对软件建模的全面认识
huahua.Dr
博客等级 码龄8年 87粉丝 68原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值