`

重新组织函数

 
阅读更多

重新组织函数

大多数问题都源于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 中,索引的碎片可能会对查询性能产生影响,因此需要对索引进行维护。SQL Server 2005 提供了重新组织和重新生成索引的功能,以修复索引碎片。 重新组织索引 ...

    组织机构代码校验函数

    提供组件机构代码校验函数,可以由外部函数直接调用,返回true或false

    单位组织机构代码校验函数(oracle)

    ### 单位组织机构代码校验函数(Oracle) #### 概述 本文将详细介绍一个用于验证单位组织机构代码有效性的Oracle标量函数。该函数在实际的商业环境中得到了广泛的应用与检验,确保了数据处理过程中的准确性与一致...

    C语言函数的定义、声明以及函数的调用方法_c语言函数学习实例_

    在C语言中,函数是程序的...函数帮助我们将代码组织成可重用的部分,参数传递允许我们在函数之间交换数据,而数组作为参数则允许我们处理集合数据。通过熟练掌握这些概念,你可以编写出更加复杂且富有逻辑的C语言程序。

    C语言函数大全 函数例题

    在C语言中,函数是代码组织的基本单元,它是一段可重复使用的代码块,执行特定的任务。本资源“C语言函数大全”包含了丰富的函数例题,旨在帮助学习者深入理解和熟练掌握C语言中的函数用法。下面我们将详细讨论C语言...

    装函数和驱动函数

    通常,驱动函数并不包含复杂的逻辑,而是相对简单地组织测试流程。 桩函数和驱动函数在单元测试中的应用,对于简化测试过程、提高测试效率和准确性有着不可替代的作用。桩函数的使用降低了测试对环境的依赖性,同时...

    35个标准测试函数.rar_matlab标准测试_matlab测试函数_标准测试函数_测试函数 matlab_算法函数测试

    在MATLAB中,可以将测试函数组织到测试类中,或者作为单独的脚本运行。例如,要运行一个特定的测试函数,你可以直接调用它的名称,如`run('test_foo')`。如果想运行整个测试集合,可以使用`runall`命令。 此外,...

    MySQL关于自定义函数以及常用函数的组织点的总结

    MySQL关于自定义函数以及常用函数的组织点的总结(例如日期函数)

    C++ 线程函数是类的成员函数

    在C++编程中,线程(Thread)是并发执行的代码段,允许程序...这允许线程直接访问和操作类的私有数据,同时提供了更好的封装性和代码组织。但也要注意线程安全、资源管理和异常处理等问题,确保程序的正确性和高效性。

    javascript实现根据函数名称字符串动态执行函数的方法示例

    这种方式为函数调用提供了更灵活的组织结构。示例代码如下: ```javascript var myFunctions = { targetFunction: function() { alert(11111); return 9; } }; test("targetFunction", myFunctions); function ...

    C语言函数速查 C语言函数大全 C函数

    在C语言中,函数是组织代码的基本单元,允许我们复用代码并执行特定任务。本篇将深入探讨C语言函数的相关知识点,帮助你更好地理解和运用这些功能。 1. 函数定义与声明: 在C语言中,函数由`return_type function_...

    c/c++函数大全(标准函数)

    在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 ...

    matlab_函数嵌套

    这种特性使得代码组织更加清晰,尤其在处理复杂计算问题时,能够更好地封装和复用代码。以下是对给定标题和描述中所述知识点的详细说明: 1. **主函数与嵌套函数的调用关系** 主函数 `funmin` 在这里负责调用另一...

    C函数查寻 C函数 C语言 函数查寻工具

    首先,C语言中的函数是代码组织的基本单元,它封装了特定的功能,可以被其他部分的代码调用。理解函数的工作原理,包括参数传递、返回值、局部和全局变量等,是成为熟练C程序员的基础。在编程过程中,经常需要查阅...

    C# .NET 自定义函数 内置函数.zip

    在C# .NET编程环境中,函数是代码组织和重用的核心元素。函数允许我们将复杂的任务分解为可管理和独立的部分,从而提高代码的可读性和可维护性。本压缩包文件"自定义函数"包含了关于C# .NET中内置函数和自定义函数的...

    matlab神经网络函数

    - **learnsom**:自组织映射权学习函数,用于调整自组织映射网络的权重。 - **learnh**:Hebb学习规则,基于Hebbian理论。 - **learnhd**:退化的Hebb学习规则。 - **learnis**:内星学习规则,用于自组织映射网络。...

    Swift教程:函数篇 嵌套函数

    本教程将深入探讨Swift中的一个高级特性——嵌套函数,它是将函数定义在另一个函数内部的一种方法,有助于组织代码并提高代码的模块化。 嵌套函数的概念允许我们创建私有的辅助函数,这些函数仅在包含它们的外部...

Global site tag (gtag.js) - Google Analytics