??xml version="1.0" encoding="utf-8" standalone="yes"?>精品无码三级在线观看视频,中文字幕日韩欧美精品高清在线,欧美精品一区二http://www.aygfsteel.com/mengqing/zh-cnThu, 19 Jun 2025 20:39:38 GMTThu, 19 Jun 2025 20:39:38 GMT60java eclipse中的重构http://www.aygfsteel.com/mengqing/archive/2011/11/15/363795.html梦晴梦晴Tue, 15 Nov 2011 02:30:00 GMThttp://www.aygfsteel.com/mengqing/archive/2011/11/15/363795.htmlhttp://www.aygfsteel.com/mengqing/comments/363795.htmlhttp://www.aygfsteel.com/mengqing/archive/2011/11/15/363795.html#Feedback0http://www.aygfsteel.com/mengqing/comments/commentRss/363795.htmlhttp://www.aygfsteel.com/mengqing/services/trackbacks/363795.htmleclipse重构详解

博客分类Q?/span>

eclipserefactoring

重构是对软g内部l构的一U调_目的是在不改变Y件行为的前提下,提高其可理解性,降低其修Ҏ本。开发h员可以用一pd重构准则Q在不改变Y件行为的前提下,调整软g的结构?

有很多种原因Q开发h员应该重构代码,例如之前的开发h员代码写得很烂、自׃前设计时有缺陗需求变更需要添加一些新的功能或修改原有功能{等。Martin Fowler在其著名?lt;<Refactoring—Improving the Design of Existing Code>>一书中谈到了ؓ何重构的几点原因Q?

1. 重构可以改进软g设计

如果不进行重构,E序的设计会变得来糟p。通常E序员只为短期的目的Q或者在没有完全理解整体设计的时候,开始修改代码,q样E序会逐渐失去自己的结构,E序员也愈来愈难通过阅读源码理解原本设计Q相信对此每一个开发h员都深有体会?

代码l构的流失是累积性的Q愈隄Z码所代表的意思,p难保护其中的设计Q于是设计也变得越来越p糕Q经常性重构可以帮助维持设计该有的形态?

2. 重构使Y件更易被理解

很多开发h员认Z码只要能够运行v来就可以了,W者刚开始做开发的时候也是这么认为的Q也写过很多的垃圾代码,也因此吃了不苦头?

也许有些人可能会认ؓ自己可能不久׃d所在的职位Q不必在意代码的质量Q但作ؓ一个开发h员来_写出漂亮的代码是最基本的素质?

在Y件的不断修改q程中,代码的可L越来越差也是会慢慢累积的,但这不要紧,只要记得持箋重构Q就能自己的代码更Ҏ被理解?

3. 重构可以协助扑ֈBugs

对代码的理解Q可以更Ҏ扑ֈbugQ在重构的同Ӟ也能够更好的理解代码及其行ؓQ从而通过重构能够帮助开发h员写出更强壮的代码?

4. 重构可以提高~程的速度

良好的设计是快速Y件开发的ҎQ如果没有良好的设计Q也许开始的一D|间开发h员的q展q速,但是恶劣的设计很快就会开发速度慢下来。也许把旉花在调试上的旉会越来越多,修改的时间会来长Q而且q会是一个恶性的循环?
良好的设计是l持软g开发速度的根本,重构可以帮助开发h员更快速地开发YӞ因ؓ它能够阻止系l的设计变质Q能够提高代码的可读性?

使用Eclipseq行代码重构

重构是Y件开发过E中保证代码质量非常重要的手D,而手动进行重构代码的话,很容易引入一些低U错误(例如Q单词拼写错误)Q从而导致浪费大量不必要的时间。Eclipse为重构提供了很强大的支持Q很大程度上用户不必为重构的W误而再烦恼?
在Eclipse中,可以使用JDT提供的重构功能对Java目、类和其成员q行重构Q所有这些被重构的部分都可以看成一个JDT能识别的Java元素。要执行重构Q首先必选择相应重构的Java元素Q一些重构是适合MJava元素的,而一部分重构只适合特定的Java元素Q几乎所有的重构都能够在重构对话框中看到预览的效果?

要用Eclipse的重构功能,可以先选择相应的Java元素QJava工程中的资源Q包括工E、文件、方法、变量等Q,通过右键菜单选择Refactor菜单下的重构功能Q如?所C?




? 选择重构菜单


在Eclipse中,可以单的把重构分为结构性重构、类U别重构和类内部重构Q每U类型的重构又分别包含了一些具体的实现Q接下来分别介lEclipse如何对Java元素q行重构?

提示Q在JDT可识别的范围内,可以认ؓ工程中资源都是Java元素Q包括Java文g名、类、方法、变量等?

l构性重?

l构性重构涉及到JAVA元素的物理结构的改变Q包?#8220;Rename”?#8220;Move”?#8220;Change Method Signature”?#8220;Convert Anonymous Class to Nested”?#8220;Move Member Type to New File”Q下面将一一介绍q些重构在Eclipse中的实现?

1. Rename

Rename重构的功能就是重命名Java元素。虽然可以通过手动修改文g的文件名或其它Java元素的名Uͼ但这U方式不会更C此Java元素相关联的引用Q用户必L动查扑֒此Java元素相关的位|,然后q行手动修改。通过手动修改名称的方式,造成W误的可能性会太太增加。通过Eclipse提供的Rename的功能,Eclipse会自动完成更新相兛_用的操作?
当Java元素的命名不清晰或功能发生改变的ӞZ保持代码的可L,可以通过Eclipse的重构功能重命名Java元素。选择相应的Java元素Q选择右键Refactor菜单下的Rename菜单Q可以对当前选择的元素进行重命名Q在弹出的重命名对话框中修改相应的元素名U即可,例如修改一个包的重命名Q如?所C?




? Rename对话?


要修改包名的同时Q可以选择是否更新引用和更新子目录Q甚x非Java文g也可以选择性的更新。选择Preview按钮可以预览重命名重构后的效果,如图3所C?




? 预览重命名包?

可以查看预览的内Ҏ否一_认是否要进行重命名的重构。可以进行重命名的Java元素有Java目、Java文g、包、方法和属性字D늭?

提示Q非Java目和Java文g{也可以通过重构菜单的Renameq行重命名?

2. Move

Move的重构和Rename的重构类|它可以把一个Java元素从一个地方移动到另一个地方,Move的重构主要用来移动一个类C同的包下。首先选中一个Java文gQ选择Refactor菜单下的Move菜单,弹出Move的重构对话框Q如?所C?



? Move对话?


可以选择是否更新引用Q设定移动文仉构的一些参数?

提示Q也可以通过拖动的方式把一个文件从一个包Ud到另一个包Q实现移动文件的重构?

3. Change Method Signature

“Change Method Signature”重构的功能是改变Ҏ的定义,例如改变Ҏ的参数名U、类型和个数、返回值的cdQ方法的可见性以及方法的名称{?

要改变方法的定义Q可以先选择ҎQ通过右键菜单选择Refactor菜单?#8220;Change Method Signature”子菜单项Q弹?#8220;Change Method Signature”对话框,如图5所C?




? “Change Method Signature”对话?


可以通过“Change Method Signature”对话框改变方法的参数名称、类型和个数、返回值的cdQ方法的可见性以及方法名U等?

4. Convert Anonymous Class to Nested

“Convert Anonymous Class to Nested”重构的功能是把匿名类Ҏ内部c,q样同一个类的其它部分也可以׃n此类了?
例如有例E?所C的cR?

例程1 KeyListenerExample.java

public class KeyListenerExample { Display display; Shell shell; KeyListenerExample() { display = new Display(); shell = new Shell(display); shell.setSize(250, 200); shell.setText("A KeyListener Example"); Text text = new Text(shell, SWT.BORDER); text.setBounds(50, 50, 100, 20); text.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) { System.out.println("key Pressed -" + e.character); } public void keyReleased(KeyEvent e) { System.out.println("key Released -" + e.character); } }); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } public static void main(String[] args) { new KeyListenerExample(); } }

