- 浏览: 128389 次
- 性别:
- 来自: 北京
最新评论
-
C_J:
有必要这么鸡冻咩?
编写自己的ClassLoader知识点 -
jason61719:
你这不是说了等于没说吗……就解析个loadClass(),谁不 ...
编写自己的ClassLoader知识点 -
jiming:
tedeyang 写道很好的改进,不过话说回来,mybatis ...
开源,从关注产品社区做起(ibatis3.x的最近一个issue展示) -
C_J:
独爱Java 写道好像实际用处并不是很大,只是多了解了有这个东 ...
Java内存模型笔记 -
独爱Java:
好像实际用处并不是很大,只是多了解了有这个东西而已。。。
Java内存模型笔记
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、重构可能破坏现有程序。
重构就是一个博弈的过程,一个寻找平衡点的过程,空间和时间的平衡点,清晰和工作量的平衡点,共性和个性的平衡点...如果没有看到实际的情况,谁也无法知道具体该怎么做,但务必保持“简约而不简单的”优良作风。
评论
作者推荐在编码阶段就开始构造单元测试,可为每个类写main方法来测试,这个我目前觉得还点苛刻了。
作者推荐的应该不是每个类写main方法,而是用Junit之类进行单元测试。在编码阶段构造单元测试说不上苛刻吧,要是按照敏捷的要求应该是TDD,写代码前先写测试呢。
即便是这样也是苛刻
第一,没有必要为每一个类作单元测试,否则何来的覆盖率之说
第二,为重点关注类写单元测试在现在大多数公司和企业也是不太现实,愿望很美好...
test coverage是重构的保证,保证不了正确性,重构就没有意义。
我的经验是DAO 100%,
BO的line coverage 100%
branch coverage >50%
brach coverage >70%==基本
brach coverage >80%==良(大多数项目)
brach coverage >85%==优
作者推荐在编码阶段就开始构造单元测试,可为每个类写main方法来测试,这个我目前觉得还点苛刻了。
作者推荐的应该不是每个类写main方法,而是用Junit之类进行单元测试。在编码阶段构造单元测试说不上苛刻吧,要是按照敏捷的要求应该是TDD,写代码前先写测试呢。
即便是这样也是苛刻
第一,没有必要为每一个类作单元测试,否则何来的覆盖率之说
第二,为重点关注类写单元测试在现在大多数公司和企业也是不太现实,愿望很美好...
test coverage是重构的保证,保证不了正确性,重构就没有意义。
我的经验是DAO 100%,
BO的line coverage 100%
branch coverage >50%
老马说的tdd是重构的保障,离开单元测试进行重构总是很不放心万一又引入了什么新bug。
重构这东西感觉就是写给coder的。
目标就是尽量让每一个类的体型都是大小正好,近似标准体型,比如:
每个函数有N行左右的代码,多了就拆,少了就合并;
每个类有N左右个方法,N个左右的属性,每个包有N个类,。。。。
这里的N一般取值很小,不大于10.
N -> 7 土 2
老马说的tdd是重构的保障,离开单元测试进行重构总是很不放心万一又引入了什么新bug。
重构这东西感觉就是写给coder的。
目标就是尽量让每一个类的体型都是大小正好,近似标准体型,比如:
每个函数有N行左右的代码,多了就拆,少了就合并;
每个类有N左右个方法,N个左右的属性,每个包有N个类,。。。。
这里的N一般取值很小,不大于10.
作者推荐在编码阶段就开始构造单元测试,可为每个类写main方法来测试,这个我目前觉得还点苛刻了。
作者推荐的应该不是每个类写main方法,而是用Junit之类进行单元测试。在编码阶段构造单元测试说不上苛刻吧,要是按照敏捷的要求应该是TDD,写代码前先写测试呢。
即便是这样也是苛刻
第一,没有必要为每一个类作单元测试,否则何来的覆盖率之说
第二,为重点关注类写单元测试在现在大多数公司和企业也是不太现实,愿望很美好...
70%的分支还是基本能达的到的。
作者推荐在编码阶段就开始构造单元测试,可为每个类写main方法来测试,这个我目前觉得还点苛刻了。
作者推荐的应该不是每个类写main方法,而是用Junit之类进行单元测试。在编码阶段构造单元测试说不上苛刻吧,要是按照敏捷的要求应该是TDD,写代码前先写测试呢。
即便是这样也是苛刻
第一,没有必要为每一个类作单元测试,否则何来的覆盖率之说
第二,为重点关注类写单元测试在现在大多数公司和企业也是不太现实,愿望很美好...
作者推荐在编码阶段就开始构造单元测试,可为每个类写main方法来测试,这个我目前觉得还点苛刻了。
作者推荐的应该不是每个类写main方法,而是用Junit之类进行单元测试。在编码阶段构造单元测试说不上苛刻吧,要是按照敏捷的要求应该是TDD,写代码前先写测试呢。
发表评论
-
iOS入门(ongoing)
2012-09-13 11:32 1311Record it: The overview of ... -
Stuff about Android
2011-07-09 16:15 1076Foreword: long time ... -
JQuery初体验(Demo)
2011-05-22 13:43 1466Demo:Show <meta content ... -
Java内存模型笔记
2011-04-13 15:48 1544题记: 看到C/C++ ... -
Radiant_The Popular Ruby's CMS Demo篇
2011-04-02 14:49 1251题记: 上篇 记录我第一次安装Rodiant经过和 ... -
Radiant_The Popular Ruby’s CMS安装篇
2011-03-28 00:48 1287题记: 今天第一次参加JE的线下活动,robbin等 ... -
关于Azul 并发垃圾回收器
2011-03-26 14:40 1326题记: 总感觉JE讨论的帖子的东西都比较滞后,所以会 ... -
phpCMS & jQuery是我该做的(阉割了)
2011-02-27 23:02 81WD讲究以plugin挂载为结构,我需要构造一个p ... -
我的玩意:J2ME的Criteria初探
2011-01-20 21:59 1025题记: 前几天跟初中同学聊天,他问我能不能做一个GP ... -
编写自己的ClassLoader知识点
2011-01-13 14:41 1876题记: 看到InfoQ关于ClassLoader的文 ... -
周末好玩,用短信控制你的计算机
2011-01-10 16:34 3008Snapshot: 详情 ... -
About Dock Plugin on Mac
2010-11-21 22:47 1470题记: 第一次接触MAC的开发..... ... -
可变hashcode的隐患和序列化安全
2010-10-25 00:55 1380可变hashcode的隐患 为识别对象,JDK ... -
体验OSGi(helloworld.jar)—富app的热拔插
2010-10-18 23:22 2449记得以前工作的时候,有天direct manager问 ... -
MongoDB on DAO with Java Language
2010-08-26 19:17 1437A Quick Tour Using the Java d ... -
Getting Start on Mongodb
2010-08-26 01:29 1522题记: 最近老和同学聊到non-relational ... -
Java Media Framework本地玩转摄像头
2010-08-04 00:57 17481、简介The JavaTM Media Framework ... -
从WeakLogHandler应用看Java的引用、引用队列
2010-06-14 00:58 1506题记: 前几天讨论到WeakHashMap(这个是个弱引用的 ... -
RPC之WebServices&RMI&JMS,phprpc框架?(待续)
2010-05-06 22:31 55前段时间写过基本的WebServices,也没再做深入 ... -
Java应用中的SQL注入攻击和防范
2010-04-24 01:06 6727说说自己对注入的 ...
相关推荐
同时,read.txt文件可能包含作者的前言或阅读指南,提供了学习此笔记的建议和注意事项。 总的来说,《31天重构系列笔记》是C#开发者提升代码质量和效率的宝贵资源。通过系统的练习和学习,开发者可以提升自己的重构...
《重构商业:产业互联网时代的商业模式重构》读书笔记模板.pptx
《重构笔记》主要探讨的是软件开发过程中的一个重要实践——重构,它是提高代码质量、可维护性和...通过深入阅读这份文档,开发者可以学习如何在实践中提升自己的重构能力,从而打造出更加优雅、易于维护的软件系统。
《从跟随到领先:H为管理体系重构之路》读书笔记.pdf
《从跟随到领先:H为管理体系重构之路》读书笔记.docx
《从跟随到领先:华为管理体系重构之路》读书笔记x.pptx
《从跟随到领先:H为管理体系重构之路》读书笔记.pptx
重构的益处多样,包括改善软件设计,使代码更易于阅读和理解,帮助定位和修复bug,以及提高编程效率。重构应该成为开发过程中的常态,特别是在添加新功能、修复错误或代码审查时,都是进行重构的好时机。当发现代码...
个人读书笔记,学习共享,希望每个苦恼于代码一坨坨混乱不堪的程序员都能学习. * 整洁代码的意义? 可读性,可维护性。 * 如何写出整洁代码? 1.只做一件事 2.不重复 3.有表达力 * 整洁代码的态度要求,要遵守...
下面将详细解读这个领域的核心知识点,并基于"代码质量-读书笔记"的内容展开讨论。 首先,我们要理解什么是代码质量。代码质量不仅仅关乎代码的正确性,更包括其可读性、可维护性、可扩展性等多个方面。良好的代码...
3. 过长的方法:如果一个方法执行了太多的任务,它就违反了单一职责原则,使得阅读和测试变得困难。应将大方法拆分成小的、可重用的部分。 4. DRY原则:重复的代码应当被提取成公共函数或模块,避免在多个位置重复...
正如书中所述,银行、证券、保险和信托等传统金融机构面临着商业模式和组织形式的重构。在保险领域,互联网的发展促使产品更加贴合消费者的个性化需求,保险的服务功能得到了强化,而非仅仅是事后的经济补偿。对于...
### 《Python编程金典》读书笔记知识点梳理 #### 1. 绪论 绪论部分通常会介绍Python的历史背景、特点以及为什么选择Python作为学习和使用的编程语言。此外,还会涉及Python与其他编程语言的区别,以及它在不同领域...
读书笔记:重构中一个以高性能、高效率、高兼容性和多功能为目标、多框架平台支持和兼容的Pixiv聊天机器人。
总之,这个C++读书笔记程序及源码资源为学习者提供了宝贵的实践材料,通过阅读和理解源码,不仅可以深化对C++语言的理解,还能掌握数据库和界面编程的核心技能。同时,它还提醒我们,理论知识与实际项目相结合是提升...
【美】马丁福勒 著 是国际著名的面向对象分析设计、UML、模式等方面的专家,敏捷开发方法的创始人之一 重构_改善既有代码设计 软件工程领域的超级经典巨著,与另一巨著《设计模式》并称"软工双雄
### PRML读书会笔记知识点概览 #### 一、引言 《Pattern Recognition and Machine Learning》(PRML)是一本经典的机器学习教材,由Christopher M. Bishop撰写。本书以其全面性和深度著称,在机器学习领域内被视为...
综上所述,英语口译笔记法是一项综合性的技能,它涵盖了符号系统、信息筛选、时间管理、结构化记录、回顾与重构、练习与反馈以及心理素质等多个方面。通过系统地学习和实践,口译员可以在工作中更高效地完成翻译任务...
PDF格式的书籍可以在不同的设备上阅读,易于分享和笔记,为读者的学习和使用提供了极大的便利。然而,技术书籍的价值不仅在于阅读,更在于实践。因此,建议读者在阅读的同时,将理论知识与实际编程相结合,通过具体...