php重构:改进现有代码功能的设计到您的组织
你可以通过点击map.introduce看大图片我写下我最喜欢和最关心的地方与大家分享。上次我写了一个PHP和老人之间的对话。还有很多问题,这本书帮了我很多。
如果你很忙,或者懒得读课文,建议你直接看截图,而且会有很多收获。你可以通过比较截图中的代码知道哪个更好。
为什么我要在代码部分使用地图呢因为我经常用手机看代码,博客花园的代码在手机里乱七八糟,看图片更舒服。
技术术语
毕竟,我们用英语字母表,所以用一些英语单词,我们可以更显我们的专业。以下的英语单词,如果你已经掌握了,将更直接和更专业的沟通时,与其他编码器。
*这在文章中经常提到。
内联:内联
功能:功能
*方法:方法
细粒度的:细粒度的
重命名:重命名
查询:查询
临时(临时)-一般指临时变量。
*提取:提取-我个人更喜欢翻译成精炼
*复制:复制
分:分析
变量:变量
因素:因素、因素
重构原理
重新配置是什么
名词形式:一种对软件内部结构的调整,旨在提高软件的可理解性,降低软件的修改成本,而不改变软件的可观察行为。
动词形式:使用一系列重构规则来调整结构,而不改变软件的检查行为。
二、为什么要重构
1。常规重构允许代码维护表单。
2,让代码找到正确的位置。
3,让软件更容易理解。
4,你可以找到bug。
5,提高编码速度。
三,重建问题
1。修改接口的名称
如果你的类是公共的,那么你在重命名,冒着巨大的风险,你不知道你在这个方法调用模块(我们通常的做法是在整个项目中运行,然后看每个模块和呼叫逻辑)。所以当我们写的类,我们尝试做私人尽可能多的,无论是属性或方法,避免接口开放。
2。何时不应重建
(1)重写所有代码,现有代码太混乱,无法重写。
(2)当项目接近结束时,应该避免重构,我们可以在两个阶段进行重构来解决它。
代码的糟糕味道
1。重复代码
1,同一类,两种方法包含相同的表达式。
解决方案:您可以提取方法来复制重复的代码,并让这两种方法调用提取方法。
2,两个班,有类似的方法。
解决方案:(1)提出了两类方法,构造了一个父类。
(2)删除一个类并调用另一个类的方法。
二,Long Method
1、短功能:代码阅读有点难,因为我们要不断变化的背景下看子程序完成。但真正关键的制作小方法易于理解,一个好名字的谎言,读者可以了解到名称的功能,而不必看到写在这是什么。在早期的编程语言,调用方法需要额外的开销,这使得程序员不愿意使用小方法。但是现代的面向对象的语言几乎完全消除过程中的额外开销(函数调用)。
2,注释提取信号的地方:每当我们觉得需要注释时,我们就把需要解释的东西写成一个独立的函数,并把它命名为目的,你可以在一组或一行代码中这样做,只要函数的名称可以解释它的用户,我们就应该毫不犹豫地去做。
函数被理解为该做什么或怎么做。
3、条件和周期往往也精确的信号。
4。整洁的代码的一个例子。我们可以想想!
三,大班
在1中,类中的属性变量的数量具有相同的前缀或后缀,可以使用提取类。
2,在类中,并不是大多数变量都使用属性变量,而提取类则可以使用。
U3000 U3000
三.代码太多,提取类。
四,Long Parameter
引入参数对象,我不太同意。因为当我使用其他人的方法时,我很少看到代码实践,更不用说查看对象中使用的属性或方法,得到我想要的数据。
五、开关语句
1,较少使用切换语句。问题是重复。当您添加一个新的情况时,您必须找到所有的情况并修改它们。
U3000 U3000
2。用多态替换它。实践:1。方法2.movemethod开关提取物;把实践案例为多态类中的代码。
六、评论
尝试提取方法,如果没有,则尝试重命名方法。
当您觉得需要编写注释时,首先尝试重构,并尝试使所有注释都变得多余。
注释通常用于将来的计划,也可以用于不完全了解的地方(为什么做某事)。
整理你的功能
长法往往包含太多的信息,晦涩难懂。
1。提取方法
状态:我看到了一个很长的函数,或者需要一个注释让人们理解代码的使用,然后把代码变成一个独立的函数,并让函数名解释如何修改函数。
动机:
一个简短且命名良好的函数:细粒度
1,重用的机会很大。
2,函数像一系列注释一样读取。
三.很容易重写函数。
关键:函数长度的关键在于函数名与函数本体之间的语义距离,如果细化操作可以增强代码的清晰度,那么就可以做到这一点。
实践:
1,创建一个新函数,根据函数的意图命名它——如何处理它,而不是如何命名它。
即使提取函数非常简单,例如,只是消息或函数调用,只要新函数能够更好地显示代码意图,您也应该提取它,但是如果您想不出一个更有意义的名称,就不要移动它。
2,提取的代码是从源函数移动到新函数。
二、内联方法
当方法体与方法名一样清晰易懂时,请使用内联方法。
三,Inline Temp
一个临时变量只通过一个简单表达式赋值一次,赋值只使用一次。
四,用查询替换临时表
如果是临时变量,则保存表达式和表达式提取方法。
动机:
1,局部变量会使代码难以提取。
2,临时变量将驱使你编写更长的代码。如果你把它改成查询方法,那么类下的方法就可以得到这个信息。
3,在使用提取方法之前,用查询替换温度通常是一个必不可少的步骤。
实践:
1。找到只分配一次的临时变量。
如果临时变量超过一次,考虑使用分裂的临时变量将它分解成多个变量。
2。临时变量赋值的右边部分,提取到一个独立函数。
>方法被声明为私有,如果在使用后有其他类天,并释放它(公共或受保护)。
U3000 U3000
如果代码组织得很好,通常可以找到更有效的优化。
五,引入解释变量。
一个复杂表达式(或其中一部分)的结果被放置在一个临时变量中,该变量用变量的名称解释表达式的用法。
动机:
这个表达式很复杂,很难读。在这种情况下,临时变量可以帮助你将表达式分解成更易于管理的形式。
U3000 U3000
六、分temporator变量
一个临时变量被赋值不止一次,它既不是循环变量,也不是集合变量,所以对于每个赋值,创建一个独立的、相应的临时变量。
动机:
1。如果一个临时变量承担多个职责,它应该被一些临时变量所代替。每个变量只承担一个责任。
2,相同的临时变量需要两个不同的东西,这使评审混乱。
六,将赋值移到参数
如果代码将参数分配给参数,则临时变量将由参数的位置替换。
七,用方法对象替换方法
对局部变量使用大函数不能采用抽取法,然后将该方法放入单个对象中,使局部变量成为对象的域,然后将大函数分解为同一对象上的几个小方法。
动机:
1,相对独立的代码从大的方法中提取,可以大大提高代码的可读性。
2,在一个方法中,局部变量被淹没,并且很难分解这个函数。
3,用方法对象替换方法将所有局部变量转换为对象的范围,然后提取新对象。
八,替代算法
如果你想用另一种更清晰的算法替换一种算法,那么用另一种算法代替方法体。
动机:当你对这个问题了解更多的时候,你会发现一件事情可以用更清楚的方式来代替复杂的方法。
总结
这只是这本书的一部分。我知道关于编码器有很多不同的看法。我同意我自己的观点。其他人也同意我的观点。因此,它的优点是:穷人,而不是穷人。
欢迎发表意见。