【转】PHP 杂谈《重构-改善既来代码的宏图》之一 重新组织而的函数

原稿地址: PHP 杂谈《重构-改善既来代码的规划》之一
重新组织而的函数

思想导图

 

点击下图,可以拘留挺图。

图片 1

 

 介绍

 

我拿自身于欣赏的同于关心的地方写下去和豪门分享。上次自家形容了首《php
跟那个的对话》。还是出众多疑团,这书帮了自己许多之忙。

 

一经您比较忙,或者懒得看文字,建议乃一直看截图,也会见出非常酷之获的。你得通过比截图中的代码就能理解谁优谁劣了。

 

代码有自己为什么用图也?因为自身时常用手机看代码,博客园的代码在大哥大里混七八糟的,还是看图比较舒服。

 

 专业术语

 

咱总是因此英文字母编码,所以用部分英语单词,更能够亮出我们的专业性。以下的英文单词,你如掌握了,与其它coder交流的时会还直接,更标准。——臭显摆一下咔嚓,呵呵。

“*”表示文中经常提到的

 

inline:内联

function:函数

*method:方法

finely grained:细粒度的

rename:重命名

query:查询

temp:临时(temporary)——一般仰仗临时变量

*extract:提取——我个人还欣赏翻译成“提炼”

*duplicate:复制

split:剖解

variable:变量

factor:因素,因子

 

 重构原则

 

同、何谓重构?

    
名词形式:对软件内部结构的相同种植调动,目的是于未改动软件的可察行为前提下,提高该可理解型性,降低该修改成本。

  动词形式:使用相同文山会海重构准则,在不改变软件之而察行为前提下,调整其结构。

 

 二、为何还构 ?

  1、经常重构可以吃代码维持该部分形态。

  2、让代码找到合适的职。

  3、让软件还便于亮。

  4、可以找到bug。

  5、提高我们的编码速度。

图片 2

 三、重构的难题

  1、修改接口命名

    如果你的切近中之不二法门是public,那么你当rename的当儿,冒着死死之高风险,你无理解究竟有怎样模块于调用你的之法(我们经常的做法是以周项目下做grep操作,然后挨家挨户看各个模块的调用和逻辑)。——所以我们当编制类的早晚不管是性还是艺术尽量做到private,避免接口开放。

 

  2、何时休该重构

    (1)重写所有代码,而且现有代码实在太混乱,重构还免设重写。

    (2)项目即了的时刻,应该避免重构。我们好将重构放到二期去解决。 

 

 代码的坏味道

  一、Duplicate Code

  1、同一个近似,两单道包含相同表达式。

    解决措施:你可以Extract
Method提炼重复代码,然后于这半单方法还调用这个Extract Method。

       2、两独八九不离十,有一般之不二法门。

     解决方法:(1)把有限独八九不离十的法子提出来,共同组织一个父类。

             (2)把里面一个看似的法门去,调用另一个像样的章程。

 二、Long Method

  1、短函数:代码阅读费点力气,因为咱们亟须常常更换上下文去看看子程序召开了哟。但是给small
method容易掌握的真的关键在于一个吓的名字。读者可以经过名字了解函数的意向,根本未肯定去看其中写了头什么。——早期的编程语言中,调用方法要额外开销,这使得coder不甘于利用small
method。但是现代之OO语言几乎都全铲除了process内的额外开销(函数调用)。

 

  2、注释地方提炼信号:每当觉得要以注释来说明点啊的当儿,我们便管用征的事物写上一个独函数中,并坐那个用途命名。可以本着同样组或者甚至短短一行代码做这档子事。——只要函数名称能够解释其用户,我们吧该毫不犹豫地那开。

 

“函数”理解为”做什么“或”如何做“

 

  3、条件式和巡回时为是提炼信号。

 

  4、《代码整洁的志》的一个例子。我们得考虑!

图片 3

 

三、Large Class

 

  1、Class内数单属性变量有一样前缀或者字尾,可使用Extract Class。

 

  2、Class内毫不大多数变量使用性质变量,可使用Extract Class。

  

  3、有最多代码,可Extract Class。

 

四、Long Parameter

  做成Introduce Parameter
Object。——这个自家非绝支持,因为我当使他人方法的时段,我杀少去看代码实践,更毫不说错过押里面都为此到了对象的那些属性或者措施,取自思念只要的数额了。

 

五、Switch Statements

  1、少用switch语句。——问题在duplication。添加新case的上,你必找到有case并修改其。

  

  2、用几近态来替换其。做法:1.以switch进行Extract
Method;2.MoveMethod把case里之执行代码放到多态性的class里。

 

六、 Comments

  试试用Extract Method,如果还充分,那若试试Rename Method。

 

