zoukankan      html  css  js  c++  java
  • 『重构--改善既有代码的设计』读书笔记----代码坏味道【5】

        今天是坏味道【5】了,其实也是坏味道的最后一篇了,不知道各位同学看的有没有收获,总之,希望坏味道系列可以给重构系列给予一些帮助,在让我自己复习总结的同时希望也可以帮助到你:)

        【18】Alternative Classes with Different Interfaces(异曲同工的类)

        如果你发现两个类几乎有些函数都完成同样的事情,但他们的接口不同,那么你需要使用Rename Method将这些接口统一到一个名字,然后通过Move Method将某些行为移动到适合的类当中去,重构之后你会发现他们似乎更适合成为兄弟类,以方便你把这个共同函数推到父类当中去,这个时候你可以运用Extract Superclass来进行提炼父类。

        【19】Incomplete Library Class(不完美的库类)

        面向对象的终极目的就是复用。我们目前许多编程技术都建立在库的基础之上。但是对于库来说,没有百分之百是完美的,如果你想修改库类的一两个函数,你可以运用Introduce Foreign Method来添加,如果你要添加一大堆额外行为,你可以尝试使用Introduce Local Extension。

        【20】Data Class(纯稚的数据类)

        很多时候我们会声明一些纯数据类,他们拥有字段之外就是一些常规的读写访问函数。这种类只是一种不会说话的数据容器,肯定被其他类过分细碎的操纵着。在面向对象世界中尤其强调封装性,如果初期你发现你写的一些数据类提供了public的成员字段给别的类使用,那么你应该尽早对他们进行Encapsulate Field进行封装,以保障以后如果这些数据类的内部发生变化,你的客户端代码需要改变的问题。如果数据类内有容器成员字段,你也应该检查他们是不是已经被合理的封装,如果没有你也应该使用Encapsulate Collection把他们封装起来。对于那些你不希望被其他类修改的成员字段,你需要运用Remove Setting Method来将这些设值函数删除。

        之后你需要做的就是找到这些取值函数和设值函数被调用的地点,你查看调用点对于这个数据类的具体行为,考虑这个行为是不是应该由数据类提供,然后运用Move Method把行为搬移到数据类中去。如果无法搬移整个函数,你就需要运用Extract Method提取一个可以变搬移的函数,之后运用Hide Method把这些取值和设值函数隐藏起来。如果你想让Data Class能够跟其他对象一样参与整个系统的工作,你必须赋予他们行为,让他们拥有自己的责任。

        【21】Refused Bequest(被拒绝的遗赠)

        如果你新写出来的子类他的愿望并不是继承基类的所有函数和数据,只想从中挑几个出来。或者它压根就没必要或不想去继承。这个时候就意味着我们设计的继承体系存在错误。解决办法也是有的,你既然这个子类不需要基类的大部分东西,但你又不想破坏这层继承体系。那么你就索性给这个子类建立一个兄弟类,然后不断利用Push Down Method和Push Down Field把所有用不到的函数和数据下推给那个兄弟。这样你这个父类就变得很纯粹,他只持有所有子类所共享的东西。当然传统说法也说过:所有超类都应该是抽象的。当然这个传统说法,我和作者一样,并不赞成。不建议你这么做,最起码不建议你每次都要这么做。虽然我们为了解决一些工作上的问题,一直在利用继承,我也承认这确实有点坏味道。但这个气味却不是很强烈,除非它让你引起了困惑和问题。你可以遵循传统的做法,否则,你可以不去理解这种味道。

        当然了,如果子类继承了父类的实现,但他不想去继承父类的接口,这个味道就变得很强烈。拒绝继承超类的实现,这个很正常,可以利用多态来进行不同情况的处理。但如果拒绝继承超类的接口,这个时候你就得注意了。这个继承体系合不合理。如果你真的不愿意继承接口,那么你应该运用Replace Inheritance with Delegation来取代继承。

        【22】Comments(过多的注释)

        并不是说不允许注释。注释对于重构来说绝对是一种香味,因为往往有注释的地方就代表了实现和语义存在一定的距离。这也在提醒我们这段代码存在某些坏味道,我们可以运用重构来消除他们,让这个注释变得多余。

        如果你需要注释来说明一段代码做了什么,你可以运用Extract Method来提取。如果函数已经被提炼出来了,你仍然需要注释来解释他的行为,你可以利用Rename Method来改变接口来解释行为,如果你需要注释来说明系统的某些规格,你可以试试Introduce Assertion。总之,你要记住当你感觉你需要撰写注释的时候,请先尝试重构,试着让所有注释都变得多余

        当然注释也有良好运用的地方,可以用来记录你将来打算做什么,或者标注你没有把握的地方,或者写下为什么做这件事情的原因,来提醒将来的修改者让他们更好的理解你的代码。

        结语: 『坏味道』系列出完了,不知道你看的还过瘾不?总之我总结的很爽!结合文章加上自己的理解,让我对重构有了更加深的理解和印象,留下你的脚印或者给我留言交流重构,如果这些文章能够给你带来帮助,那我也算"一箭双雕了":)

  • 相关阅读:
    使用union all 遇到的问题(俩条sql语句行数的和 不等于union all 后的 行数的和 !);遗留问题 怎么找到 相差的呐俩条数据 ?
    78W的数据使用forall 进行批量转移;
    oracle 不能是用变量来作为列名和表名 ,但使用动态sql可以;
    oracle 查询优化及sql改写
    (十三)Jmeter之Bean Shell 的使用(二)
    (十二)Jmeter之Bean Shell的使用(一)
    (十一)Jmeter另一种调试工具 HTTP Mirror Server
    Image Processing and Computer Vision_Review:A survey of recent advances in visual feature detection(Author's Accepted Manuscript)——2014.08
    Image Processing and Computer Vision_Review:Local Invariant Feature Detectors: A Survey——2007.11
    Image Processing and Computer Vision_Review:A survey of recent advances in visual feature detection—2014.08
  • 原文地址:https://www.cnblogs.com/rickyk/p/4137437.html
Copyright © 2011-2022 走看看