重构和单元测试是程序员的两大法宝,他们的作用就像空气和水对于人一样,平凡,不起眼,但是意义深重。预善事,必先利器,本文就介绍怎样在Eclipse中进行重构。
本文介绍了Eclipse支持的重构种类,它们的含义,以及怎样重构。本文同时也可以作为学习重构知识的快速手册。
什么是重构
重构是指在保持程序的全部功能的基础上改变程序结构的过程。重构的类型有很多,如更改类名,改变方法名,或者提取代码到方法中。每一次重构,都要执行一系列的步骤,这些步骤要保证代码和原代码相一致。
为什么重构很重要
手工重构时,很容易在代码中引入错误,例如拼写错误或者漏掉了重构的某一步。为了防止引入错误,在每次重构前后,都要执行充分的测试。你可能会好奇重构是否是值得的。
重构的理由很多。你可能想要更新一段代码很烂的程序。或者最初的设计队伍都不在了,现在队伍中每人了解这些程序。为了更新,你必须要重新设计构建程序来满足你的需求。另一个原因是原来的设计无法使你将新的特性添加进去。为了添加进去,你要重构这些代码。第三个原因是一个自动重构的工具可以为你自动生成代码,例如Eclipse中的重构功能。使用重构,你可以在重写尽量少的代码和仍保持软件功能的同时,使代码的逻辑性更好。
测试
在重构时,测试是十分重要的。应为重构改变了代码的结构,你要保证重构后代码的功能没有被改变。手工重构时,一个好的测试套是必须的。使用自动重构工具是,测试也是必要的,但不需要很频繁,应为自动重构工具不会产生手工重构时的那些错误,如拼写错误。
在Eclipse中可以使用JUnit方便的为程序创建测试代码,具体方法不在本文描述。
Eclipse中的重构
JDT,Eclipse中的Java插件,能够对Java项目,类,或成员进行多种类型的自动重构。可以采取多种方法快速的为Java项目中的某个元素进行重构。
为某些元素进行重构的前提是你必须选中他们。你可以在多个视图中选择这些元素,像大纲视图或包浏览视图。可以按住Ctrl或Shift键,在视图中选择多个元素。另外一种选择的方法是使该元素的编辑区高亮显示,或者把鼠标定位到源程序文件。在选中希望重构的元素后,可以从重构菜单的下拉项选择重构,也可以从右键单击后弹出菜单中选择重构子菜单。同时,Eclipse还提供了重构的快捷键操作。
某些重构可以应用在任意元素上,有些则只能用在特定类型的元素上,如类或方法。在本文的最后的表格中,列出了重构能够应用的元素类型,以及重构的快捷键。
在Eclipse中,所有的重构都能够在正式执行之前预览一下。在重构对话框中点击“预览”按钮,可以查看所有将要被改变的地方。唯一没有预览按钮的的重构是Pull Up,在它的重构向导中,到最后,预览面板总会出现。可以将其中的个别变化反选掉,这样这些改变就不会生效。
撤销和重做
在重构菜单中有撤销和重做项。他们和编辑菜单中的撤销重做不同。即使重构改变了很多文件,编辑菜单中的撤销重做只会更改当前文件。重构菜单中的撤销和重做则会对一次重构的所有文件进行撤销和重做操作。但是在使用时,它们有一定的限制。
重构后,无论重构改变了文件与否,如果任一个文件被另外改变而且保存了,你就无法撤销或重做这个重构。假如一个文件在重构中被修改了,然后又被编辑了,但是还没有保存,这时就会有错误信息提示,如果你想要撤销或重做该重构,必须撤销未保存的文件。
只要注意到以上的限制条件,你就可以随心所欲的对重构进行撤销或重做。你甚至能够编译,运行你的程序测试一下,然后再撤销该重构,只要你没有改变并保存任何文件。
Eclipse中的重构类型
如果你看一下Eclipse的重构菜单,可以看到四部分。第一部分是撤销和重做。其他的三部分包含Eclipse提供的三种类型的重构。
第一种类型的重构改变代码的物理结构,像Rename和Move。第二种是在类层次上改变代码结构,例如Pull Up和Push Down。第三种是改变类内部的代码,像Extract Method和Encapsulate Field。这三部分的重构列表如下。
类型1 物理结构
l Rename
l Move
l Change Method signature
l Convert Anonymous Class to Nested
l Convert Member Type to New File
类型2 类层次结构
l Push Down
l Push Up
l Extract Interface
l Generalize Type (Eclipse 3)
l User Supertype Where Possible
类型3 类内部结构
l Inline
l Extract Method
l Extract Local Variable
l Extract Constant
l Introduce Parameter
l Introduce Factory
l Encapsulate Field
Rename:
Rename用来改变一个Java元素的名字。虽然你可以手工改变Java文件Java元素的名字,但是这样不能自动更新所有引用它们的文件或Java元素。你必须在项目中搜索文件然后手工替换这些引用。很可能你就会漏掉一个或者改错一个。Rename重构会智能的更新所有有此引用的地方。
有时候,Java元素的名字不是很明了,或者它的功能已经改变了。为了保持代码的可读性,该元素的名字也要更新。使用Rename重构,能够十分快捷的更新元素的名字和所有引用它的地方。
要为一个Java元素改名,在包浏览视图或大纲视图选中该元素,从重构菜单中选择Rename项,或者使用快捷键Alt+Shift+R。Rename对话框会出现。在这里添入新的名字,选择是否更新该元素的引用。点击预览按钮,会打开预览窗口,在这里,你可以看到那些内容会被改变。点击OK按钮,重构结束。
Move
Move和Rename很相似。它用来把元素从一个位置移动到另一个位置。它主要用来将类从一个包移动到另一个包。选中要移动的元素,从重构菜单中选择Move,或者使用快捷键,Alt+Shift+V,在弹出窗口中选择要移动的目的地。你仍然可以用预览功能检查一下有什么改变,也可以按OK按钮直接让其生效。
Change Method Signature
更改方法签名能够改变参数名,参数类型,参数顺序,返回类型,以及方法的可见性。也可以添加,删除参数。
要执行此重构,选择要重构的方法,选中重构菜单的更改方法签名项,会出现更改方法签名对话框。
在此对话框中选择方法的修饰词,返回类型,参数。参数的添加,修改,移动,删除可以通过右边的按钮控制。当添加新的参数时,会自动赋予默认值。凡是调用此方法的地方都会用此默认值作为参数输入。
改变方法签名可能在方法中导致问题,如果有问题,当你点击预览或OK时,会被标记出来。
Move Members Type to New File
此重构将嵌套类转为一个单独类。将会创建一个新的Java文件包含此嵌套类。选中要重构的类,在重构菜单上选择Move Member Type to New File项,在弹出的对话框中添入要创建的实例的名字。
Push Down
此重构将算中的方法和成员从父类中移动到它的直接子类中,所有下推的方法都可选作为一个抽象方法留在父类中。下推重构对于重新构建项目设计十分有用。
选择若干方法或成员,从重构菜单中选择下推项,弹出下推对话框。
在此对话框中,可以分别选择方法或成员,所有选中元素都会移动到当前类的子类中。当点击Add Required按钮时,所有已选择元素所必需的元素也会自动选上,此行为并不能保证所有必须的元素都能自动选中,还是需要人工确认。当有方法被选中时,编辑按钮就会可用,点击编辑按钮,弹出编辑对话框。在其中可以选择为选中方法在当前类中遗留抽象方法,还是在当前类中删除这些方法。双击一天选中的方法,也可以打开编辑对话框。在方法的Action列点击,会出现一个下拉列表,可以在其中选择遗留抽象方法还是在当前类中删除方法。按回车键确认编辑结果。
Pull Up
上移与下推类似,也是在类之间移动方法和成员。上移将方法或成员从一个类移动到它的一个父类中。选中若干个方法或成员,在重构菜单中选择上移项,上移向导马上会出现。
在选择目标类多选框中,列出了当前类继承的所有父类。你只能将方法或成员移动到它们其中的一个里面。
如果在选中方法的Action列,被设置成在目标类中声明抽象方法,那么在目标类的非抽象子类中创建必须的方法选项变为可选。当它选中时,目标类的所有子类,如果它们中没有选中的方法,则会为它们创建选中的方法。
和在下推中一样,选择多个方法,点击编辑按钮,或者双击一个方法,都会打开编辑成员对话框。其中有两个选项,上移和在目标类中声明抽象方法。上移只是简单的复制方法到到父类中,并提供选择是否在当前类中删除该方法。在目标类中声明抽象方法会在父类中创建一个选中方法的抽象方法,如果父类不是抽象类则置为抽象类,最后选中方法留在当前类中。和在下推中一样,也可以点击Action列,可以在出现的下拉列表中选择。
如果方法的Action列选为上移,在下一步的向导中,将会要求你选择是否在当前类中删除这些方法,选中的方法会在当前类中被删除。
在向导的任意一步都可以按完成按钮,结束重构操作,此时按照默认规则进行重构。
Extract Interface
提炼接口可以从一个存在的类中创建一个接口。你可以选择在接口中包含着个类的那些方法。选中一个类,从重构菜单选择提炼接口项,就可以打开提炼接口对话框。
这此对话框中添入接口的名字,选择希望包含的方法,在这个列表里面只列出了公共方法。选中改变对类[当前类名]的应用为对接口的引用选择框,将把所有对当前类的引用更新为对此接口的引用。
Generalize Type
泛化类型重构可以将一个声明对象的类型改变为它的超类,选择变量,参数,对象成员,方法返回类型,然后选择重构菜单的泛化类型项。在打开的泛化类型对话框,选择希望的新类型,然后点击完成按钮,结束重构。
Use Supertype Where Possible
使用超类会将对一个特定类型的引用改变为对它的超类的引用。选择一个类,选中重构菜单的使用超类项,会打开使用超类对话框。选中希望的超类类型,点击完成按钮完成重构。重构后,instanceof 表达式也会做相应的替换。
Inline
内联是用代码或值来取代调用方法的地方,静态final对象成员,或局部变量。比如说,如果你内联一个方法调用,这个调用的地方就会被替换为该方法体。要内联一个方法,静态final对象成员,局部变量,选中这些元素,在重构菜单中选择内联项,或者使用快捷键Alt + Ctrl + I。在随后打开的内联对话框,你可以选择是否要内联所有的调用,或者是选择的调用。如果选择所有调用,你还可以选择是否删除声明本身。
分享到:
相关推荐
我们将通过一个具体的程序实例来展示Eclipse重构的几个关键步骤。 首先,Eclipse的重命名功能可以方便地更新所有相关引用,无论是方法、字段还是变量。在本例中,我们使用《Refactoring:Improving the Design of ...
描述中的链接指向了一篇关于Eclipse重构的博客文章,尽管没有具体描述,但可以推测文章可能涵盖了如何利用Eclipse的各种重构功能来优化代码。Eclipse的重构功能包括但不限于: 1. **重命名**:允许开发者更改变量、...
### 在Eclipse中实施重构 ...利用Eclipse强大的重构工具,开发者可以更高效、更准确地改善代码结构,提高代码质量和可维护性。掌握这些技巧对于任何希望提高软件开发效率的开发者来说都是必不可少的。
在本文中,我们将深入探讨如何在Eclipse集成开发环境中利用自动重构功能来优化Java代码。Eclipse的自动重构工具为开发者提供了强大的支持,包括但不限于重命名、移动方法、内联、抽取方法和更改方法特征符等功能。...
- 当遇到运行时错误时,可以利用Eclipse提供的短转储分析功能来定位问题。 4. **辅助功能**: - ADT支持多种辅助功能,如大字体显示、高对比度模式等,以适应不同用户的视觉需求。 5. **常用快捷键**: - 快速...
在Eclipse中进行重构是提升代码质量和可维护性的重要手段,它涉及到一系列的代码修改操作,但不改变程序的功能。Eclipse提供了丰富的重构工具,帮助开发者高效地进行代码优化。以下是一些主要的重构知识点: 1. **...
Eclipse 是一个强大的开源集成开发环境(IDE),最初主要用于Java语言开发,但通过插件机制,它可以支持...通过其强大的集成特性,开发者可以在同一平台上进行代码编写、构建、调试和版本控制,大大提高了开发效率。
本教程不仅提供了Eclipse的基本使用方法,还深入探讨了其高级功能,帮助开发者更全面地理解和利用Eclipse。同时,强调了持续学习和探索的重要性,鼓励开发者积极参与社区活动,以保持技能的最新性和扩展知识面。
全书共分两部分:第一部分说明了如何定制Eclipse工作空间、项目、视图和窗口,以便获得最高的效率,此外还说明了如何利用Eclipse的快速开发、导航和调试特性,最大化程序员的生产力,最优化代码的质量。第二部分完全...
全书共分两部分:第一部分说明了如何定制Eclipse工作空间、项目、视图和窗口,以便获得最高的效率,此外还说明了如何利用Eclipse的快速开发、导航和调试特性,最大化程序员的生产力,最优化代码的质量。第二部分完全...
编程技术可能包括了插件开发、工作流定制,以及如何利用Eclipse的特性提高开发效率,例如使用快捷键、代码自动完成和代码分析工具。实例部分则可能提供了具体的项目案例,比如创建一个简单的StudentSystem或...
Eclipse作为一款强大的集成开发环境(IDE),提供了丰富的代码编辑、调试、重构等功能,使得开发Java应用程序变得更加方便。 在随机点名系统中,核心功能是生成随机序列。这通常通过Java的Math类和Random类来实现。...
在代码编辑功能上,Eclipse的自动完成、代码提示、重构工具等特性极大地提高了开发效率。教材会详细介绍这些特性,并展示如何有效地利用它们来编写更高效、更易于维护的代码。同时,还会讲解如何使用Eclipse进行单元...
在Eclipse中,开发者可以直接配置JDK1.8的路径,利用Eclipse的自动补全、代码分析等功能,编写符合JDK1.8规范的代码。同时,Eclipse的调试器可以方便地进行单步调试,检查变量值,定位和修复错误。而Eclipse内置的...
- 利用Eclipse的更新管理机制来方便地进行升级和维护。 例如,Eclipse的视图(View)、透视图(Perspective)、菜单(Menu)和动作(Action)等,都是通过扩展点实现的。开发插件时,可以通过PDE来创建和测试这些...
通过合理选择和配置这些插件,开发者可以在Eclipse这个强大平台上实现高效、高质量的JavaScript开发。而"plugins"这个文件可能包含了安装这些插件的步骤或配置信息,阅读"说明.txt"文件将进一步指导用户如何在...
Eclipse是一款广泛使用的开源集成开发环境(IDE),主要面向Java开发者,但也支持其他编程语言,如C/C++、Python等。...通过深入学习和利用这份文档,可以更好地掌握Eclipse的各项功能,提升开发效率。
Eclipse是一款广受欢迎的...通过研究和利用提供的源码,开发者不仅可以了解Eclipse的内部机制,还能根据自身需求定制开发工具,提高开发效率。对于学习Eclipse和Java开发的人来说,理解和掌握这些知识点是至关重要的。
7. **高级特性与实践**:ch12可能包含更高级的主题,如使用Maven或Gradle构建系统,集成持续集成工具如Jenkins,或者利用Eclipse的插件进行复杂问题的解决和性能优化。 通过学习这些章节的源代码,读者不仅可以掌握...