MyException - 我的异常网
当前位置:我的异常网» 软件架构设计 » .java代码复建

.java代码复建

www.MyException.Cn  网友分享于:2013-11-15  浏览:2次
.java代码重构

前段时间读过martin fowler的《重构 ,改善既有代码的设计 》,不禁感叹:他老人家绝对对得起大师这个名号啊!对于入行不久的程序员来说,读这本书对提高代码质量肯定有帮助。就重构这个话题,还和部门同事做了次交流,将交流时的文档整理在此仅作备忘。

软件的成本
         N 年前, Yourdon 和 Constantine 在 Structured Design 一书中将经济学作为了软件设计的底层驱动力,软件设计应该致力于减少整体成本。  

      COST total = COST develop + COST maintain
      COST maintain = COST understand + COST change + COST test + COST deploy 

      软件的维护成本占了软件总成本的大部分,想要节约软件成本就要从软件的维护成本下手,而维护成本中理解老代码和修改老代码又占了绝大部分。可见,提高代码可理解性是多么重要,这时重构闪亮登场,为我们改善代码可读性提供了指导性的一些原则和手法。


  什么是重构
      看看 Martin Fowler的定义:

      在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构。重构是一种有纪律的、经过训练的、有条不紊的程序整理方法,可以将整理过程中不小心引入错误的机率降到最低。本质上说,重构就是在代码写好之后改进它的设计。
                                                                                                                                       --Martin Fowler 

      重构 【 名词 】 :对软件内部结构的一种调整,目的是在不改变软件之可察行为 前提下,提高其可理解性,降低其修改成本 。

      重构 【 动词 】 :使用一系列重构准则(手法),在不改变软件之可察行为 前提下,调整其结构。


      关键的一点是重构离不开单元测试,测试驱动开发的模式。在已有单元测试的基础上进行代码重构,小步前进。

      另外一个比较好的建议是 Kent Beck所说的 两顶帽子 :使用重构技术开发软件时,你把自己的时间分配给两种截然不同的行为 : 「添加新功能」和「重构」。

重构的好处
•  使软件更容易理解
•  帮你找到 bug
•  提高编程速度
重构时机
•三次法则 
•添加新功能时
•Bugfix 时
•Code review 时 

重构与设计
      重构与设计并不是矛盾的,而是互为补充的:

•所有的设计都不可能做到滴水不漏,这个时候就需要重构来堵设计的漏洞;
•不能依赖重构而不重视重构。

重构与性能
      重构和性能优化是不同维度的手法,重构的目的是提示程序的可理解性和可维护性,而优化则是侧重提升性能。重构为了提高代码可读性往往还会导致性能不是最优,考虑“二八原则”,如果这段代码不会显著导致程序性能严重下降,我们选择重构。

坏味道及应对重构手法
• 重复的代码

–   提炼函数,提炼类,上移函数,塑造模板函数

• 过长函数

–   提炼函数,查询取代临时变量,函数对象取代函数,分解条件表达式

• 过大类

–   提炼类,提炼子类,提炼接口,以对象取代数据值

• 过长参数列

–   函数取代参数,引入参数对象,保持对象完整

•  发散式变化

–   提炼类

•  散弹式修改

–   搬移函数,搬移值域,将类内联

•  依恋情结

–   搬移函数,搬移值域,提炼函数

•  数据泥团

–   提炼类,引入参数对象,保持对象完整

•  基本型别偏执

–   以对象取代数据值,提炼类,引入参数对象,以对象取代数组,以类取代型别码,以子类取代型别码,以 State/Strategy 取代型别码

•  Switch 惊悚现身

–   多态取代嵌套条件表达式,以 State/Strategy 取代型别码,以明确函数取代参数

•  平行继承体系

–   搬移函数,搬移值域

• 冗余类

–   内联类,折叠继承体系

• 夸夸其谈未来性

–   折叠继承,将类内联,移除参数,重命名函数

• 令人迷惑的暂时值域

–   提炼类

• 过度耦合的消息链

–    隐藏委托

• 中间转手人

–   消除中间人,将函数内联,以委托取代继承

•  狎昵关系

–    搬移函数,搬移值域,改双向关联为单向,以继承取代委托,隐藏委托

• 异曲同工的类

–   重命名函数,搬移函数

• 不完美的类库

–   引入外加函数,引入本地扩展

•  单纯数据类

–    搬移函数,封装值域,封装集合

•  被拒绝的遗赠

–    以委托取代继承

•  过多的注释

–    提炼函数

重构法则分类
重新组织函数
•提炼函数
•将函数内联化
•将临时变量内联化
•以查询取代临时变量
•引入解释性变量
•剖解临时变量
•移除对参数的赋值操作
•以函数对象取代函数
•替换算法
在对象间搬移特性


•搬移函数
•搬移值域
•提炼类
•将类内联化
•隐藏委托关系
•移除中间人
•引入外加函数
•引入本地扩展
重新组织数据
•自封装值域
•以对象取代数据值
•将实值对象改为引用对象
•将引用对象改为实值对象
•以对象取代数组
•将单向关联改为双向
•将双向关联改为单向
•以符号常量或字面常量取代魔法数
•封装值域
•封装集合
•以数据类取代记录
•以类取代型别码
•以子类取代型别码
•以 State/Strategy 取代型别码
•以值域取代子类
简化条件表达式


•  分解条件表达式
•  合并条件表达式
•  合并重复的条件判断
•  移除控制标记
•以卫语句取代嵌套条件式
•  以多态取代条件式
简化函数调用
•重新命名
•重新命名函数
•查询和修改分离
•以明确函数取代参数
•保持对象完整 •以函数取代参数
•引入参数对象
•以工厂函数取代构造函数
•以异常取代错误码
•  将查询函数和修改函数分离   

处理概括关系

•值域上移
•函数上移
•函数下移
•值域下移
•构造函数本体上移
•提炼子类
•提炼超类
•折叠继承体系
•塑造模板函数
•以委托取代继承
•以继承取代委托


最后,附上ppt。[/size][/size]

 

文章评论

为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序员应该关注的一些事儿
程序员应该关注的一些事儿
老程序员的下场
老程序员的下场
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
为什么程序员都是夜猫子
为什么程序员都是夜猫子
编程语言是女人
编程语言是女人
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序员都该阅读的书
程序员都该阅读的书
我的丈夫是个程序员
我的丈夫是个程序员
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
漫画:程序员的工作
漫画:程序员的工作
Java程序员必看电影
Java程序员必看电影
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
一个程序员的时间管理
一个程序员的时间管理
 程序员的样子
程序员的样子
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员的鄙视链
程序员的鄙视链
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
鲜为人知的编程真相
鲜为人知的编程真相
总结2014中国互联网十大段子
总结2014中国互联网十大段子
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
旅行,写作,编程
旅行,写作,编程
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员和编码员之间的区别
程序员和编码员之间的区别
如何成为一名黑客
如何成为一名黑客
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
10个调试和排错的小建议
10个调试和排错的小建议
中美印日四国程序员比较
中美印日四国程序员比较
那些争议最大的编程观点
那些争议最大的编程观点
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
程序员必看的十大电影
程序员必看的十大电影
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有