重新组织函数
大多数问题都源于Long Methods,因为他们往往包含了大量的信息,而这些信息有被函数中错综复杂的逻辑所掩盖,不易甄别。所以重新组织函数中最主要的重构手法就是extract method。在使用extract method的手法时一般需要用到处理参数的一些手法,如:replace temp with query,split temporary varaibable和replace method with method object.
当然如果发现原来的实现方式复杂导致了过程函数,而又另外的更为简明、解决方式更优的方法的话,可以使用substitute algorithm手法替换掉该Method。
一.Extract Method【★】
如果有一段代码可以组织在一起并且独立出来,那么就可以把它们放进一个独立的函数中,并让函数名解释这段代码的用途。
一般如果一个函数过长或者一段代码需要注释才能看懂,那么这段代码就可能需要放进一个可以自解释的独立函数中。
处理步骤:
1.提炼出该代码片段,放到一个新函数中,新函数的函数名能够描述该段代码的用途。
2.找出该新函数中访问到的作用域仅限于源函数的局部变量和参数。
这些变量中较为难处理里主要包括3类基本类型的局部变量和参数:
⑴.对于源函数的参数,直接放到新函数中的参数列表中。
注:应确保原函数中不要修改传入的参数。否则用过使用Remove Assignments to Parameters手法先处理掉。
⑵.仅用于该提炼代码片段的局部变量(临时变量),对于这里变量可以直接在新函数中声明为新函数的局部变量。
⑶.在提炼代码片段以外的地方进行了有意义地赋值或者访问的变量。
如果该代码段中只有一个局部变量被赋值了,那么可以考虑将该新函数修改为一个查询或者返回该变量值的函数。如果这样处理非常难或者有不止一个局部变量被修改了,那么这个段代码可能不能这样原封不动的提炼出来了,可能需要先根据一个变量一个职责的原则先用split temporary avariable等手法先处理下这个方法,然后再尝试提炼。另外也可以先使用relpace temp with query的手法消灭一部分局部变量。
3.处理完局部变量之后,进行编译。
4.替换源函数中的代码段为调用该新函数,并去除不用的局部变量声明。
5.编译,测试。
二.Inline method
如果一个函数的实现同他的函数名称一样明了,而且比较简单。那么就可以将该函数的内容移入到调用该函数的地方去。然后移除该函数。
一般该手法是配合Extract Method使用的,在进行Extract Method之前使用Inline Method,然后使用Extract Method重新组织函数。
注:如果该函数是多态调用的,那么不可以进行这样的重构。
三.Inline Temp
使用不多。
四.Replace Temp with Query
程序中以一个临时变量保存一个表达式的结果,那么可以将该表达式提炼到一个新函数中去,然后在使用这个临时变量的地方换成调用该函数即可。
注:该手法用在Extract Method之前用来减少临时变量。
五.Introduce Explaining Variable
用的不多,基本上都是可以使用extract method。
六.Split Temporary Variables
原则:每个临时变量都应该只承担一个责任。
如果一个变量被赋值了一次以上的(不包括循环变量和结果累计变量),那么就意味着该变量的职责不是一个了,就应该被替换为多个变量,每个变量分担一个职责。
七.Replace Method with Method Object【★】
有一个大型函数,其中局部变量的使用使得你无法采用Extract Method的时候:
将这个函数放到一个单独的对象中,如此一来函数中的局部变量就变成了该对象的属性字段了。然后你就可以在这个对象中将这个大型函数分解成多个小函数了。
处理步骤:
1.根据该大型方法的功能,新建一个类。
2.新类中新建一个final属性保存该大型函数所在的原对象。
3.对于原函数中的局部变量和参数在新对象中新建一个属性与之对应。
4.新建一个构造函数,构造参数包含一个源对象和各个局部变量以及源函数的参数
5.新建方法,然后将原函数搬入(假设命名为compute)
6.重构该函数。
7.编译测试。
8.替换原函数体为new 一个新对象,并调用新建对象的方法compute。
八.Substitute Algorithm
用新算法替换掉旧函数体
分享到:
相关推荐
SQL Server 重新组织和重新生成索引 在 SQL Server 中,索引的碎片可能会对查询性能产生影响,因此需要对索引进行维护。SQL Server 2005 提供了重新组织和重新生成索引的功能,以修复索引碎片。 重新组织索引 ...
提供组件机构代码校验函数,可以由外部函数直接调用,返回true或false
### 单位组织机构代码校验函数(Oracle) #### 概述 本文将详细介绍一个用于验证单位组织机构代码有效性的Oracle标量函数。该函数在实际的商业环境中得到了广泛的应用与检验,确保了数据处理过程中的准确性与一致...
在C语言中,函数是程序的...函数帮助我们将代码组织成可重用的部分,参数传递允许我们在函数之间交换数据,而数组作为参数则允许我们处理集合数据。通过熟练掌握这些概念,你可以编写出更加复杂且富有逻辑的C语言程序。
在C语言中,函数是代码组织的基本单元,它是一段可重复使用的代码块,执行特定的任务。本资源“C语言函数大全”包含了丰富的函数例题,旨在帮助学习者深入理解和熟练掌握C语言中的函数用法。下面我们将详细讨论C语言...
通常,驱动函数并不包含复杂的逻辑,而是相对简单地组织测试流程。 桩函数和驱动函数在单元测试中的应用,对于简化测试过程、提高测试效率和准确性有着不可替代的作用。桩函数的使用降低了测试对环境的依赖性,同时...
在MATLAB中,可以将测试函数组织到测试类中,或者作为单独的脚本运行。例如,要运行一个特定的测试函数,你可以直接调用它的名称,如`run('test_foo')`。如果想运行整个测试集合,可以使用`runall`命令。 此外,...
MySQL关于自定义函数以及常用函数的组织点的总结(例如日期函数)
在C++编程中,线程(Thread)是并发执行的代码段,允许程序...这允许线程直接访问和操作类的私有数据,同时提供了更好的封装性和代码组织。但也要注意线程安全、资源管理和异常处理等问题,确保程序的正确性和高效性。
这种方式为函数调用提供了更灵活的组织结构。示例代码如下: ```javascript var myFunctions = { targetFunction: function() { alert(11111); return 9; } }; test("targetFunction", myFunctions); function ...
在C语言中,函数是组织代码的基本单元,允许我们复用代码并执行特定任务。本篇将深入探讨C语言函数的相关知识点,帮助你更好地理解和运用这些功能。 1. 函数定义与声明: 在C语言中,函数由`return_type function_...
在C/C++编程语言中,函数是代码组织的基本单元,它们允许我们将一组特定任务封装到一个可重用的模块中。C/C++函数大全通常包括了各种标准库提供的函数,这些函数涵盖了输入/输出、数学运算、字符串处理、内存管理等...
第6章 重新组织函数 6.1 ExtractMethod(提炼函数)110 6.2 InlineMethod(内联函数)117 6.3 InlineTemp(内联临时变量)119 6.4 ReplaceTempwithQuery(以查询取代临时变量)120 6.5 ...
第6章 重新组织函数109 6.1 ExtractMethod(提炼函数)110 6.2 InlineMethod(内联函数)117 6.3 InlineTemp(内联临时变量)119 6.4 ReplaceTempwithQuery(以查询取代临时变量)120 6.5 ...
第6章 重新组织函数109 6.1 ExtractMethod(提炼函数)110 6.2 InlineMethod(内联函数)117 6.3 InlineTemp(内联临时变量)119 6.4 ReplaceTempwithQuery(以查询取代临时变量)120 6.5 ...
这种特性使得代码组织更加清晰,尤其在处理复杂计算问题时,能够更好地封装和复用代码。以下是对给定标题和描述中所述知识点的详细说明: 1. **主函数与嵌套函数的调用关系** 主函数 `funmin` 在这里负责调用另一...
首先,C语言中的函数是代码组织的基本单元,它封装了特定的功能,可以被其他部分的代码调用。理解函数的工作原理,包括参数传递、返回值、局部和全局变量等,是成为熟练C程序员的基础。在编程过程中,经常需要查阅...
在C# .NET编程环境中,函数是代码组织和重用的核心元素。函数允许我们将复杂的任务分解为可管理和独立的部分,从而提高代码的可读性和可维护性。本压缩包文件"自定义函数"包含了关于C# .NET中内置函数和自定义函数的...
- **learnsom**:自组织映射权学习函数,用于调整自组织映射网络的权重。 - **learnh**:Hebb学习规则,基于Hebbian理论。 - **learnhd**:退化的Hebb学习规则。 - **learnis**:内星学习规则,用于自组织映射网络。...
本教程将深入探讨Swift中的一个高级特性——嵌套函数,它是将函数定义在另一个函数内部的一种方法,有助于组织代码并提高代码的模块化。 嵌套函数的概念允许我们创建私有的辅助函数,这些函数仅在包含它们的外部...