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

关于代码重构的体会———其一

阅读更多
最近看了一本关于代码重构的书–《重构-改善既有代码的设计》,闲暇时来读,发现收益颇丰,下面就把自己的几点体会写下与大家分享

一:印象最深刻的就是书中提到的各种代码的“坏味道”,就是说一旦你的代码中出现了这几种“坏味道”,就是你该代码重构的时候了,举几个容易被大家遗忘的事例来说明
(1)不要出现发散式变化:意思是说对一个class,最好对应一种变化,而不是对应很多种变化。比如出现一个class对应三种变化的情况,那么最好把这个class分成三个,每个class对应一种变化,这样,每一个class就可以只因为一种变化而需要修改。是不是感觉代码变得容易修改了?
(2)不要出现散弹式修改:这种情况与上一种恰恰相反,就是说一种变化最好不要修改多个类,因为如果一种变化要修改的代码散布四处,你不但难找到它们,也很容易忘记某个重要的修改。
(3)前面的(1)和(2)要说明的是,类和变化的关系最好是一对一的关系,这样写出来的代码才会清晰,而且可维护性很高。
(4)不要出现纯粹的数据类:纯粹的数据类是指,它们拥有一些值域,以及这些值域的get和set方法,除此之外什么都没有。消除这种class的方法就是:首先,找出这些取值/设值函数被其他classes运用的函数,如果这些函数与这个数据类的联系比它本身的宿主类还紧密,就尝试着把这些函数搬移到这个纯粹的数据类中来。如果无法搬移,就从这个函数中提取一个可被搬移的函数,再把这个函数搬移到纯粹的数据类中来。
(5)不要出现冗余类:项目中经常出现这样的情况,一个class刚开始可能很有用,但是随着时间的迁移,逐渐的被人遗弃了。在这个时候,就应该勇敢的舍弃它,删掉它(因为如果还有别的函数要引用它,编译器会报错的)。
(6)有的时候也不能出现过多的注释:过多的注释往往意味着你的这段代码写得很糟糕,需要通过长长的注释才能让别人理解,因此,在这种情况下,通常需要把这块代码的业务
逻辑提取成几个函数,然后替这几个函数取几个好名字,最后只要调用这几个函数就行了。这样的话,就算你不写注释,别人来读你这段代码的时候,也会感觉在读注释一样轻松   。

二:另外在这本书中还提到了一些很有意思的重构方法

  (1)用对象来代替方法:大家常常会碰到这样的函数,这个函数很长,很明显需要被拆分成好几个函数了,但是由于被此函数太多的局部变量的拖累,使得拆分变得很困难。当然你可以通过传参数来解决,但是过多的参数的传来传去必然会导致代码的清晰度受到很大的影响。那么在这种情况下,就应该把这个函数转化成一个单独的类,那么,原函数中的局部变量也就变成这个类中的值域,想想看,这样的话,对原有函数的拆分是不是就变得简单了。

  (2)用表达式来代替临时变量:有的时候会出现这种情况,你的程序中的一个表达式被赋给了一个临时变量,然后接下来的程序中调用的都是这个临时变量而不是这个表达式(有的人会说这样性能会提高一些)。 是的,这样性能是会提高一些,但是想一下,如果你的程序中有很多的这样的临时变量,那你的这段程序是不是很难被拆分成几个更小的函数,也就是很难被重构成结构更优化的代码。而情况往往就是如果你的代码的结构比较优化,清晰度比较高,那么你就会发现更有效的性能优化的方案。所以就会出现两种情况,要么你用很多的临时变量来提高一点点性能,从而与更有效的性能优化的方案失之交臂;要么你通过一点点性能的损失,来换取更有效的性能优化的方案。你选哪个?
  (3)把临时变量拆分成多个临时变量 :在很多种情况下,你的程序中的临时变量被赋值很多次,但是它既不是循环变量(如for(int i=0;i<100;i++)语句中的i),也不是一个累加临时变量(例如字符串的拼接)那么,我们就应该针对每一次赋值,创造一个独立的,对应的临时变量,使得每一个变量只承担一个责任。因为如果一个临时变量承担多个责任,就会使代码阅读者感到糊涂。
  (4)用一个临时变量来取代参数被赋值:如果要使一个函数内的程序变得清晰,一个很好的方法就是不要改变你传进这个函数的参数,因为这样会使阅读者搞不清楚这个参数所承担的责任。因此,如果程序中看到你的参数被赋值了,那么,我想最好的办法就是用一个临时变量来取代参数来进行赋值动作。然后,以赋值动作为界,将后面程序对参数的引用动作,全部改为对临时变量的引用动作
  (5)以对象取代数组 :有很多时候,你会有一个数组,这个数组中的每一个元素代表不同的东西。那么,在这种情况下,我们就应该以对象取代数组,对于数组中的每一个元素,以一个值域