当您发用写作注释,请先尝试重构,试着给抱有注释变得剩下。

 

  注释一般用来未来底打算,还得用于你并凭十足把握的区域(为什么开某事)。

 

 重新组织而的函数

 

  Long
Method往往蕴藏太多信息,这些信而被复杂的逻辑掩盖,不易辨别。

 

一、Extract Method

状况:我看见一个过长之函数或者用一致段注释才能够给丁懂得用途的代码,那么以马上段代码放上一个单身函数中,并于函数名称解释改函数的用处。

图片 4

图片 5

图片 6

 

动机:

简易而产生出色命名的函数:——finely grained

  1、复用机会充分。

  2、函数读起来像读一系列comments。

  3、函数覆写容易。

最主要:函数长度关键在于函数名称以及函数本体之间的语义距离。如果提炼动作好强化代码的清晰度,那么就错过举行。

作法:

  1、创建新函数,根据函数的用意命名——以她“做什么”命名,而休是盖其“怎样做”命名。

    =》 即使Extract Function
非常简单,例如只是消息还是函数调用,只要新Function能够为重好措施发布代码意图,你也当提炼其。但万一你想不生更有意义的名,就别动它。

  2、将Extract的代码从Source Function 中Move到New Function中。

二、Inline Method

  Method Body与Method Name一样清晰易懂的下,请Inline Method。

图片 7

图片 8

图片 9

 

三、Inline Temp

一个现变量,只给一个简短表达式赋值一不善,而且赋值完呢就使了一样糟糕。——请Inline
Temp

图片 10

图片 11

图片 12

 

四、Replace Temp with Query

假使一个Temp变量,保存一个表达式,将这表达式Extract
Method。——这即是所谓的查询式,query

图片 13

图片 14

图片 15

 

动机:

  1、局部变量会要代码难以提炼。

  2、临时变量会驱使而勾勒有又丰富的代码。如果转成为query
method,那么class下之method,都得取得及时卖信息。——将编制出双重清的代码。

  3、Replace Temp with Query往往是公利用Extract
Method之前必不可少的步骤。

作法:

  1、找来单纯叫赋值一不善的现变量。

    =>  如果临时变量赋值超过同样涂鸦,考虑动用Split Temporary
Variable将其划分成多独变量。

  2、对Temp Variable赋值的右边有,Extract到一个独门函数中。

          
=>  将Method声明也private,日后使来外class用的时节再次放开它(public或protected)。

  

比方代码组织好,那么您往往能窥见还使得的优化方案。————如果性能真的好不好,那么放归啊大容易。

 

五、Introduce Explaining Variable

 

拿复杂表达式中(或中有些)的结果放上一个即变量,以此变量名称来分解表达式用途。

 

图片 16

图片 17

图片 18

 

动机:

  表达式复杂而难以阅读。在这种气象下,临时变量可以拉你将表达式分解为比易于管理的样式。

  

 六、Split Temporator Variable

 

 某独临时变量被赋值超过同样赖,它既不是循环变量,也不是聚众变量。那么对每次赋值,创造一个独门的,对应之即变量。

图片 19

 图片 20

图片 21

 

动机:

  1、如果临时变量承担多独义务,它就是应为轮换为多单临时变量。每个变量只承担一个权责。

  2、同一个现变量承担两码不同的事务,会令review变得乱七八糟。

六、Remove Assignments To Parameters

苟您的代码对参数进行赋值,那么盖一个即变量取代该参数的职位

 

图片 22

图片 23

图片 24

 

七、Replace Method with Method Object

巨型函数对有的变量的利用无法用Extract
Method。那么用以此Method放上一个独门对象吃,如此一来,让部分变量成为目标的filed,然后于和一个靶中将大型函数分解为数只袖珍Method。

 

图片 25

 图片 26

图片 27

动机:

  1、将相对独立的代码从大型Method中Extract出来,就得大大提高代码的可读性。

  2、一个Method中,局部变量泛滥成灾,分解这个函数将见面老不便。

  3、Replace Method with Method Object
会将具备有变量变成对象的值域。然后对这个新对象进行Extract Method了。

八、Substitute Algorithm

 

设您想管有算法替换为外一个复鲜明的算法,那么以Method
Body替换为任何一个算法
。——就是直修改原来的Method Body。

 

动机:随着对问题产生矣又多的刺探,你发觉一律码事足以起双重清晰的办法,就当以较清晰的点子代替复杂方法。

 

 总结

 

即只有是本书的平等有的内容,我知会时有发生不少的coder应该来例外的意见,我好吗是,有的死赞同,有的自我哉是不太支持的。所以要是“则该好的若由之,其破之如改变之”。

 

迎大家发表下自己之视角。

 

相关文章