`
C_J
  • 浏览: 128389 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

《重构》读书笔记

阅读更多

Martin Fowler于2003年出版的,有些观点有些陈旧了,可取其精华,去其糟粕。

前言:
    作者介绍了重构的基本概念,以及回答了what when who的问题。

可能需要重构的方面:
    1、Duplicate Code(重复代码)
    2、Long Method(长函数)
    3、Large Class(大类)
    4、Long ParameterList(过长参数)
    5、Divergent Change(函数太集中)、Shotgun Surgey(函数太发散):更改某个需求,不要更改太多的地方。我觉得这个有点难以掌握,得根据经验来做了。
    6、Feature Envy(一个类用到了太多另个类的函数)
    7、Data Clumps(数据泥团)
    8、Primitive Obsession(基本类型偏执狂):喜欢用大堆基本类型来表达,推荐尝试用小型类
    9、Switch Statements(Switch语句):switch语句导致重复和复杂,运用多态替换switch
    10、Refused Bequest(被拒绝的馈赠):superClass尽量最小话,也就是说subClass共享superClass所有的资源,可额外制造自己的工具类。
    11、Data Class(纯粹的数据类):可能作者当时的年代没有POJO这一说法,所以作者认为一个没有“行为”的数据类是不对的,其实这点不是确定的,各有所长,也是目前争议的地方。
    12、Temporary Field(令人迷惑的临时变量):尽量让临时变量变得可读。


构筑测试体系:
    作者推荐在编码阶段就开始构造单元测试,可为每个类写main方法来测试,这个我目前觉得还点苛刻了。

重构的方法:
    1、分解大函数,把大函数里面的部分操作分解成独立的小函数。有利于复用和可读。
    2、合并小函数。这都是很博弈的过程了,视情形而行。
    3、关于临时变量,作者推荐一个临时变量只被赋值一次,这个我觉得有点苛刻。
    3、将复杂表达式的结果放入临时变量。
    4、将临时变量转为成员变量从而分解大函数。这个我也不赞成,我觉得还是“最近原则”较好,成员变量会暂用内存,且很容易使类混乱,特别是有继承关系的时候,或者尽量保持成员变量声明为private。
    5、移动函数。如果Class1中某个函数与Class2有太多的合作而形成高耦合,就需要搬动这个函数了。
    6、移动成员变量。 如果Class1中某个值域被Class2过多的应用,就需要考虑搬动这个值域了。
    7、提炼类:一个class应该是一个清楚的抽象,具有明确的责任。对于过大的类需要进行分解。
    8、Inline Class:与方法7相反,是合并一些类。
    9、增加中间层来取代类与类的关系。典型的委托模式,对外永远为一个代理接口,客户不用关心内部关系是如何变化的。
    10、Remove Middle Man:删除过多的简单中间层。可以看到,很难定义什么程度的隐藏才是最合适的,项目不同时期,这个度也是不断变化的,这个就得靠自己把握了。
    11、直接使用值域或间接使用值域。所谓直接使用就是在类中直接使用成员变量,间接使用是使用成员变量的取值/赋值方法,即getXX()/setXX()方法,作者推荐这个最好根据团队习惯来定。

    12、当行为过于庞大后,就需要分离数据成为无行为的类。POJO就是典型。

    13、使用工厂或不使用工厂。这个又是个博弈的过程,使用工厂的好处是对象可以复用,坏处是需要考虑同步问题,提高复杂度。

    14、以对象替代数组。

    15、尽量隐藏类中数据结构的细节。对外只提供操作的方法。

    16、Replace record with data class/Replace type code wiht class

    17、以值域取代子类。

    18、引入NULL对象。把无效值变为无效类。
    19、使用断言?
    20、更改函数名。我觉得最有效的重构方式。
    21、查询函数和修改函数分离。类似setXXX和getXXX。
    22、移除setXXX或使用final。变量只在初始化时赋值。
    23、隐藏函数。封装即隐藏,对外只提供接口,对内封装细节。

    24、Pull Up Field/Method,把subClass中的重复代码提升到superClass。

    25、Pull down Field/Method。

    26、以委托取代继承。某个subClass只使用接口中的一部分,或是根本不需要使用父类的数据。

 

 

现实问题:

    1、程序员不知道重构。

    2、你很快已经不在职位上了。

    3、重构是额外工作,老板付钱给你是为了编写新功能。

    4、重构可能破坏现有程序。

 

 

 

 

 


重构就是一个博弈的过程,一个寻找平衡点的过程,空间和时间的平衡点,清晰和工作量的平衡点,共性和个性的平衡点...如果没有看到实际的情况,谁也无法知道具体该怎么做,但务必保持“简约而不简单的”优良作风。

 

 

 

分享到:
评论
9 楼 抛出异常的爱 2010-05-12  
guanliScott 写道
Joo 写道
sunway00 写道
C_J 写道

    作者推荐在编码阶段就开始构造单元测试,可为每个类写main方法来测试,这个我目前觉得还点苛刻了。

作者推荐的应该不是每个类写main方法,而是用Junit之类进行单元测试。在编码阶段构造单元测试说不上苛刻吧,要是按照敏捷的要求应该是TDD,写代码前先写测试呢。


即便是这样也是苛刻
第一,没有必要为每一个类作单元测试,否则何来的覆盖率之说
第二,为重点关注类写单元测试在现在大多数公司和企业也是不太现实,愿望很美好...



test coverage是重构的保证,保证不了正确性,重构就没有意义。
我的经验是DAO 100%,
BO的line coverage 100%
        branch coverage >50%

brach coverage >70%==基本
brach coverage >80%==良(大多数项目)
brach coverage >85%==优
8 楼 guanliScott 2010-05-11  
Joo 写道
sunway00 写道
C_J 写道

    作者推荐在编码阶段就开始构造单元测试,可为每个类写main方法来测试,这个我目前觉得还点苛刻了。

作者推荐的应该不是每个类写main方法,而是用Junit之类进行单元测试。在编码阶段构造单元测试说不上苛刻吧,要是按照敏捷的要求应该是TDD,写代码前先写测试呢。


即便是这样也是苛刻
第一,没有必要为每一个类作单元测试,否则何来的覆盖率之说
第二,为重点关注类写单元测试在现在大多数公司和企业也是不太现实,愿望很美好...



test coverage是重构的保证,保证不了正确性,重构就没有意义。
我的经验是DAO 100%,
BO的line coverage 100%
        branch coverage >50%
7 楼 liwenjie 2010-05-10  
lz说重构“过时”那么,哪些方面过时了呢?请赐教
6 楼 抛出异常的爱 2010-05-10  
hatedance 写道
感觉上面的同学开始离题了,讨论tdd了的必要性了。
老马说的tdd是重构的保障,离开单元测试进行重构总是很不放心万一又引入了什么新bug。
重构这东西感觉就是写给coder的。
目标就是尽量让每一个类的体型都是大小正好,近似标准体型,比如:
每个函数有N行左右的代码,多了就拆,少了就合并;
每个类有N左右个方法,N个左右的属性,每个包有N个类,。。。。

这里的N一般取值很小,不大于10.

N -> 7 土 2
5 楼 hatedance 2010-05-10  
感觉上面的同学开始离题了,讨论tdd了的必要性了。
老马说的tdd是重构的保障,离开单元测试进行重构总是很不放心万一又引入了什么新bug。
重构这东西感觉就是写给coder的。
目标就是尽量让每一个类的体型都是大小正好,近似标准体型,比如:
每个函数有N行左右的代码,多了就拆,少了就合并;
每个类有N左右个方法,N个左右的属性,每个包有N个类,。。。。

这里的N一般取值很小,不大于10.
4 楼 抛出异常的爱 2010-05-10  
Joo 写道
sunway00 写道
C_J 写道

    作者推荐在编码阶段就开始构造单元测试,可为每个类写main方法来测试,这个我目前觉得还点苛刻了。

作者推荐的应该不是每个类写main方法,而是用Junit之类进行单元测试。在编码阶段构造单元测试说不上苛刻吧,要是按照敏捷的要求应该是TDD,写代码前先写测试呢。


即便是这样也是苛刻
第一,没有必要为每一个类作单元测试,否则何来的覆盖率之说
第二,为重点关注类写单元测试在现在大多数公司和企业也是不太现实,愿望很美好...

70%的分支还是基本能达的到的。
3 楼 Joo 2010-05-10  
sunway00 写道
C_J 写道

    作者推荐在编码阶段就开始构造单元测试,可为每个类写main方法来测试,这个我目前觉得还点苛刻了。

作者推荐的应该不是每个类写main方法,而是用Junit之类进行单元测试。在编码阶段构造单元测试说不上苛刻吧,要是按照敏捷的要求应该是TDD,写代码前先写测试呢。


即便是这样也是苛刻
第一,没有必要为每一个类作单元测试,否则何来的覆盖率之说
第二,为重点关注类写单元测试在现在大多数公司和企业也是不太现实,愿望很美好...
2 楼 20055294 2010-05-10  
楼上是正解,就是 所谓的测试驱动开发
1 楼 sunway00 2010-05-10  
C_J 写道

    作者推荐在编码阶段就开始构造单元测试,可为每个类写main方法来测试,这个我目前觉得还点苛刻了。

作者推荐的应该不是每个类写main方法,而是用Junit之类进行单元测试。在编码阶段构造单元测试说不上苛刻吧,要是按照敏捷的要求应该是TDD,写代码前先写测试呢。

相关推荐

    [免费高清PDF]31天重构系列笔记.rar

    同时,read.txt文件可能包含作者的前言或阅读指南,提供了学习此笔记的建议和注意事项。 总的来说,《31天重构系列笔记》是C#开发者提升代码质量和效率的宝贵资源。通过系统的练习和学习,开发者可以提升自己的重构...

    《重构商业:产业互联网时代的商业模式重构》读书笔记模板.pptx

    《重构商业:产业互联网时代的商业模式重构》读书笔记模板.pptx

    重构笔记

    《重构笔记》主要探讨的是软件开发过程中的一个重要实践——重构,它是提高代码质量、可维护性和...通过深入阅读这份文档,开发者可以学习如何在实践中提升自己的重构能力,从而打造出更加优雅、易于维护的软件系统。

    《从跟随到领先:H为管理体系重构之路》读书笔记.pdf

    《从跟随到领先:H为管理体系重构之路》读书笔记.pdf

    《从跟随到领先:H为管理体系重构之路》读书笔记.docx

    《从跟随到领先:H为管理体系重构之路》读书笔记.docx

    《从跟随到领先:华为管理体系重构之路》读书笔记x.pptx

    《从跟随到领先:华为管理体系重构之路》读书笔记x.pptx

    《从跟随到领先:H为管理体系重构之路》读书笔记.pptx

    《从跟随到领先:H为管理体系重构之路》读书笔记.pptx

    《重构》----学习笔记

    重构的益处多样,包括改善软件设计,使代码更易于阅读和理解,帮助定位和修复bug,以及提高编程效率。重构应该成为开发过程中的常态,特别是在添加新功能、修复错误或代码审查时,都是进行重构的好时机。当发现代码...

    代码整洁之道读书笔记.zip

    个人读书笔记,学习共享,希望每个苦恼于代码一坨坨混乱不堪的程序员都能学习. * 整洁代码的意义? 可读性,可维护性。 * 如何写出整洁代码? 1.只做一件事 2.不重复 3.有表达力 * 整洁代码的态度要求,要遵守...

    代码质量-读书笔记

    下面将详细解读这个领域的核心知识点,并基于"代码质量-读书笔记"的内容展开讨论。 首先,我们要理解什么是代码质量。代码质量不仅仅关乎代码的正确性,更包括其可读性、可维护性、可扩展性等多个方面。良好的代码...

    重构-第3章 代码的坏味道-读书笔记

    3. 过长的方法:如果一个方法执行了太多的任务,它就违反了单一职责原则,使得阅读和测试变得困难。应将大方法拆分成小的、可重用的部分。 4. DRY原则:重复的代码应当被提取成公共函数或模块,避免在多个位置重复...

    互联网金融读书笔记.docx

    正如书中所述,银行、证券、保险和信托等传统金融机构面临着商业模式和组织形式的重构。在保险领域,互联网的发展促使产品更加贴合消费者的个性化需求,保险的服务功能得到了强化,而非仅仅是事后的经济补偿。对于...

    《Python编程金典》读书笔记

    ### 《Python编程金典》读书笔记知识点梳理 #### 1. 绪论 绪论部分通常会介绍Python的历史背景、特点以及为什么选择Python作为学习和使用的编程语言。此外,还会涉及Python与其他编程语言的区别,以及它在不同领域...

    读书笔记:重构中一个以高性能、高效率、高兼容性和多功能为目标、多框架平台支持和兼容的Pixiv聊天机器人。.zip

    读书笔记:重构中一个以高性能、高效率、高兼容性和多功能为目标、多框架平台支持和兼容的Pixiv聊天机器人。

    c++读书笔记程序以及源码

    总之,这个C++读书笔记程序及源码资源为学习者提供了宝贵的实践材料,通过阅读和理解源码,不仅可以深化对C++语言的理解,还能掌握数据库和界面编程的核心技能。同时,它还提醒我们,理论知识与实际项目相结合是提升...

    《重构_改善既有代码设计》观后感PPT

    【美】马丁福勒 著 是国际著名的面向对象分析设计、UML、模式等方面的专家,敏捷开发方法的创始人之一 重构_改善既有代码设计 软件工程领域的超级经典巨著,与另一巨著《设计模式》并称"软工双雄

    PRML读书会笔记

    ### PRML读书会笔记知识点概览 #### 一、引言 《Pattern Recognition and Machine Learning》(PRML)是一本经典的机器学习教材,由Christopher M. Bishop撰写。本书以其全面性和深度著称,在机器学习领域内被视为...

    英语口译笔记法实战指导

    综上所述,英语口译笔记法是一项综合性的技能,它涵盖了符号系统、信息筛选、时间管理、结构化记录、回顾与重构、练习与反馈以及心理素质等多个方面。通过系统地学习和实践,口译员可以在工作中更高效地完成翻译任务...

    重构-改善即有代码的设计

    PDF格式的书籍可以在不同的设备上阅读,易于分享和笔记,为读者的学习和使用提供了极大的便利。然而,技术书籍的价值不仅在于阅读,更在于实践。因此,建议读者在阅读的同时,将理论知识与实际编程相结合,通过具体...

Global site tag (gtag.js) - Google Analytics