表示之 ,举个例子:

String[] p=new String[2];
p[0]=”man”;
p[1]=”23″;
p[2]=”mocui”;

用对象代替,就变成

People p=new People();
p.setSex(”man”);
p.setAge(”23″);
p.setName(”mocui”);

数组应该用来容纳一组相似的对象,如果用来容纳了数种不同对象,你会发现一些问题,比如你很难去记住p[0]代表的是什么,而p[1]代表的又是什么,但是用对象来封装这些数据就不同了,你通过p.getSex(),p.getName()能够很容易知道我们得到的数据代表的是性别和名字。而且如果使用对象,你还可以把与这个对象相关的行为提取成一个个方法,放到这个对象中。这样代码的清晰度将会进一步提升。

当然,在相似的情况下,用对象也可以来取代List等集合。

总结:代码重构的首要目标是使得代码的可读性,可维护性和可扩展性进一步提高。因此,你会发现很多的重构方法是不惜牺牲一点点的性能来取得代码的清晰度的,原因有几点:
其一:一段可读性很高的代码能够节省程序员理解代码的大部分时间,提高程序开发的效率,与之相比,一点点性能的损失又算的了什么呢?
其二:如果一段代码重构的好,你往往会发现接下来会有更好的性能优化方法,而如果你没有通过损失一点点的性能来重构你的代码,你往往会与这个方法失之交臂。
1
2
分享到:
评论

