`
朱秋旭
  • 浏览: 229959 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

重构代码之2-函数

阅读更多

函数(Java中称之为方法,由于我是一名Java程序员,所以下文就都写为函数了酷)无疑是程序员理解程序逻辑的第一手资料,同样毫无疑问让函数变得清晰,规整就成为了写好代码的关键点。如何写出一个个牛逼的函数呢?我觉得是这样的:

 1  短小精悍,只专注于一件事情。

我真的不知道我该如何用各种公式去证明这个理论的成立,但是个人觉得if,else,while这样的语句一个函数中就应该出现一次,保持函数短小,块内调用函数由于拥有较具说明性的名字(当然要是你自己命名较优雅),从而使得结构格外清晰,易读。短小精悍就意味着不应该在函数中出现大量的嵌套,缩进层级也不要多于两级,这样的函数读起来会很舒服。

一个函数就应该做一件事情,确切的说应该是一个函数就应该做一个层级上的一件事情,其实判断一个函数是否不止做了一件事情很简单,就是试图将这个函数拆分成两个函数。只有函数中的所有的语句都处于同一层级,才能将基础和细节进行合理的拆分,逻辑上也会清晰,不至于进入纠结的状态。同时代码拥有自顶向下的阅读顺序,我们在每个层级的函数后面跟随着下一抽象层级的函数,当以后查看代码时候就能循抽象层级进行阅读。

 

2  万恶的switch

说了半天函数应该专注一件事情,结果switch的存在貌似违背了这个原则,因为switch原生支持多件事情,那我们如何避开switch带来的问题呢?个人觉得像switch语句埋藏于深处,抽象层级,可以放到工厂中根据需求来生产对象。

首先看一段代码

 很清晰问题在于,如果我当前类中还有相似的方法isPayDay,deliverPay等,依然需要写各种状态的判断,同时如果增加了一个状态,必须重新每个方法。这是个在平常编码中很常见但是又很少有人解决的问题,如何解决呢看下面的代码

 其实也就是采用了接口编程的方法,屏蔽具体细节,使用类与状态判断进行一一对应,如果有新的状态引入,直接继承,重写就ok了,解了耦合,又清晰了代码。

 

3  函数参数越少越好

 参数少,首先解放的就是测试,越少的参数意味着测试更容易覆盖。

对于函数的返回值而言,如果这个函数做的是转换,那么用返回值更容易理解,如果这个函数的参数是event,或者做的是类似StringBuffer类中的append方法的事情,这样不使用返回值会更加的容易(其实是用this指针作为返回值)。

鼓励参数越少越好,如果你维护过多参数方法的代码你就会知道,需求突然说要再加一个参数,你会一直去修改方法的定义以及所有的调用,这样会让你的代码变得异常的恶心,千万不要这样做。可以把多参数抽象成为一个参数类(Point, Circle, etc)方便维护,当然最好的办法肯定是细化函数粒度,使用更少的参数。

 

4  函数无副作用,分清楚做什么事和回答什么事

比如说一个函数校验用户名,密码问题,就不要去做关于初始化session的问题,如果两个耦合无法拆分的话,可以破坏做一件事情的原则,但是要把函数名命名的清晰就可以了。

对于传入boolean变量作为函数的参数是要坚决杜绝的,用传入的true or false 判断做不同的事情,直接说明了就是两件事情两个函数,比如传入一个什么String "add" "modify"使用一个函数也是一样,直接就应该写成两个函数逻辑。

 

5  错误处理

使用异常代替返回错误码,好处就是异常类可以通过继承扩展,同时也简单明了。要注意的一点是异常是要在同一个层级处理的,不能到处都是处理异常的代码看起来会非常的混乱。异常处理本身就是一件事情,单独一块处理最好。



 

 6  避免冗余的代码

同样的代码如果写了两次,你就要考虑抽象成为一个工具类或者工具函数(方法)了,这样才不会出现修改了一处的逻辑却忘记了修改另一处,导致上线后,大把的money从你的指缝间溜走。

 

所谓项目重构,其实开发中很少有时间回去重构一个项目的,大部分都是开发完了就完了,所以项目是否优雅完全在于大家在平时中是否多留意,多注意,不断地改进才能不断地提高,更加值钱。

以上的这些技巧大部分都是针对大函数的,其实对于小函数可能本身就是一件事情了不需要拆分。

感谢您读完,希望共同成长。

  • 大小: 14.8 KB
  • 大小: 32.7 KB
  • 大小: 6.3 KB
  • 大小: 12.6 KB
分享到:
评论

相关推荐

    重构源代码C1-c++版本

    2. **函数提取**:当发现一个函数或方法过长,或者包含了多个职责时,我们可以将其拆分为更小的函数。这样可以使代码更易读,每个函数都有明确的职责。 3. **类的设计**:C++中的面向对象设计原则,如单一职责原则...

    重构----改善既有代码的设计(完整中文扫描版PDF)

    重构的过程包括了一系列的小步骤,比如:提取函数(Extract Method)、移除重复代码(Remove Duplication)、内联函数(Inline Method)、提炼类(Extract Class)、内联类(Inline Class)等。通过这些具体的重构...

    《重构》----学习笔记

    开始重构时,可以从处理重复代码、过长函数、过大类等问题入手。例如,重复的代码可以通过提取方法来消除,过长函数可以通过分解为多个小函数来改进。对于过大类,可以考虑提取类或使用参数对象等策略。发散式变化和...

    重构_重构_改善既有代码_

    《重构:改善既有代码设计》是一本由Martin Fowler所著的经典IT著作,它详细阐述了在软件开发过程中如何通过重构来提升代码质量、可读性和维护性。重构是一种系统性的方法,旨在不改变软件外在行为的前提下,改进其...

    重构改善既有代码的设计第2版.pdf

    重构改善既有代码的设计第2版.pdf 本书主要讨论了如何通过重构来改善既有代码的设计,提高代码的可维护性、可读性和可扩展性。下面是对书中重要的知识点的总结: 1. 重构的定义和重要性:重构是指对既有代码的修改...

    【EMD重构】.rar_EMD重构函数_IMF变量重构_tomorrowi4n_模态分解_重构

    在描述中提到的"对经验模态分解后的各分量IMF进行重构代码,函数可直接调用",意味着这个压缩包中包含了一个名为"EMDchonggou.m"的MATLAB脚本文件,该文件提供了实现IMF重构功能的代码。用户可以直接运行这个函数,...

    (相空间重构PYTHON)pypsr-master.zip

    2. **最优延时(Optimal Delay)**:计算最佳的时间延迟量τ是一个重要的任务,因为不同的τ会影响重构的质量。`pypsr`包含计算互信息或平均互信息的方法,以找到使延时嵌入保持最大信息的新颖性的τ值。 3. **维度...

    重构 改善既有代码的设计 中文高清完整版pdf

    ### 重构:改善既有代码的设计 #### 书籍概述与核心价值 《重构:改善既有代码的设计》这本书由Martin Fowler撰写,是一本关于软件工程领域的经典著作。它详细介绍了如何通过一系列小步骤对现有代码进行改进,进而...

    重构-改善既有代码的设计

    第2章 重构原则 53 2.1 何谓重构 53 2.2 为何重构 55 2.3 何时重构 57 2.4 怎么对经理说 60 2.5 重构的难题 62 2.6 重构与设计 66 2.7 重构与性能 69 2.8 重构起源何处 71 第3章 代码的坏味道 75...

    重构_改善既有代码的设计-中文完整版PDF

    标题《重构_改善既有代码的设计-中文完整版PDF》和描述《重构_改善既有代码的设计-中文完整版PDF,Martin Flower大师经典》中提到的是一本由Martin Fowler所著的软件工程领域的经典之作《重构:改善既有代码的设计》...

    代码之美---精选版

    2. **代码重构**:作者强调了代码重构的重要性,通过改善代码结构,提高代码的可读性和可维护性,而不改变其外在行为。介绍了各种重构技巧,如提取函数、替换魔术数字、消除重复代码等。 3. **错误处理和异常机制**...

    重构--改善代码结构

    2. **提炼为函数对象**:将函数和相关状态封装在一起,形成一个函数对象,便于代码的重用和扩展。 3. **合并相似代码**:通过抽象出共同的行为,减少代码的重复。 4. **替换为更清晰的算法**:用更简单、更高效的...

    PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数

    2. 重构的好处 经常重构可以帮助代码保持良好的结构和清晰性,保证代码能够被正确地放置在其最恰当的位置。此外,重构可以帮助开发者更容易地理解程序的工作原理,更快地找到潜在的bug,从而提高编码速度。 3. 重构...

    重构-改善既有代码的设计-课件.ppt

    ### 重构——改善既有代码的设计 #### 一、重构的概念 重构是对软件内部结构的一种调整,目的是在不改变外部行为的前提下,提高代码的可理解性和降低未来的修改成本。这一过程通常涉及对现有代码进行严谨而有序的...

    代码重构总结实例

    代码重构是一种改善软件设计、提升代码可读性和可维护性的技术。它并不改变代码的外在行为,而是通过改进代码结构来提高代码质量。在这个"代码重构总结实例"中,我们将探讨一系列相关知识点,包括重构的原因、原则、...

Global site tag (gtag.js) - Google Analytics