在KeyListenerExamplecL一个匿名类Q实CKeyListener接口Q可以把q个匿名cL成内部类Q首先选择匿名c,右键选择Refactor?#8220;Convert Anonymous Class to Nested”菜单Q输入内部类的名Uͼ如图6所C?




? “Convert Anonymous Class to Nested”对话?


重构后的l果是Eclipse为此创徏了一个内部类Q名UCؓTestKeyListenerQ重构后的代码如例程2所C?
例程2 重构后的KeyListenerExample.java

public class KeyListenerExample { private final class TestKeyListener implements KeyListener { public void keyPressed(KeyEvent e) { System.out.println("key Pressed -" + e.character); } public void keyReleased(KeyEvent e) { System.out.println("key Released -" + e.character); } } Display display; Shell shell; KeyListenerExample() { display = new Display(); shell = new Shell(display); shell.setSize(250, 200); shell.setText("A KeyListener Example"); Text text = new Text(shell, SWT.BORDER); text.setBounds(50, 50, 100, 20); text.addKeyListener(new TestKeyListener()); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } public static void main(String[] args) { new KeyListenerExample(); } }

也可以通过“Convert Anonymous Class to Nested”对话框定义新生成的内部类的可讉K性?

5. Move Member Type to Top Level

通过“Move Member Type to Top Level”的重构方式,可以把内部类Ҏ非内部类Qƈ且重新创Z个新的文Ӟq样其它的类可以共享此cR?