相关推荐

    写好代码的十个秘诀——一个编程高手的新的体会!

    以下是从标题、描述和部分内容中提取的关于如何编写一流代码的十个秘诀: 1. **鲁棒性**:代码应坚固且稳定,能够处理异常情况,比如在示例代码中,当`CrntQtr`等于0时可能导致崩溃,应当添加适当的边界检查来确保...

    戏说面向对象程序设计

    第一章面试受挫——代码无错就是好? 第二章代码规范、重构 第三章复制 VS复用 第四章业务的封装 第五章体会简单工厂模式的美妙 第六章工厂不好用了? 第七章用“策略模式”是一种好策略 第八章反射——程序员的快乐...

    面向对象程序设计之C#版Grady Booch.pdf

    **第一章:面试受挫——代码无错就是好?** - **面试案例分析**:通过一个小故事,讲述了一位即将毕业的学生在面试中遇到的实际问题。虽然学生能够快速完成任务,但是没有考虑到代码的结构和质量,最终导致未能通过...

    面向对象程序设计C#版---.zip

    代码规范、重构 第三章............复制 VS 复用 第四章............业务的封装 第五章............体会简单工厂模式的美妙 第六章............工厂不好用了? 第...

    戏说面向对象程序设计(C#版).pdf

    - **重构**:定期进行代码重构可以优化代码结构,提高其可维护性和可扩展性。 #### 三、复制与复用 **复制VS复用** - **复制**:简单的复制代码会导致代码冗余,增加后期维护成本。 - **复用**:通过继承、组合等...

    戏说面向对象程序设计 C#版

    第一章“面试受挫——代码无错就是好?”讲述了一个应届毕业生小菜在面试时遇到的编程挑战。虽然他快速编写了一个计算器程序,但仅保证代码没有错误是不够的。面向对象编程不仅仅是避免错误,更重要的是设计出结构...

    Python编程——从入门到实践外星人入侵项目

    然后安装第三方库pygame(功能很强大),这个项目代码还是比较多的,需要学习管理包含多个文件的项目,体会到函数以及变量命名方法还需要重构很多代码,以提高代码的效率,总之,对于刚入门来说,是一个用来练手的一...

    《.NET实践之旅 C#篇》黄凯波著

    最重要的是,本书将作者工作时的心得体会穿插在章节之中。书中所有的关键技术术语也会在括号中给出对应的英文单词,以方便读者阅读及搜索外文资料。 本书针对因工作等需要使用c#(.net framework)来完成软件项目的...

    chaojimali.rar_chaojimalixiaoyouxi_game

    优化技巧则关系到游戏性能的提升,文档可能会详细讲解如何通过代码重构、资源管理等方法来优化游戏,从而为玩家提供更加流畅和稳定的游戏体验。 “增强版源码”文件同样是资源包中的亮点。这一部分的源代码是已经...

    The Pragmatic Programmer

    《程序员修炼之道——从码农到大师》(英文原版名为"The Pragmatic Programmer"),是一本备受推崇的IT行业经典书籍,旨在帮助程序员提升技能、优化思维,并成长为更高效的专业人士。这本书由Andrew Hunt和David ...

    VB程序实例64_控件应用_闹钟程序.zip

    同时还需要进行性能优化和代码重构,以确保程序运行的稳定性和效率。 VB编程语言因其简单易学、开发快速而受到许多初学者和业余爱好者的青睐。通过这个闹钟程序的实例,学习者不仅能够掌握VB的基本语法和控件使用,...

    java课程设计--俄罗斯方块

    - **问题解决策略**:开发者可能会分享在实现过程中遇到的问题及其解决方案,比如性能优化、代码重构等。 - **经验教训**:通过实际项目学习到的编程技巧,如何提高代码可读性和可维护性等。 6. **文档编写**: ...

    易语言扑克压赔小游戏源码.zip易语言项目例子源码下载

    通过修改和扩展游戏功能,初学者还可以实践软件工程中的模块化设计和代码重构等高级技能。 对于学生而言,将这个项目用作毕业设计,不仅能够体现出其编程技能,还能够展示出对项目开发流程的理解。学生可以通过增加...

    springboot精选项目汽车租赁系统.zip

    通过源码的阅读和分析,学习者可以加深对敏捷开发流程中代码重构、持续集成、测试驱动开发等实践的理解。 这个精选的汽车租赁系统项目是一个不错的学习资源,它不仅能够帮助学习者深入理解Spring Boot框架,而且...

    计算机简单编程示例..docx

    最后,计算等差数列的和则涉及到了循环的另一种形式——do-while循环。在这个例子中,以步长为2,累加偶数直至超过100,使用do-while循环可以在循环体至少执行一次的情况下,很好地控制累加过程。 通过上述示例,...

    OldProjects

    对于有经验的开发者来说,这些代码可能勾起了对编程早期的回忆,理解软件开发历史上的某些变化,体会到在项目中不断优化和重构代码的重要性。 实际上,旧项目的代码能够提供给学习者宝贵的第一手材料,通过它,可以...

    eda课程设计报告.docx

    FPGA(Field-Programmable Gate Array)因其可重构性和灵活性,成为实现数字逻辑设计的理想选择。设计方案需考虑如何用VHDL语言描述时钟的逻辑功能,包括计时模块、控制模块、显示驱动模块和报时模块。 **三、小组...

Global site tag (gtag.js) - Google Analytics