函数(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从你的指缝间溜走。
所谓项目重构,其实开发中很少有时间回去重构一个项目的,大部分都是开发完了就完了,所以项目是否优雅完全在于大家在平时中是否多留意,多注意,不断地改进才能不断地提高,更加值钱。
以上的这些技巧大部分都是针对大函数的,其实对于小函数可能本身就是一件事情了不需要拆分。
感谢您读完,希望共同成长。
相关推荐
2. **函数提取**:当发现一个函数或方法过长,或者包含了多个职责时,我们可以将其拆分为更小的函数。这样可以使代码更易读,每个函数都有明确的职责。 3. **类的设计**:C++中的面向对象设计原则,如单一职责原则...
重构的过程包括了一系列的小步骤,比如:提取函数(Extract Method)、移除重复代码(Remove Duplication)、内联函数(Inline Method)、提炼类(Extract Class)、内联类(Inline Class)等。通过这些具体的重构...
开始重构时,可以从处理重复代码、过长函数、过大类等问题入手。例如,重复的代码可以通过提取方法来消除,过长函数可以通过分解为多个小函数来改进。对于过大类,可以考虑提取类或使用参数对象等策略。发散式变化和...
《重构:改善既有代码设计》是一本由Martin Fowler所著的经典IT著作,它详细阐述了在软件开发过程中如何通过重构来提升代码质量、可读性和维护性。重构是一种系统性的方法,旨在不改变软件外在行为的前提下,改进其...
标题《重构_改善既有代码的设计-中文完整版PDF》和描述《重构_改善既有代码的设计-中文完整版PDF,Martin Flower大师经典》中提到的是一本由Martin Fowler所著的软件工程领域的经典之作《重构:改善既有代码的设计》...
在描述中提到的"对经验模态分解后的各分量IMF进行重构代码,函数可直接调用",意味着这个压缩包中包含了一个名为"EMDchonggou.m"的MATLAB脚本文件,该文件提供了实现IMF重构功能的代码。用户可以直接运行这个函数,...
### 重构:改善既有代码的设计 #### 书籍概述与核心价值 《重构:改善既有代码的设计》这本书由Martin Fowler撰写,是一本关于软件工程领域的经典著作。它详细介绍了如何通过一系列小步骤对现有代码进行改进,进而...
为了应对这一挑战,《重构改善既有代码的设计》第2版提供了一套系统的方法论,以指导开发者通过重构来持续提升代码质量。 首先,书中给出了重构的定义和重要性。重构是一种特殊的代码修改技术,它不会改变程序的...
2. **最优延时(Optimal Delay)**:计算最佳的时间延迟量τ是一个重要的任务,因为不同的τ会影响重构的质量。`pypsr`包含计算互信息或平均互信息的方法,以找到使延时嵌入保持最大信息的新颖性的τ值。 3. **维度...
第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...
- **自动化测试**:建立一套完善的自动化测试框架是重构成功的关键之一,它能够保证在重构过程中不会破坏原有的功能。 综上所述,重构不仅是一项技术活动,更是提高软件质量、维护性和扩展性的有效手段。通过遵循...
2. **代码重构**:作者强调了代码重构的重要性,通过改善代码结构,提高代码的可读性和可维护性,而不改变其外在行为。介绍了各种重构技巧,如提取函数、替换魔术数字、消除重复代码等。 3. **错误处理和异常机制**...
2. **提炼为函数对象**:将函数和相关状态封装在一起,形成一个函数对象,便于代码的重用和扩展。 3. **合并相似代码**:通过抽象出共同的行为,减少代码的重复。 4. **替换为更清晰的算法**:用更简单、更高效的...
2. 重构的好处 经常重构可以帮助代码保持良好的结构和清晰性,保证代码能够被正确地放置在其最恰当的位置。此外,重构可以帮助开发者更容易地理解程序的工作原理,更快地找到潜在的bug,从而提高编码速度。 3. 重构...
#### 第2章:代码重构的方法 **2.1 重构的基本概念** - **提炼函数**:将函数的一部分代码抽取出来,形成一个新的独立函数。 - **搬移字段**:将一个类中的字段移动到另一个类中。 - **封装类**:为类中的字段和...
### 重构——改善既有代码的设计 #### 一、重构的概念 重构是对软件内部结构的一种调整,目的是在不改变外部行为的前提下,提高代码的可理解性和降低未来的修改成本。这一过程通常涉及对现有代码进行严谨而有序的...
代码重构是一种改善软件设计、提升代码可读性和可维护性的技术。它并不改变代码的外在行为,而是通过改进代码结构来提高代码质量。在这个"代码重构总结实例"中,我们将探讨一系列相关知识点,包括重构的原因、原则、...