`
Goodtiger
  • 浏览: 107460 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

代码写来是用来读的

阅读更多

今天读了一些业务相关的代码,有一个类的方法达到了400多行,里面很多的判断语句,最多的if嵌套深度到达了5层,其实整个方法的业务逻辑并不是很复 杂,就是对调用请求进行一些检查,然后在每种情况下进行一些不同的处理,而且这些处理都比较的简单,但是糅合在一起的代码。却很多的问题
一、很难直白的理解方法的意图
    虽然你可以从if语句的判断条件中读懂整个执行流程,但是这还是很费力的,如果碰到变量名取得不好,或者if判断中间是N个条件的组合判断,你就很难读了。
二、为方法增加新的逻辑之后就很困难而且容易出错
    在众多的判断逻辑中要增加新的逻辑,最大的成本在于你要先读懂原有逻辑,最好是画出原有方法的顺序图,然后基于这个顺序图再来添加新的逻辑,但是基本上是不会有人这么做的,所以添加新的逻辑处理的时候,就基本上是Bug数量迅速增长的时候。
三、方法难以测试
    因为判断逻辑很多,导致代码的执行路径很多,在编写测试用例的时候,做到路径覆盖也是很困难的。而且一旦方法的处理逻辑改变了比较大,基本上所有的测试用例都得重写。
问题肯定还是很多的,简单的重构的方向
一、将判断逻辑封装成方法
    这是最直接的想法,其实就是将复杂的处理逻辑分解成一个个小方法,然后再拼装起来,这样就可以克服上述3个缺点,如果封装的方法名取得得当,那么你就不需 要读懂if的复杂判断语句来理解方法所表达的业务处理逻辑,与此代码的增加新的逻辑就简单了,在较小的方法中进行修改就相对容易多了,但并不是绝对的。
二、利用面向对象进行更深层次的封装
    如果代码中到处都是if的判断语句,那显然是面向过程的痕迹很重,我们可以深入的分析,将设计变得更加面向对象,对对象职责的细分,对象方法处理逻辑的简 化,对象之间的交互更简单直接些。其实这未必更加简单,需要付出的设计、重构的代价也很大。理解更多的对象之间的交互也不是一件简单的事情,但是在可扩展 性方面就更好。

    没有拿实例代码来说明,但是道理还是很简单的,如果想要较小的成本在短时间内进行重构,那么就采用第一种方法,将判断逻辑封装成方法。想要在一个大的系统内得到更好的重构效果,就要重新考虑设计,进行设计到代码两层次的重构。

2
2
分享到:
评论
2 楼 Goodtiger 2008-07-25  
to oldmht
你这么写,看起来还是费神啊,万一要改逻辑的时候,还是得小心翼翼的。
判读逻辑多的话,还是多态的方式处理最好,不过代价也大。
1 楼 oldmht 2008-07-25  
if (A == 1)
{//IF A=1开始
  if (B == 1)
  {//IF A=1 and B=1 开始
    return "这里明显是A=1 and B=1";
  }//IF A=1 and B=1 结束
  else
  {//IF A=1 and B!=1 开始
    return "一看就知道这里是什么";
  }//IF A=1 and B!=1 结束
}//IF A=1结束
else
{//IF A!=1开始
  if (B == 1)
  {//IF A!=1 and B=1开始
     return "我知道这里是A!=1 and B=1";
  }//IF A!=1 and B=1结束
}//IF A!=1结束


复杂的我都这样做

相关推荐

    LAD,自己写的梯形图代码,代码简洁易读

    标题"自己写的梯形图代码,代码简洁易读"表明这是一份个人创作的LAD程序,作者强调其代码结构清晰、易于理解。这对于编程来说至关重要,因为易读的代码不仅有助于开发者自身快速理解代码功能,还便于团队协作和后期...

    读者写者代码

    4. **互斥锁**:用来确保一次只有一个写者可以访问资源。 5. **信号量**:用于实现对资源访问的控制,例如控制多个读者同时访问或限制写者的独占访问。 ### 三、实验代码分析 #### 1. 实验背景 实验代码是基于...

    STM32调试过程中读保护写保护造成的无法擦写芯片问题

    总结来说,解决STM32读写保护导致的芯片无法擦写问题,需要仔细检查和配置调试工具,理解并正确使用STM32提供的相关保护功能,以及合理编写代码操作Flash控制寄存器。掌握这些知识和技能对于开发STM32项目至关重要。

    读共享内存源代码与写共享内存源代码

    本文将深入解析标题中的"读共享内存源代码"和"写共享内存源代码",并探讨如何使用这些技术进行进程通信。 首先,让我们来看读取共享内存的源代码。`readshareMem`程序通常会包含以下步骤: 1. **创建或打开文件...

    片外SRAM读写测试代码,亲测可用

    在压缩包中的“sram_test”文件可能包含了实现上述功能的Verilog代码和测试平台,开发者可以参考这个代码来学习如何在自己的FPGA项目中使用片外SRAM。通过理解和实践这样的代码,不仅可以提高对SRAM操作的理解,还能...

    基于Python写的企业用来导入数据并自动计算工资的智能AI系统源代码.rar

    从压缩包子文件的文件名称来看,“基于Python写的企业用来导入数据并自动计算工资的智能AI系统源代码”可能是一个包含所有源代码文件的主目录。通常,这样的项目会包含以下组件: 1. **数据输入模块**:负责读取...

    SD模式读写源代码

    读写操作前需先通过CMD17(读单块)或CMD24(写单块)指定扇区地址。 3. 数据传输:在设置好地址后,可以开始读写操作。读操作通常由CMD17或CMD51(读多块)启动,然后通过MISO(主输入/从输出)线接收数据;写操作...

    用RxSwift写易维护易读的愉悦代码 宋旭陶.pdf

    文档中提到的“易维护易读的愉悦代码”正是RxSwift的核心优势之一。它鼓励开发者使用函数式编程思想,将业务逻辑拆分为可复用的组件,这样不仅可以提高代码复用率,还能够使代码结构更加清晰。例如,在RxSwift中,...

    Python读写文本的代码.zip

    提供了Python读写文本和读写excel的代码。Python拥有丰富且优质量的库,这些库涉及游戏开发,科学计算,数据库接口,网络脚本编程,资源提供等各个方面。 *资源库:PYPl ——拥有超过85000个Python模块和脚本,这些...

    编写可读代码的艺术.epub

    187张图解轻松入门提供可执行的Matlab程序代码覆盖机器学习中经典、用途广的算法专业实用东京大学教授、机器学习专业专家执笔,浓缩机器学习的关键知识点图文并茂187张图示帮助理解,详略得当,为读懂大部头开路。...

    python读写mdb、读excel的ui界面的源代码和exe文件

    python读写mdb、读excel的ui界面的完整源代码、mdb测试文件和excel测试文件和exe文件,使用Qt Designer产生ui文件,源代码用到了多线程、自定义信号和槽(slot)函数,两个文件打开对话框用来选择mdb文件和excel文件,...

    RFID读写源代码

    这可能包括初始化读写器,设置通信参数,发送读/写命令,接收响应,以及处理错误。源代码会展示如何将数据编码成RFID协议规定的格式,并发送到标签,以及如何解码标签返回的数据。 6. 安全性考虑:RFID技术虽然方便...

    爱心最全代码合集.rar

    比如模板字符串、箭头函数、解构赋值、let和const变量声明,甚至可能涉及到ES2020的新增特性,如Optional Chaining(可选链)或Nullish Coalescing Operator(空值合并操作符)来编写更简洁、易读的代码。...

    该项目用来记录,我用来练手的PHP代码审计项目.zip

    4. 代码规范:遵循PSR(PHP FIG)编码规范,使代码更易读、易维护。 5. 错误处理与日志记录:理解如何正确处理异常,以及如何记录和分析错误日志。 6. 单元测试:通过编写测试用例,确保代码的正确性和健壮性。 7. ...

    通讯录源代码(C#写的)

    这使得代码更简洁易读。 8. **单元测试**:为了确保代码的正确性,开发者可能使用了如NUnit或xUnit等单元测试框架对源代码进行了测试。这包括对添加、删除、修改和查找等核心功能的验证。 9. **设计模式**:源代码...

    HMC833驱动源代码

    总结来说,HMC833驱动源代码的开发涉及了硬件接口设计、通信协议实现、错误处理策略以及寄存器配置等多个方面。理解并掌握这些知识点对于有效利用HMC833LP6GE芯片提升系统性能至关重要。同时,配合相关的工具和文档...

    读书笔记:这个代码库用来存放《Java网络程序设计》王一飞 等编著 教材和我们实验课的代码Wu_Being.zip

    读书笔记:这个代码库用来存放《Java网络程序设计》王一飞 等编著 教材和我们实验课的代码Wu_Being

    C#通过S7.NET库来读/写1200的数据

    这里的DB块是PLC中的一个数据存储区域,可以用来存储程序变量和其他信息。 对于Siemens 1200 PLC,我们需要确保使用正确的DB块地址和数据类型。例如,如果我们要读取一个整型变量,其在DB块中的起始地址可能是以...

    systemverilog读写文件测试代码

    - `file_handle`: 是一个整型变量,用来保存文件句柄。 - `filename`: 字符串类型,指定文件的路径及名称。 - `mode`: 字符串类型,定义文件的打开模式。“r”表示只读,“w”表示写入,“a”表示追加,“rb”表示二...

    采用DELPHI 开发的写、读S50IC卡的项目程序

    在标签中再次提到“采用DELPHI 开发的写、读S50IC卡的项目程序”,这强调了项目的核心技术点,即利用DELPHI的编程能力和智能卡通信协议来实现对S50 IC卡的操作。 至于“zkcx”这个文件名,可能代表的是该项目的源...

Global site tag (gtag.js) - Google Analytics