例程2创徏了一个内部类TestKeyListenerQ现在可以通过“Move Member Type to Top Level”重构的方式,把TestKeyListener攑օ一个单独的cM。首先选择TestKeyListenerc,从右键菜单Refactor中选择“Move Member Type to Top Level”Q打开“Move Member Type to Top Level”对话框,如图7所C?




? “Move Member Type to Top Level”对话?


通过上面“Move Member Type to Top Level”重构Q可以把内部cL成非内部cR?

提示Q有些时候,重构q不是一步完成的Q可以一步一步重构,例如Q首先把匿名cL成内部类Q再接着把内部类Ҏ非内部类?


cȝ别重?

cȝ别重构有如下一些:

1. Push Down

“Push Down”重构功能是把父类的方法和属性移动到所有的子类中,父类的方法可以选择性的保留抽象Ҏ。首先选择父类Q右键选择Refactor菜单?#8220;Push Down”菜单,可以通过“Push Down”对话框选择重构Q如?所C?




? “Push Down”对话?


“Push Down”重构在重新设计类的时候是非常有用的,它可以比较有较的改善cȝl承关系Q清楚定义类的行为?

2. Pull Up

“Pull Up”重构?#8220;Push Down”重构正好相反Q它的作用是把方法和属性移动到其父cM厅R选择需要重构的子类Q从右键菜单选择Refactor菜单?#8220;Pull up”菜单,通过“Pull Up”对话框进行重构,如图9所C?




? “Pull Up”对话?


提示Q?#8220;Pull Up”重构?#8220;Push Down”重构后可能会出错Q在使用此重构的同时Q应该先弄清楚某些方法中是否有引用到其它Ҏ或属性?

3. Extract Interface

“Extract Interface”重构能够从一个已存在的类中提取接口,它可以从某个cM选择ҎQ把q些Ҏ提取C个单独的接口中。选择提取接口的类Q右键选择Refactor菜单?#8220;Extract Interface”菜单,打开“Extract Interface”对话框,如图10所C?




?0 “Extract Interface”对话?


单元OK按钮Q将会提取TestInterface的接口,提取接口后,当前选择的类会实现此接口?

提示Q只有公用方法才可以被提取ؓ接口的方法?

4. Generalize Declared Type

“Generalize Declared Type”重构能够改变变量、参数、属性以及函数的q回值的cdQ可以把q些cdҎ其父cȝcd。在Refactor菜单中选择“Generalize Declared Type”Q如?1所C?




?1 “Generalize Declared Type”对话?


单击OK按钮Q能够把声明的类型改成当对话框中选择的类型?

5. User Supertype Where Possible

“User Supertype Where Possible”重构能够用某一个类的父cȝcd替换当前cȝcdQ选择需要被替换引用的类。在Refactor菜单中选择“User Supertype Where Possible”打开“User Supertype Where Possible”对话框,如图12所C?




?2 “User Supertype Where Possible”对话?


“Generalize Declared Type”重构?#8220;User Supertype Where Possible”重构在面向接口编E方面是很有用的Q可以把引用的对象尽可能用接口进行实现?

提示Q?#8220;User Supertype Where Possible”重构替换其它类中的引用Q要想看到重构的效果Q应该找到其它类引用的位|,此操作不会修改当前文件?


cd部重?

cd部重构有如下一些:

1. Inline

“Inline”重构能用函数的内Ҏ换掉函数的引用。首先选择函数的引用,在Refactor菜单中选择“Inline”打开“Inline”对话框,如图13所C?



?3 “Inline”对话?


单击定按钮QEclipse会用方法实现的部分替换引用的部分,卛_前不采用Ҏ调用的方式进行操作。也可以选择“All invocations”?#8220;Delete method declaration”QEclipse会替换掉所有引用方法的位置Qƈ且删除方法?

提示QInline会用Ҏ的实现部分替换所有调用方法的地方?

2. Extract Method

“Extract Method”重构?#8220;Inline”重构相反Q它能够从冗长的Ҏ中提取小的方法,把大的方法分解成多个方法来实现Q通过此重构能够代码看上L单漂亮,也很大程度上提高代码的复用性。可以选择要提取方法的代码Q在Refactor菜单中选择“Extract Method”打开“Extract Method”对话框,如图14所C?




