• www.hg3088 | www.hg3088唯一指定网站

  • 发布时间:2016-01-19 10:01 | 作者:yc | 来源:互联网 | 浏览:1200 次
  • www.hg3088 | www.hg3088唯一指定网站要是一个类型会影响行动,则能够凭借多态,以子类替代类型码来处置惩罚篡改的行动

    重构——改良既有代码的筹划1重构概述1.1重构的观点(What)

    Refactoring

    名词:对软件内部布局的一种调剂,意图是在不篡改软件可查询造访行动的条件下,进步其可懂得性,下降修正成本

    动词:运用一系列重构法子,在不篡改软件可查询造访行动的条件下,调剂其布局

    1.2为何要重构(Why)

    改良软件筹划

    进步代码质量和可读性,使软件系统更易懂得和保护

    帮忙尽早的发明毛病

    进步编程速率

    1.3何时重构(When)

    何时重构:

    1)随时随地进行

    2)三次规律:首次做某件事尽管去做;第2次做相似的事会发生恶感,但无论若何仍是能够去做;第三次 再做相似的功课,就该当重构了

    3)增添功能

    4)修正bug

    5)复审代码,即Code Review时分

    何时不应重构:

    1)代码是在太混乱了,筹划彻底同伴

    2)要是项目已近终极刻日,该当防止重构

    3)重构还不如从头编码

    1.4重构流程

    1)读懂代码(包孕测验代码)

    2)进行重构

    3)运转统统的单元测验

    1.5重构与筹划

    重构与筹划是互补的,法度榜样该当先筹划,但在起头编码后,筹划上的短缺能够用重构来补偿筹划该当是适度的筹划,而不用过度筹划要是能很大略的颠末重构来习气需求的篡改,那么就不用过度的筹划,当需求篡改时再重构代码

    1.6重构关键

    1) 要是你发明自个需求为法度榜样增添一个功能,而代码的布局使你无法很便利地到达意图,那就先重构那个法度榜样,使功能的增添比较大略进行,然后再增添那个功能

    2) 重构前,先查看自个是不是有一个能够依托的测验机制这些测验有需要有自我考验的才能

    3) 重构技能等于以渺小的脚步修处死度榜样要是你犯下同伴,很大略便可发明它

    4) 任何一个傻瓜都能写出谋略性能够懂得的代码唯有写出让人能够大略懂得的代码才是真实优良的法度榜样员

    5) 事不过三,三则重构

    6) 不要过早宣布接口慎重建正你代码的各类标准,使重构更顺利

    7) 当你感想熏染需求编撰注释时,先测验重构,试着让注释显得残剩

    8) 包管统统测验都彻底自动化,让它们查看自个的测验成果

    9) 一套测验等于一个强壮的bug检测器,能够大年夜大年夜减缩查找bug所需求的时候

    10) 几回再三地进行测验每次编译请把测验也思虑进入——每天起码实行每个测验一次

    11) 每逢你收到bug述说,请先写一个单元测验来露出这这个bug

    12) 编写未臻完善的测验并实践运转,好过对完美测验的无尽期待

    13) 思虑大概犯错的界限前提,把测验火力会合在那儿

    14) 算功课被我们以为该当会犯错时,别忘了查看是不是抛出了预期的反常

    15) 不要由于测验无法捕获统统bug不就写测验,由于测验切实着实能够捕捉到到大年夜多半bug

    2代码的坏滋味

    1. Duplicated Code:重复代码

    指纷歧样确当地出现一样的法度榜样布局

    重构法子:Extract Method、Extract Class、Pull Up Method、Form Template Method

    2. Long Method:过长函数

    重构法子:Extract Method、WordStr Temp with Query、WordStr Method with Method Object、Decompose Conditional

    3. Large Class:过大年夜的类

    重构法子:Extract Class、Extract Subclass、Extract Interface、WordStr Data Value with Object

    4. Long Parameter List:过长参数列表

    重构法子:WordStr Parameter with Method、Introduce Parameter Object、Preserve Whole Object

    5. Divergent Change:发散式篡改

    一个类经常由于纷歧样的身分向纷歧样的偏向篡改实践上是违法了单一职责准则

    重构法子:Extract Class

    6. Shotgun Surgery:霰弹式修正

    一种篡改会致使好几个类的修正

    重构法子:Move Method、Move Field、Inline Class

    7. Feature Envy:眷恋情结

    类中的法子对另一个类的拜访逾越了对地点类的拜访

    重构法子:Move Method、Move Field、Extract Method

    8. Data Clumps:数据泥团

    指喜好经常成群出现的多个数据项,如两个类中一样的字段,或许许多法子中一样的参数署名

    重构法子:Extract Class、Introduce Parameter Object、Preserve Whole Object

    9. Primitive Obsession:根基?底细类型偏执

    热衷于运用int,long,String等根基?底细类型而不是有含义的小目标

    重构法子:WordStr Parameter with Method、Extract Class、Introduce Parameter Object、WordStr Array with Object、WordStr Type Code with Class、WordStr Type Code with Subclass、WordStr Type Code with State/Strategy

    10. Switch Statement:Switch句子

    一样的Switch句子散落在各处,需求增添一个case时需求修正多个当地

    重构法子:WordStr Conditional With Polymorphic、WordStr Type Code with Subclass、WordStr Type Code with State/Strategy、WordStr Parameter with Explicit Methods、Introduce Null Object

    11. Parallel Inheritance Hierarchies:平行一连系统

    要是一个类增添一个子类,另一个类也有需要响应的增添一个子类

    重构法子:Move Method、Move Field

    12. Lazy Class:冗余类

    无用的类

    重构法子:Inline Class、Collapse Hierarchy

    13. Speculative Generality:空言无补将来功能

    指无用的笼统类,无用的预留参数等当前没有用到的部件这个每每是过度筹划的成果

    重构法子:Collapse Hierarchy、Inline Class、Remove Parameter、Rename Method

    14. Temporary Field:令人疑惑的暂时字段

    指仅在特定情况下运用的实例变量,比方为了便利某个法子调用而在目标中增添的字段,该字段仅在这个法子中有用

    重构法子:Extract Class、Introduce Null Object

    15. Message Chains:过度耦合的音讯链

    指客户向一个目标讨取另一个目标,然后在向后者索求另一个目标,然后在索求另一个目标——客户与查找进程的缜密耦合

    重构法子:Hide Delegate

    16. Middle Man:中心人

    过度拜托,一个类中的大年夜多半法子都拜托给其余类

    重构法子:Remove Middle Man、Inline Method、WordStr Delegation with Inheritance

    17. Inappropriate Intimacy:狎昵联系

    两个类许多寻找相互的private有些

    重构法子:Move Method、Move Field、Change Bindirectional Association to Unidirectional、WordStr Inheritance with Delegation、Hide Delegate

    18. Alternative Classes with Different Interface:殊途同归的类

    类名纷歧样但功能相似

    重构法子:Rename Method、Move Method

    19. Incomplete Library Class:不完善的类库

    指现有的功能不能满意要求

    重构法子:Introducewww.88lifa.com Foreign Method、Introduce Local Extension

    20. Data Class:纯稚的数据类

    指只要公共成员变量,或只要字段和get/set法子的类

    重构法子:Move Method、Encapsulate Field、Encapsulate Collection

    21. Refused Bequest:被拒绝的遗赠

    指子类只运用了父类的有些法子

    重构法子:WordStr Inheritance with Delegation

    22. Comments:过多的注释

    过多的废料注释,或许代码太紊乱,有需要运用注释说明

    重构法子:Extract Method、Introduce Assertion

    3从头组织函数Extract Method:抽取法子

    将一段自力的代码抽取到一个新的法子,并以它“做什么”来命名

    无局部变量:直接抽取;

    局部变量在抽取的法子中只读:以参数通报;

    局部变量在抽取的法子中被赋值:

    要是变量只在抽取的代码中运用:将变量的声明也抽取到法子中

    抽取的代码以外也运用了这个变量:

    抽取的法子今后没有运用:在抽取的法子中直接修正

    抽取的法子今后有运用:回来值回来

    要是需求回来的代码逾越一个,则暂不抽取

    Inline Method:内联法子

    要是一个法子的完结很大略,而且完结自身和法子的名称一样普通易懂,则直接在法子的调用点用法子的完结替代法子调用要是法子被子类覆写,或许触及递归等紊乱的状况,则暂不重构

    Inline Temp:内联暂时变量

    要是一个暂时变量只被一个大略的表达式赋值,而且这个暂时变量阻碍了其余重构法子,则将对这个暂时变量的引证替换为这个赋值表达式运用该法子要包管赋值表达式没有副效果,而且包管变量后边没有被赋值(能够颠末将变量声明为final测验)

    WordStr Temp With Query:查询替代暂时变量

    要是一个暂时变量保存某一个(组)表达式的谋略成果,则将表达式提炼为一个法子,这个新法子也能够被其余法子调用

    Introduce Explaining Variable:引进解释性变量

    将紊乱表达式(或其间一有些的)成果保存到一个暂时变量,并以它的用场命名该暂时变量,进步可读性

    Split Temporary Variable:分解暂时变量

    要是一个暂时变量被赋值逾越一次,而且它不是轮回变量,也不用于汇集谋略成果,则关于每次赋值发现一个新的暂时变量,进步可读性,防止稠浊

    Remove Assignments to Parameters:移除对参数的赋值

    不要对法子通报进来的参数赋值,尤其是混用值通报和引证通报的时分,会下降代码了了度,该当建一个暂时变量,并将参数通报给它,要是切实着实需求修正通报进来的值,请运用回来值

    WordStr Method with Method Object:以法子目标替代法子

    要是代码运用了许多暂时变量,无法进行法子抽取,则这个法子变成一个新的类,那么法子的暂时变量就会变成新类的实例域,然后就能够在该类中将这个大年夜法子分解成多个小法子,而旧的法子调用者改成新建一个类目标,并调用响应的法子

    Substitute Algorithm:替换算法

    要是两个算法做从一样的功课,则保存了了的那个算法

    4在目标之间搬家特点Move Method:搬家法子

    要是一个类中某个法子跟另一个类的交互更多,则这个法子大概放错了当地,思虑搬家到那个类

    Move Field:搬家字段

    要是一个类中的某个字段更多的被另一个类运用,则这个字段大概放错了当地,思虑搬家到那个类

    Extract Class:抽取类

    某个类做了两个类该当做的功课,比方某些字段经常一同篡改,某些字段和某些法子总是一同出现,则思虑将它们获掏出来,构成一个新的类

    Inline Class:内联类

    要是一个类没有做太多的功课,则将思虑将其特点搬家到另一个类,并将其删去

    Hide Delegate:躲藏拜托

    要是一个类A经常需求颠末其拜托类B来调用另一个类C,则在拜托类B中树立拜托法子,类A颠末调用B的拜托法子拜访类C

    Remove Middle Man:移除中心人

    要是一个类做了太多大略的拜托操作,则删去这个类,让客户端直接调用受托类

    Introduce Foreign Method:引进外加函数

    当需求为类新加一个法子,但无法修正该类时,能够新建一个法子,并将该类的目标作为参数通报进入,在这个法子中完结新的功能

    Introduce Local Extension:引进本地拓展

    当需求为类新加一个法子,但无法修正该类时,能够让一个新类一连这个类,或许变成这个类的包装类,并在这个新类中完结新的功能

    5简化法子调用Rename Method:重命名法子

    要是法子名称未能准确标明法子的用场,则重命名法子

    Add Parameter:增添参数

    要是法子需求从调用端获得更多的信息,则增添参数

    Remove Parameter:删去参数

    要是法子不再需求某个参数,则删去它

    Separate Query From Modify:分袂查询和修正的法子

    要是一个法子中既查询了一个目标,也修正了一个目标,则树立两个法子,一个担负查询,一个担负修正

    Parameterize Method:让法子带着参数

    要是几个法子做了相似的操作,只是数据纷歧样,则将这几个法子吞并为一个法子,并用参数表达那些纷歧样的值

    WordStr Parameter with Explicit Method:用清晰的法子替换参数

    要是有一个法子,彻底依据纷歧样的参数值采纳了纷歧样的行动,则将这个法子拆分,为参数的每一个大概的值树立一个法子

    Preserve Whole Object:坚持目标齐全

    要是有个法子的参数悉数来自于一个目标,则改为运用这个目标作为参数

    WordStr Parameter with Method:已放到替代参数

    目标调用某个法子,并将其作为另一个法子的参数,要是另一个法子也能调用这个法子,则去掉落参数,直接让其调用这个法子

    Introduce Parameter Object:引进参数目标

    要是某些参数总是一同出现,则运用一个类目标来替代这些参数,能够减少参数数量

    Remove Setting Method:删去设值法子

    要是类中的某字段该当在创马上设置,尔后不再篡改,则删去set法子

    Hide Method:躲藏法子

    要是一个法子从来没有被其余法子运用,则改为private

    WordStr Constructor with Factory Method:运用工厂法子替代布局器

    要是创立目标不是只是做大略的目标构建,如依据纷歧样的参数进行纷歧样的构建,或许需求操控目标的实例个数,则运用工厂法子替代布局器

    Encapsulate Downcast:封装向下转型

    要是某个法子回来的目标需求调用者实行向下转型,则将转型动作移动到法子中

    WordStr Error Code with Exception:运用反常替代同伴码

    关于回来特定的值(如-1)注解同伴的法子,思虑改为抛出反常,调用者纷歧定会查看回来值

    WordStr Exception with Test:以测验替代反常

    关于一个能够预先查看的前提,不要抛出反常,而该当用if先对其进行查看

    6简化前提表达式Decompose Conditional:分解前提表达式

    要是有一个紊乱的if-then-else句子,则将if、then、else句子获取为独自的法子

    Consolidate Conditional Express:吞并前提表达式

    要是有一系列的前提实行一样的逻辑,则将这些前提提炼为一个回来Boolean的自力法子,然后在一个前提测验句子中调用这个法子

    Consolidate Duplicate Conditional Fragment:吞并重复的前提片段

    要是在前提表达式的每个分支上都有一段一样的代码,则将这段代码获取到前提表达式以外

    Remove Control Flag:移除操控符号

    在一系列Boolean表达式中,要是某个变量带有操控符号的效果,则移除这个变量,运用break或许return句子替代

    WordStr Nes骰宝游戏机ted Conditional with Guard Clause:以卫句子替代嵌套前提表达式

    前提表达式一样平常有两种表现要领,第一种要领是:统统分支都归于正常行动,第二种要领则是前提表达式提供的谜底中只要一种是正常行动,其余都是不正多见的状况要是两条分支都是正常行动,就该当运用if else要是某个分支极度罕见,就该当独自查看该前提,并在该前提为真时从函数回来,这么的查看等于传说中的“卫句子”

    WordStr Conditional with Polymorphic:以多态替代前提表达式

    要是表达式依据纷歧样目标类型遴选纷歧样的行动,则将这个表达式的每个分支放到一个子类内的覆写法子中,然后将初始的法子声明为笼统法子

    Introduce Null Object:引进Null目标

    需求频频查看某物是不是为null值,则思虑将null值替换为null目标(无效目标)

    Introduce Assertion:引进断语

    要是某一段代码需求对法度榜样状况做出某种假定,则以断语清晰表现这种假定

    7处置惩罚泛化联系Pull Up Field:字段上移

    要是子类有一样的字段,则搬家到父类

    Pull Up Method:法子上移

    要是子类有功能一样的法子,则搬家到父类

    Pull Up Constructor Body:布局法子体上移

    将子类布局法子体中一样的有些获取到父类的布局法子,子类运用super调用这个布局法子

    Push Down Field:字段下移

    将父类中只与有些子类有关的字段搬家到这些子类

    Push Down Method:法子下移

    将父类中只与有些子类有关的法子搬家到这些子类

    Extract Subclass:获取子类

    将类中只被某些实例用到的特点搬家到一个新的子类中

    Extract Superclass:提炼超类

    要是两个类有相似的特点,则新建一个类作为这两个类的父类,并将那些相似的特点移动到这个新建的父类

    Extract Interface:获取接口

    要是多少客户运用类接口中的同一子集,或许两个类有一样的有些,则将一样的子集获取到一个接口中

    Collapse Hierarchy:吞并一连系统

    要是子类和超类没有太大年夜的不一样,则吞并到一个一连层次中

    Form Template Method:形貌模板法子

    相似模板法子形式,要是子类中以一样的序次实行某些相似的法子,则将操作序次获取到一个法子,并放到父类,父类调用这些纷歧样的操作,子类颠末覆写这些法子完结差别

    www.hg3088 | www.hg3088唯一指定网站

    WordStr Inheritance with Delegation:以拜托替代一连

    等于运用组合替代一连要是子类只运用超类接口的一有些,或许根基?底细不需求一连而来的数据,则删去子类对父类的一连,而是在子类中新建一个超类目标

    WordStr Delegate with Inheritance:以一连替代拜托

    等于用一连替代组合要是经常需求为两个组合类编写极度大略的拜托法子,也等于说一个类的行动根基?底细上都拜托给了另一个类,则直接让这个类一连另一个类更简洁

    8从头组织数据Self Encapsulate Field:自封装字段

    为字段增添get/set法子,优点是能够增添校验,或许推迟初始化,而且子类颠末覆写法子篡转业动,但本类中,尤其是布局函数中是直接拜访字段,仍是运用get/set法子,是值得评论的

    WordStr Data Value with Object:以目标替代数据值

    要是一个数据有需要和其余数据和法子一同运用才有含义,则将该数据项改为类目标

    Change Value to Reference:将值改为目标引证Change Reference to Value:将引证目标改为值目标

    能够将目标分红两类:reference object(引证目标)和value object(值目标)值目标有一个异常紧张的特性:它们该当是弗成变的要在引证目标和值目标之间做遴选无意偶尔并不大略,要是期望给一个目标参加一些可修正数据,并包管对任何一个目标的修正都能影响到所引证此目标,则需求运用引证目标而在散播式和并发系统中,弗成变的值目标则更有用,由于无需思虑它们的同步疑问

    WordStr Array with Object:以目标替代数组

    要是一个数组的元素各自代表纷歧样的器械,则以目标替换数组,关于数组中的每个元素,以一个字段来注解

    Duplicate Observed data:仿制被监督数据

    指的是依据MVC形式重构,抽取原先被内嵌在用户界面中的事务逻辑处置惩罚,运用户界面和处置惩罚事务逻辑的代码分隔,然后运用查询造访者形式完结数据和用户界面的同步

    Change Unidirection Association to Bidirectional:将单向有关改为双向有关

    两个类都需求运用对方特点,但其间只要一条单向毗连增添一个反向指针,并使修正函数能够一路更新2条毗连

    Change Bidirectional Association to Unidirection:将双向有关改为单向有关

    两个类之间有双向有关,但其间一个类现在不再需求另一个类的特点,则去掉落不用要的有关

    WordStr Magic Number with Symbolic Constant:字面常量替代邪术数

    要是一个字面数值有非分特别含义,则创立一个常量,依据其含义命名,并将上述的字面数值替换为这个常量

    Encapsulate Field:封装字段

    将类中存在的public字段改为为private,而且提供响应的拜访函数

    Encapsulate Collection:封装召集

    要是一个法子回来一个召集,则让这个函数回来该召集的一个只读副本,并在这个类中提供增添/移除召集元素的函数

    WordStr Record with Data Class:以数据类替代纪录

    你需求面临传统编程情况中的纪录布局,比方一个留传法度榜样,或许是需求颠末一个传统API来与纪录布局沟通,或是处置惩罚从数据库读出的纪录,则为该纪录创立一个相似外部纪录的类,以便日后将某些字段和函数搬移到这个类中

    WordStr Type Code with Class:以类来替代类型码WordStr Type Code with Subclass:以子类来替代类型码WordStr Type Code with State/Strategy:以状况/计谋形式替代类型码

    要是类中有一个数值类型码,但它并不影响类的行动,则以一个新的类替换该数值类型码(感想熏染用罗列类也不错)但要是类型的值在目标的生命周期内会发生篡改,或许由于其余身分使得无法用子类,则能够运用状况形式和计谋形式来重构

    WordStr Subclass with Fields:以字段替代子类

    要是各个子类的仅有不一样只在“回来常量数据”的法子上,则在父类中新增一个字段,修正这些法子,使它们回来这个字段并删去子类,这个新增字段能够在目标布局时赋值

    9大年夜型重构Tease Apart Inheritance:收拾并分解一连系统

    要是某个一连系统一路承当了两项职责,则树立两个一连系统,并颠末拜托联系让一个能够调用另一个

    Convert Procedural Design to Objects:将进程化筹划转化为目标筹划

    将数据纪录转化为目标,将大年夜块的行动分解为小块,并移到有关的目标中

    Separate Domain from Presentation:分袂范畴和展现

    实践指依照MVC形式重构法度榜样

    Extract Hierarchy:获取一连层次

    要是某个类做了许多的功课,而且一有些功课因此许多的前提表达式完结的,则树立一连系统,以一个子类注解一种特殊状况

    这篇文章出自 “不积跬步,无乃至千里” 博客,谢绝转发!

  • 相关内容

友情链接: