作者:empty 页数:506 出版社:empty |
序“不成熟的优化是所有不幸的根源。”-Charles Antony Richard Hoare先生, 英国计算机科学家, 后来Donald Knuth在其著作The Art of Computer Programming中进一步解释了这句话。前几天, 我观看了一部关于南美电影导演Fabian Biel in sky的纪录片, 我特别注意到他令人意外的是,虽然这是电影制作的情形,但编写组件的代码与摄制场景也是非常相因此,这里将说明重构的需求问题。首先定义重构在软件行业术语中的含义(非正式的,经验表明,一些代码迟早都是重构的候选,理由有很多:从用户的角度讲,直到看到安装和运行了原来需要的东西之后才能确定确切的应用程序。这并不是玩笑话!从一开始,他们开始需要可以预见的东西,但是很不明确,一切都很自然——我无论如何都不会指责他们。这样一来一回,不希望出现的副作用是代码开始失去一定的凝聚力;由于面市时间的压力,最后的修改结果就是不同的模块可能开始在可接受的层次之上耦合。从开发的角度来看,我们对在建模时编码可能呈现的情况并没有清晰的想法。和用户的表现一样,我们也认为我们有很好的想法(或最后会有很好的想法),直到我们试图将它们付诸实施时为止。失败并不是一件坏事。不好的是只是因为不想承认没有考虑出一个很好的想法,所以拒绝更改我们的想法,而事实上实现起来是很容易的。同样的,由于时间压力,那么以最快的速度交付一个组件代码也可能损害到它的质量。
最后,从技术的角度讲,与行业趋势伴随的是一个看不见的(有点无所不在的)压力。典型示例是演化的.NET或Java API——AJAX、WebServices等——这将让以前版本或通常的策略(如Service-Oriented Architecture(SO A) 、Model-View-Controller(MVC) 、Object/Relational Mapping(O/R-M) 等) 变得陈旧。同样的, 在对这些趋势作出反应的同时,已有代码需要作一些处理,这些处理随着时间推移会侵蚀质量。同时,现实世界告诉我们,尽力提高代码质量是我们天生应该做的事情。要考虑到,关于这一问题的好消息是可以在局部运用重构,即在组件或方法的层次上,这也是运在本书中,作者将深入讨论重构的话题,包括从预见其优点到目前将重构付诸实施的作为开发工具的领导者之一, Microsoft完成了将最佳资源提供给那些每天需要处理编亲爱的读者,我敢保证,您将获得关于这些技术最可靠的、最基本的指导。请尽情享在一次访谈中与观众共同分享的一些想法。他说在拍摄场景时,通常发生的情况是摄制的场景可能并不是导演原来想象希望能得到的。有时候,需要重新拍摄场景直到导演获得最初想要的场景为止,而在其他一些情况下,有些场景可能是唾手可得的,甚至认为这可能比最初的构思要更好。因此,他总结道,制作电影的真正艺术在于明智地决定什么时候需要重做,什么时候只要使用第一次获得的场景即可。似的。总是可能获得比给定算法更好的方法。因此,出于时间安排、预算、交付责任日期以及通常的用户满意度的考虑,有着管理人员头衔的人必须决定在什么时候冻结所有可能的改进以及什么时候继续并获得更多的改进。作者将更好地定义):重构是一系列用于改善代码片断质量(可理解性、可维护性、模块性、可扩充性等)的技术和机理,方法是以保持通常行为固定不变的方式来重新组织语句。换言之,受影响组件的行为不应该随着过程的后果而是随着它们的质量而变化,并希望增加其寿命。
代码重构(VisualBasic版)重构技术是这类自发尝试的最高级别,并通过一些可供使用的支持工具来确保这一过程的成功实现。用任何其他修改的地方;也可以在全局运用重构,即在模块或应用程序的层次上,赋予它整个项目的范围。确定重构是否适当的标准取决于其弥补的质量缺陷、剩余的时间、可供使用的预算等因素。与在没有任何更新请求的地方相比,在必须作出处理的地方总是可以更容易地判断重构的应用。方法。Danijel Arse nov ski从.NET和Java平台最早的版本开始就已经开始从事重构技术的研究。他在很多会议上做过报告,并创立了这一主题的工作室,同时还推动银行业中重构项目的成功实现。码行为和软件项目的人。通过其成功推出的VisualStudio IDE, Microsoft使得重构一个现成工具只需要用鼠标键右击代码即可。在这些页面上, Danijel将展示在VisualBasic中重构如何可以像复制/粘贴或其他编辑操作一样的简单。受阅读本书的乐趣吧!
前言感谢您选择本书,欢迎进入到重构的神奇世界中来。笔者希望,随着日常编程工作的进行,您在与同行讨论不同的设计方案时,或是在准备解决一些模糊的遗留代码时,或甚至晚上在头脑中琢磨代码行时,能发现本书的用途。如果这是您第一次接触到重构,那么希望本书能深刻地改变您编程和思考代码的方式。然而,完成这项任务并不是一件简单的事情,最终将通过这些来判断成功与否。在阅读完Martin Fowler编著的Refactor ng:Improv ig the Design of ExistingCode(Addison-Wesley, 1999) 之后, 笔者决定以一种系统化的方式采用重构。事实证明, 该书是一本很实用的著作,它将帮助学会一些可立刻运用于实际项目的、独立的技术。该书不是建立在复杂理论的基础之上,也没有包含任何复杂的数学公式。任何编写代码的人都能够立刻理解语言。在阅读完该书之后,笔者注意到自己在编程方式上的变化:能够检测到更多确定的问题代码和设计流程。能够为这些问题思考解决方案并通过重构有效地解决它们。在与同事讨论时,能够以一种清晰且精确的方式阐述自己的决策。代码味道重构代码转换一些基本的面向对象的原则可以自动化重构过程的重构工具的使用最后,笔者不再将这些固定的结构看作不随时间变化的,并将其看作是一个塑性的、可模化的窗体,可以根据自己的需求和爱好来定制该窗体的风格。这样就以处理代码的方式引发了一种基本的修改。笔者意识到存在一种方法,通过该方法,可以以一种高效、可预知的方式来修改代码并改进设计过程。很快,关于重构的言论在笔者共事的团队中流传开来,笔者看到越来越来多的同事从书架上取下这本书,仔细阅读。甚至有些人还自己购买了该书。这样,笔者就可以使用重构的术语来与同事们交谈,并将重构作为软件构建过程中不可缺少的部分介绍给大家。甚至证明管理层在这一方面是有远见的。如果您是一个VB 6的编程人员, 那么因为VisualBasic 6(或之前的) 编程语言与Visual本书所讨论的大部分重构都是适用于所有完全面向对象语言中的标准重构。这意味着本书将详尽地介绍VisualBasic中的重构。本书将介绍如下基本的重构概念:本书只使用了一个示例研究(对于本书的示例研究而言,该示例的规模相对较大)来阐除了适用于任何面向对象语言的标准重构之外, 本书还介绍了一些VB.NET专有的重一部分是因为笔者对于学习不同的语言和技术感兴趣,一部分是因为笔者必须常常在自己的工作场所陈述观点,所以笔者开始与不同的团队一起工作并以不同的语言来编程。在与用VisualBasic编程的团队一起工作时, 笔者尽量区分不同的重构, 其方式类似于笔者与使用Java或C#语言的团队一起共事时一样。事实证明这一过程并不是那么的一帆风顺。很快, 笔者意识到对于VisualBasic的编程人员而言, 几乎没有什么关于重构的信息可供使用。虽然在任何面向对象的编程语言中,可以以相同的方式使用大部分的重构,但是仍然存在一些细微的区别。在编程人员阅读完以其自己偏好的语言编写的代码示例之后,他不学习重构的理由将不复存在。这种情况激励笔者思考VisualBasic中的重构问题, 并最终编著了本书。笔者认为本书确实有存在的需要, 对于使用VisualBasic的编程人员来说将会发现本书是非常实用的。DG代码重构(VisualBasic版)对编码的性能产生积极的影响。笔者也期待能够创建更好、更精巧的设计。更为重要的是,笔者希望本书能帮助编程人员从日常的工作负担中解脱出来,并将快乐建立在所希望看到的地方:即编写伟大的程序代码。希望本书将帮助读者更快更好地编写代码。笔者希望本书能提高编程人员的生产率并本书的读者对象本书的读者对象是经验丰富的(中高级的) VisualBasic.NET开发人员, 他们希望被引入到重构世界中。为了充分利用本书, 读者应该很好地掌握VisualBasic.NET, 尤其是通常的面向对象的编程。如果您还只是一个编程方面的初学者,那么无法将本书用作初级入门书。本书的目的不是传授用VisualBasic.NET编程的基本方法。然而, 在职业生涯中不尽早地熟悉重构,是没有任何理由的。随着学会编写第一个类,您就可以使用本书来学会如何正确地设计并纠正可能引入到设计中的任何错误。Basic.NET之间存在差距, 以致将无法成功地运用本书中讨论的很多重构。然而, 在这种情况下, 可以尽量将VB 6的代码升级到VB.NET中, 此时您就会发现本书将非常有用。笔者花费了整整一章的篇幅(本书最后一章) 来讨论将VB 6代码升级到.NET的话题。然而,该章本身就是建立在本书前面部分所讨论主题的基础上的。此外, 可能还会发现本书在从VB 6到VisualBasic.NET转换的时候也非常有用。本书介绍新手在从VB 6转到VB.NET时可能会犯的错误, 并给出了解决这些问题的方法。本书没有对应用程序的类型或域做出任何假设。所以,这个应用程序可能是通常的Web应用程序、Web服务、架构、组件、购物车应用程序、新的Facebook小部件或射击游戏,但是不管是什么应用程序,只要其中存在VB代码,那么都将会发现本书所阐释的技术是很有价值的。如果使用其他某种面向对象的语言(如C#) 进行编程, 那么只要熟悉VB.NET语法且能够阅读代码示例,就能够使用和运用本书所提供的信息。
详尽地介绍VisualBasic中的重构。本书包含了大量重要的味道和重构。然而,本书并没有给出完整的重构目录;由于时间和篇幅的限制, 一些重要的重构并没有介绍。例如, 本书并没有讨论诸如SimplifyCondi ional或Reverse Conditional之类的重构, 而这些用于自动化的重构已经在DeveloperExpress的Refactor!插件中可供使用。此外, 本书也没有讨论很多“逆向”重构, 如InlineMethod或Inline Class。本书的首要目标是介绍重构。笔者的经验表明编程人员刚开始接触重构时首先需要处理的问题是结构化很差的代码问题, 而诸如Extract Method或Extract Class之类的重构将帮助解决这一问题。与其相对的, Inline Method和Inline Class重构将帮助处理过分结构化的代码。这些重构将帮助消除不再需要的构造(如方法或类)。这种情况常常在对代码基运用了广泛的重构之后才发生。然而,这并不意味着“逆向”重构不重要。一旦已经掌握了基本的重构之后,对这些重构的需要可能就在了解重构之后出现。其中部分学习过程是让人认识到学无止境。例如,通过每个新版本的Refactor!插件, 就将新的重构添加到一批被支持的重构中。人们不断地发明和修改重构。随着逐渐熟悉该技术,读者将会发明自己的重构并可能最终决定与其他人共享这些重构。新的重构。这样,将能真正掌握持续的代码改进的艺术。因此,笔者建议读者跳出本书的范围;不要局限于本书中所罗列的重构。寻找和发明本书的组织结构因为本书是第一本专门处理VisualBasic中重构的书籍, 也可能是读者阅读的第一本关于重构的书,笔者希望本书完成如下多个目标:述新的概念时,也是从逻辑上由基本到复杂逐步推进。为了达到简化的目的,本书还为每个概念给出了用于举例的代码示例。通过这种方法,可以从头到尾按照一种逻辑顺序来阅读本书。在得到本书并首次阅读之后,可能会发生这种情况。则的所谓的“定义框”。这些定义的目的是提供相应主题的综述。例如,对于味道而言,其大部分章节的末尾都将讨论重构、味道以及原则是如何反映到本书所包括的示例研究详尽地介绍日常编程会议中可能会咨询到的重构技术和代码味道。
阐述如何通过一个示例的学习, 在现实情形中运用重构技术。这个示例就是Rent-a-Wheels应用程序, 在整本书的每一章中都将分析和修改该应用程序。为了达到上述目标,本书就像其他的技术书籍一样叙述了各个主题。在介绍和详细阐除了主要的叙述部分之外,还将看到本书中散布着很多味道、重构和面向对象设计原定义包含了关于如何发现该味道的试探法。对于重构的情况而言,有一个部分称作“技巧DG(Mechanics) ”, 它包含了特定的方法, 并指明了为高效的执行特定重构而必须完成的步骤。代码重构(VisualBasic版)在日常工作期间,您就可以通过考虑这些技巧来提醒自己如何完成该重构、如何发现某种味道以及使用什么重构来消除味道等。中。读者可以下载每一章中的代码并查看当前一章中的示例发生了何种变化。示例研究的目的是展示重构一个更现实的应用程序。在很多技术性的书籍中,常常会发现一些选中的代码样本,为了论证观点,已经对该样本进行了不太实际的简化。虽然这样的处理让示例更加清楚且更易于编者证明其观点,但是这常常意味着读者将碰到现实世界中更复杂的情形,而且如果可以在生产代码上运用特定的技术,则可能会产生无法预计的障碍。本书试图通过Rent-a-Wheels示例研究来向读者呈现一个更为贴近实际的情形。
第Ⅰ部分重构的介绍2.2.5
第1章重构的全面介绍
1.1重构的快速浏览3
1.2重构过程的详细介绍
1.3VisualBasic和重构
创建Patient类的层次结构35
信息的功能
JetBrains提供的ReSharper58
Visual Assist X
提供的Refactor!Pro
界面的Refactor!
使用的重构
需要考虑的其他测试工具79
保存功能的实现
2.3.1保存数据
2.3.2实现显示病人历史
Calories Calculator
重构过的版本
小结
组建重构的工具箱
使用自动化的重构工具
3.1.1
3.1.2Whole Tomato提供的
3.1.3Developer Express
3.1.4从Refactor!开始入手
3.1.5进一步探讨VB用户
3.1.6快速浏览:可供
单元测试的基本内容:
测试的护具
3.2.1单元测试架构的出现
3.2.2NUnit的初体验
3.2.3NUnit的安装
3.2.4第一个测试的实现
3.2.5测试驱动的方法
3.2.6
关于版本控制的一些问题.81
小结
Rent-a-Wheels应用
程序的原型
小结
重构的初体验
Calories Calculator样本
应用程序
2.1.1
2.1.2
2.1.3
运用中的重构
2.2.1
2.2.2
2.2.3
2.2.4
重构过程
软件行业现状概述5
代码味道的使用
代码的转换
重构的优点
澄清一些常见的误解
VisualBasic的发展史
和遗留问题
VisualBasic的演变
通过重构处理遗留的问题15
Calories Calculator
应用程序
需求的增长:计算
理想的体重
需求的增长:保存病人
的数据
将Btn Calculate_Click
方法分解
发现新的类
限制Patient类的接30
将条件逻辑放到
Patient类中
会见经理
会见前台接待员
Explicit On重构
重构成显式的形式
错误处理
非结构化的代码
出现的异常
On Error的重构步骤150
替换On Error Goto标签151
换On Error Resume Next154
错误代码
自定义的错误代码
无用代码常见的来源168
作用域和访问级别173
会见停车场的服务人员85
会见维护人员86
程序窗90
团队的会议.90
.检查VisualBasic的代码93
重用的机制98
进入到交付99
弱类型化到动态强类型化103
Option Strict的.NET影响104
Option Explicit On105
5.2.1理解SetOption
5.2.2将Rent-a-Wheels代码
6.1.1传统的(非结构化的)
6.1.2结构化的错误处理
结构化错误处理的好处
6.2.1结构化的代码和
6.2.2作为类型而不是数字
6.2.3错误过滤
6.2.4Finally代码块
6.2.5
.NET的互操作性147
用Try-Catch-Finally取代
On Error构造
6.3.1理解关键字When
6.3.2用Try-Catch-Finally替换
6.3.3用Try-Catch-Finally构造
6.3.4用Try-Catch-Finally构造替
用异常类型替换错误代码155
6.4.1用异常类型替换系统
6.4.2用异常类型来替换
6.5Rent-a-Wheels应用程序
VB代码示例
通过新变量的定义来
及其与VisualBasic的关系127
激活显式而严格的
编译器选项133
小结137
理解问题域190
发布接和公有接200
采取Rent-a-Wheels项目
中最初的步骤
4.2.1参与者和用例
4.2.2汽车的状态
4.2.3首次拟定主要的应用
4.2.4Rent-a-Wheels开发
让原型运转
4.3.1检查数据库模型
4.3.2
快速而高效的VB编程方法96
4.4.1数据库驱动的设计.97
4.4.2基于GUI的应用程序97
4.4.3事件驱动的编程97
4.4.4快速应用程序开发(RAD) 98
4.4.5复制粘贴作为代码
4.5通过重构过程从原型
4.6小结99
第Ⅱ部分VB重构的初步知识
第5章Chameleon语言:从静态
5.1Option Explicit和
5.2在不严格的代码中设置
第7章
解决变量的复杂用法112
推断变量的类型115
通过类型转换函数将
所有内容整合在一起.118
方法、字段、属性和
其他成员的处理120
将SetOption Strict On
重构运用到Rent-a-Wheels
应用程序中125
VisualBasic 6及其之前
版本中的后期绑定.128
鸭子类型化129
在文件层次上重设动态
行为或静态行为130
为动态代码提供一个
静态类型化的封装器131
在Project Properties
窗中设置选项134
更改VisualBasic编译器
的默认行为135
在源文件中设置选项135
使用项模板来设置选项136
错误处理:以一些简单的
步骤从传统风格步入到
结构化风格139
传统的错误处理和结构化
的错误处理140
7.2.2
过度曝光常见的来源174
7.2.3处理过度曝光的问题178
使用显式导入179
删除未使用的程序集引用183
Rent-a-Wheels应用程序
中的基本卫生184
小结185
第ⅢII部分标准重构转换的
第8章从问题域到代码:消除差距189
8.2命名的指导原则193
8.4Rent-a-Wheels应用程序中
初步介绍
第1步:收集信息
第2步:就词汇表达成
一致意见191
第3步:描述交互作用192
第4步:建立原型193
大写风格194
简单的命名指导原则.195
顺畅地传递信息:选择
正确的单词196
Rename重构197
自包含的应用程序与
可重用的模块200
修改公有接203
Refactor!中的Safe Rename
重构.206
的Rename和Safe Rename
重构208
小结209
对重复代码进行方法提取211
保持封装代码和隐藏
细节的原因211
信息和实现的隐藏212PDG
中的错误处理
小结
基本的代码卫生:消除无
用代码、降低作用域、使
用显式导入以及删除不用
的引用
删除无用代码
7.1.1无用代码的类型
7.1.2
降低过度曝光的元素的
作用域和访问级别
高级重构
Encapsulate Field重构261
垃圾回收
对象设计的转移
持久化分离
应用程序
其他误用情形
程序集的重组
设计模式的定义390
模式的分类
模式的元素.391
权衡设计模式的利弊392
模式的使用392
基于构造函数注入与
基于属性注入
应该注入什么服务实现411
提供的重复功能的代码415
GUI类