?4 “Extract Method”对话?


“Extract Method”重构是非常好的重构方式,能够把大的方法体重构成多个方法的实现Q代码更清楚易懂?

提示Q?#8220;Extract Method”重构?#8220;Inline”重构是对应的Q有些时候ؓ了组l一些不合的函数Q可以先通过“Inline”的方式生成一个大的函敎ͼ再通过“Extract Method”来重构大的函敎ͼ使代码更于合理?

3. Extract Local Variable

在开发过E中Q用变量代替表辑ּ是非常好的,q样能代码更容易被理解。Eclipse中可以通过“Extract Local Variable”重构实现提取局部的表达式。首先选择表达式,在Refactor菜单中选择“Extract Local Variable”打开“Extract Local Variable”对话框,如图15所C?



?5 “Extract Local Variable”对话?


4. Extract Constant

“Extract Constant”重构?#8220;Extract Local Variable”重构cMQ它可以把表辑ּ定义为常量,另外“Extract Constant”重构能够讑֮帔R的可见性。选择表达式,在Refactor菜单中选择“Extract Constant”打开“Extract Constant”对话框,如图16所C?



?6 “Extract Constant”对话?


5. Introduce Parameter

“Introduce Parameter”重构可以通过函数中的表达式、变量或引用为函数添加新的参敎ͼq能够自动更新引用此函数的其它位|的默认参数。要惌?#8220;Introduce Parameter”重构Q可以选择表达式、变量或引用。在Refactor菜单中选择“Introduce Parameter”打开“Introduce Parameter”对话框,如图17所C?




?7 “Introduce Parameter”对话?


6. Introduce Factory

“Introduce Factory”重构能够为类创徏工厂Ҏ。首先选择需要创建工厂方法的cȝ构造函敎ͼ在Refactor菜单中选择“Introduce Factory”打开“Introduce Factory”对话框,如图18所C?




?8 “Introduce Factory”对话?


?#8220;Introduce Factory”对话框中Q可以输入工厂方法的名字Q以及工厂类QEclipse会自动Ҏ构造函数创建工厂方法?
提示Q工厂类应该已经存在Q通常可以在一个工厂类中ؓ多个兌的类创徏工厂ҎQ所以在使用“Introduce Factory”重构前,应该先创建好工厂cR?

7. Convert Local Variable to Field

“Convert Local Variable to Field”重构能够把局部的变量转换成类中的全局变量。首先选择要{换的局部变量,在Refactor菜单中选择“Convert Local Variable to Field”打开“Convert Local Variable to Field”对话框,如图19所C?




?9 “Convert Local Variable to Field”对话?


?#8220;Convert Local Variable to Field”对话框中Q还能够修改变量的名UC及变量的可见性?

8. Encapsulate Field

“Encapsulate Field”重构能够包装属性的可访问性,以及生成讉K的方法。首先选择要包装的属性,在Refactor菜单中选择“Encapsulate Field”打开“Encapsulate Field”对话框,如图20所C?




?0 “Encapsulate Field”对话?


通常通过“Encapsulate Field”可以生成get和setҎ。在“Encapsulate Field”对话框中可以输入属性的讉KҎ的名Uͼ以及Ҏ生成的位|和Ҏ的可见性?

提示Q通过右键菜单的Source菜单也能生成相应的get和setҎ?

Undo and Redo

Eclipse的自动重构功能能够很好的支持各种E序元素的重命名Qƈ自动更新相关的引用。Eclipse能够支持Ҏ、字D在cM间移动,q自动更新引用,较好地支持内联字Dc函数的更新替换Q较好地支持抽取Ҏ、变量等E序元素?

重构的过E是一个不断尝试和探烦的过E。Eclipse的重构支持撤销和重做,q且能够预览重构l果Q这些是很实用的功能。要x行撤消和重做QUndo and RedoQ的功能Q可以直接按快捷键Ctrl+Z以及Ctrl+YQ也可以选择Edit菜单的Undo和Redo操作?

提示Q虽然Eclipse寚w构提供了很强大的支持Q但是重构后代码的测试是必不可少的,而且不能指望Eclipse能够解决所有重构的问题Q有些时候手动重构还是必ȝ。自动重构的理念应该?#8220;工具辅助下的重构工作”Q但开发h员仍然承担很大一部分重构工作?/span>

 



梦晴 2011-11-15 10:30 发表评论
]]>
վ֩ģ壺 | | | | | | ϳ| | | | | | | | ˮ| | | Դ| | | | | ľ| ˳| | | | | »| ˮ| ĵ| | | | | | տ| ¡| ֦| ƽ| Ǩ|