仓酷云

标题: JAVA网页设计实战Eclipse主动重构 [打印本页]

作者: 小魔女    时间: 2015-1-18 11:47
标题: JAVA网页设计实战Eclipse主动重构
再举这样一个例子:如果你想对一个数字取绝对值,你会怎么做呢?java的做法是intc=Math.abs(-166);而ruby的做法是:c=-166.abs。呵呵,这就看出了java与ruby的区别。作者用eclipse的主动重构功效对一个程序实例举行重构,目标是探究eclipse主动重构能够在多年夜水平上帮助重构这个历程。程序实例利用《Refactoring:ImprovingtheDesignofExistingCode》一书中的例子。Eclipse的主动重构功效可以很好地撑持各类程序元素的重定名,并主动更新相干的援用。Eclipse可以撑持办法、字段在类之间挪动,并主动更新援用。Eclipse较好地撑持内联字段、函数的更新交换。Eclipse较好地撑持抽取办法、变量等程序元素。重构的历程是一个不休实验和探究的历程。Eclipse的重构撑持打消和重做,而且可以预览重构了局,这些是很有用的功效。Eclipse的重定名、抽取办法、挪动、内联功效、变动办法特性符等代码布局级其余重构办法,是对照成熟同时也值得利用的功效。至于计划布局上的重构,eclipse还不克不及很好地撑持。可是作者信任,主动重构的理念应当是“工具帮助下的重构事情”,人仍旧承当年夜部分重构事情。1、准备事情本文利用《Refactoring:ImprovingtheDesignofExistingCode》一书第一章的例子。重构前的代码及每步重构后的代码见附件。读者最好共同《Refactoring:ImprovingtheDesignofExistingCode》一书浏览本文。Eclipse利用以下版本:同时安装了中文言语包。2、重构第一步:分化偏重组statement()目标:1、把statement()函数中的swich语句提炼到自力的函数amountFor()中。2、修正amountFor()参数定名重构办法:ExtractMethodRenameMethod办法:1、选中swich语句的代码块,在右键菜单当选择“重构/抽取办法”,呈现参数对话框。Eclipse主动剖析代码块中的部分变量,找到了两个部分变量:each和thisAmount。个中,each只是在代码块中被读取,但thisAmount会在代码块中被修正。依照重构ExtractMethod总结出来的划定规矩,应当把each看成抽取函数的参数、thisAmount看成抽取函数的前往值。但是Eclipse其实不做辨别,间接把这两个变量看成抽取新办法的参数,如图。我们的目标是把在抽取函数中不会被修正的each作为参数;会被修正的thisAmount作为前往值。办理的举措是,把doublethisAmount=0;这行代码移到switch语句的下面,酿成如许:doublethisAmount=0;switch(each.getMovie().getPriceCode()){caseMovie.REGULAR:thisAmount+=2;if(each.getDaysRented()>2)thisAmount+=(each.getDaysRented()-2)*1.5;break;caseMovie.NEW_RELEASE:thisAmount+=each.getDaysRented()*3;break;caseMovie.CHILDRENS:thisAmount+=1.5;if(each.getDaysRented()>3)thisAmount+=(each.getDaysRented()-3)*1.5;break;}选中这段代码,在右键菜单当选择“重构/抽取办法”,eclipse此次变得伶俐点了,如图。选择“预览”按钮事后检察重构后的了局,切合我们最后的目标。选择“断定”按钮,重构后的代码片段以下:publicStringstatement(){doubletotalAmount=0;intfrequentRenterPoints=0;Enumerationrentals=_rentals.elements();Stringresult="RentalRecordfor"+getName()+"
";while(rentals.hasMoreElements()){Rentaleach=(Rental)rentals.nextElement();doublethisAmount=amountFor(each);frequentRenterPoints++;if((each.getMovie().getPriceCode())==Movie.NEW_RELEASE&&each.getDaysRented()>1)frequentRenterPoints++;result+="        "+each.getMovie().getTitle()+"        "+String.valueOf(thisAmount)+"
";totalAmount+=thisAmount;}result+="Amountowedis"+String.valueOf(totalAmount)+"
";result+="Youearned"+String.valueOf(frequentRenterPoints)+"frequentrenterpoints";returnresult;}/***@parameach*@return*/privatedoubleamountFor(Rentaleach){doublethisAmount=0;switch(each.getMovie().getPriceCode()){caseMovie.REGULAR:thisAmount+=2;if(each.getDaysRented()>2)thisAmount+=(each.getDaysRented()-2)*1.5;break;caseMovie.NEW_RELEASE:thisAmount+=each.getDaysRented()*3;break;caseMovie.CHILDRENS:thisAmount+=1.5;if(each.getDaysRented()>3)thisAmount+=(each.getDaysRented()-3)*1.5;break;}returnthisAmount;}2、选中amountFor()的参数each,在右键菜单当选择“重构/重定名”,在对话框中输出新的称号:aRental,选择断定,amountFor()中一切each的援用全体被交换成新的称号。用一样的举措修正amountFor()中的部分变量thisAmount为result。重构后的amountFor()代码以下:/***@paramaRental*@return*/privatedoubleamountFor(RentalaRental){doubleresult=0;switch(aRental.getMovie().getPriceCode()){caseMovie.REGULAR:result+=2;if(aRental.getDaysRented()>2)result+=(aRental.getDaysRented()-2)*1.5;break;caseMovie.NEW_RELEASE:result+=aRental.getDaysRented()*3;break;caseMovie.CHILDRENS:result+=1.5;if(aRental.getDaysRented()>3)result+=(aRental.getDaysRented()-3)*1.5;break;}returnresult;}3、重构第二步:搬移“金额盘算”代码目标:1、将函数amountFor()转移到Rental类中,并改名为getCharge()。2、更新并交换一切对amountFor()的援用。重构办法:MoveMethodChangeMethodsignatrueInlineMethodInlineTemp办法:1、选中函数amountFor()的界说,在右键菜单当选择“重构/挪动”,显现参数设置对话框。把新办法名改成getCharge。按下“断定”按钮,CustomerClass中的amountFor()函数被挪动到RentalClass中,并改名为:getCharge()。同时eclipse主动在Customer的amountFor()函数中增加一行对新函数的“托付”代码:privatedoubleamountFor(RentalaRental){returnaRental.getCharge();}这行代码会发生编译毛病,缘故原由是amountFor()的private型被传送到了新的办法中:/***@paramthis*@return*/privatedoublegetCharge(){……}2、持续重构!选中getCharge()办法,在右键菜单当选择“重构/变动办法特性符”,弹出参数选择对话框,把会见润色符从private改成public。Eclipse的编译毛病提醒主动消散。3、回到Customer类,把一切对amountFor()援用的中央交换成间接对getCharge()的援用。选中Customer类的函数amountFor(RentalaRental),在右键菜单当选择“重构/内联”,呈现参数选择对话框。选择“确认”按钮,援用amountFor()的中央被交换成对getCharge()的援用。publicStringstatement(){……doublethisAmount=each.getCharge();……}4、撤除一时变量thisAmount。选中变量thisAmount,在右键菜单当选择“重构/内联”,重构预览窗口以下,可见到达了重构的目标。按下“确认”按钮重构代码。statement()代码:publicStringstatement(){doubletotalAmount=0;//总消耗金额intfrequentRenterPoints=0;//常客积点Enumerationrentals=_rentals.elements();Stringresult="RentalRecordfor"+getName()+"
";while(rentals.hasMoreElements()){Rentaleach=(Rental)rentals.nextElement();//获得一笔租借纪录//addfrequentrenterpoints(累加常客积点)frequentRenterPoints++;//addbounsforatwodaynewreleaserentalif((each.getMovie().getPriceCode())==Movie.NEW_RELEASE&&each.getDaysRented()>1)frequentRenterPoints++;//showfiguresforthisrental(显现此笔租借数据)result+="        "+each.getMovie().getTitle()+"        "+String.valueOf(each.getCharge())+"
";totalAmount+=each.getCharge();}//addfooterlines(开头打印)result+="Amountowedis"+String.valueOf(totalAmount)+"
";result+="Youearned"+String.valueOf(frequentRenterPoints)+"frequentrenterpoints";returnresult;}4、重构第三步:提炼“常客积点盘算”代码目标:提取“常客积点盘算”代码并放在Rental类中,“常客积点盘算”代码以下。publicStringstatement(){……//addfrequentrenterpointsfrequentRenterPoints++;//addbounsforatwodaynewreleaserentalif((each.getMovie().getPriceCode())==Movie.NEW_RELEASE&&each.getDaysRented()>1)frequentRenterPoints++;……}重构后的代码以下:frequentRenterPoints+=each.getFrequentRenterPoints();重构办法:ExtractMethodMoveMethodChangeMethodsignatrueInlineMethod办法:1、起首,抽代替码到自力的函数中。用“抽取办法”重构代码,函数名:getFrequentRenterPoints。很遗憾,eclipse的不克不及天生诸如:frequentRenterPoints+=getFrequentRenterPoints(RentalaRental);的代码。缘故原由是实行自增操纵的部分变量frequentRenterPoints要呈现在等式右侧,因而抽取函数getFrequentRenterPoints()必定要把frequentRenterPoints作为参数。手工修正函数和对函数的援用,重构后的代码以下:publicStringstatement(){……while(rentals.hasMoreElements()){……frequentRenterPoints+=getFrequentRenterPoints(each);……}……}/***@parameach*@return*/privateintgetFrequentRenterPoints(Rentaleach){if((each.getMovie().getPriceCode())==Movie.NEW_RELEASE&&each.getDaysRented()>1)return2;elsereturn1;}2、把getFrequentRenterPoints()挪动到Rental类中。3、对getFrequentRenterPoints()“变动办法特性符”为public。4、对Customer的函数getFrequentRenterPoints()实行内联操纵,重构方针完成。5、重构第四步:往除一时变量(totalAmount和frequentRenterPoints)目标:往除一时变量(totalAmount和frequentRenterPoints)办法:1、剖析totalAmount和frequentRenterPoints的界说和援用布局以下://声明和界说doubletotalAmount=0;intfrequentRenterPoints=0;……//在轮回中修正while(rentals.hasMoreElements()){……frequentRenterPoints+=each.getFrequentRenterPoints();……totalAmount+=each.getCharge();……}……//在轮回外利用result+="Amountowedis"+String.valueOf(totalAmount)+"
";result+="Youearned"+String.valueOf(frequentRenterPoints)+"frequentrenterpoints";……上述两个变量在轮回体表面界说和利用,在轮回中被修正,使用ReplaceTempwithQuery办法往除这两个一时变量是一项略微庞大的重构。很遗憾,eclipse今朝不撑持如许的重构。2、手工修正代码。6、重构第五步:使用多态代替与代价相干的前提逻辑目标:1、把Rental类中的函数getCharge()挪动到Movie类中。2、把Rental类中的函数getFrequentRenterPoints()挪动到Movie类中。重构办法:MoveMethodInlineMethod办法:1、选中Rental类中的函数getCharge(),右键菜单选中“重构/挪动”,eclipse提醒找不到吸收者,不克不及挪动。缘故原由在于这行语句:switch(getMovie().getPriceCode()){//获得影片出租代价选中getMovie(),右键菜单选中“重构/内联”,断定儿女码成为:switch(_movie.getPriceCode()){//获得影片出租代价选中getCharge(),实行“重构/挪动”后,函数被挪动到Movie类中。但是这只是部分告竣了重构目标,我们发明,挪动后的代码把Rental作为参数传给了getCharge(),手工修正一下,代码酿成:classMovie……/***@paramthis*@return*/publicdoublegetCharge(int_daysRented){doubleresult=0;switch(getPriceCode()){//获得影片出租代价caseMovie.REGULAR://一般片result+=2;if(_daysRented>2)result+=(_daysRented-2)*1.5;break;caseMovie.NEW_RELEASE://新片result+=_daysRented*3;break;caseMovie.CHILDRENS://儿童片result+=1.5;if(_daysRented>3)result+=(_daysRented-3)*1.5;break;}returnresult;}classRental……/***@paramthis*@return*/publicdoublegetCharge(){return_movie.getCharge(_daysRented);}2、用一样的步骤处置getFrequentRenterPoints(),重构后的代码:classMovie……/***@paramfrequentRenterPoints*@paramthis*@return*/publicintgetFrequentRenterPoints(intdaysRented){if((getPriceCode())==Movie.NEW_RELEASE&&daysRented>1)return2;elsereturn1;}classRental……/***@paramfrequentRenterPoints*@paramthis*@return*/publicintgetFrequentRenterPoints(intdaysRented){if((getPriceCode())==Movie.NEW_RELEASE&&daysRented>1)return2;elsereturn1;}7、重构第六步:终究……我们离开承继目标:对switch语句引进state形式。办法:很遗憾,不能不在这里提早停止eclipse的主动重构之旅。Eclipse几近不克不及做布局上的重构。大概MartinFowler在书中召唤的主动重构工具止于“工具帮助下的重构事情”这一理念。艺术是人类的专利,编程艺术的妄想将延续下往。感乐趣的读者能够检察手工重构的最初一步代码。将重构举行究竟!附录:eclipse撑持的重构办法(摘自eclipse中文匡助)称号功效打消实行上一次重构的“打消”。只需除重构以外还没有实行任何别的源变动,重构打消缓冲区就无效。重做实行上一次打消重构的“重做”。只需除重构以外还没有实行任何别的源变动,重构打消/重做缓冲区就无效。重定名启动“重定名”重构对话框:重定名所选择的元素,并改正对元素的一切援用(假如启用了的话)(还在别的文件中)。可用于:办法、字段、部分变量、办法参数、范例、编译单位、包、源文件夹和项目,和剖析为这些元素范例中的个中一种的文本选择部分。挪动启动“挪动”重构对话框:挪动所选择的元素,并改正对元素的一切援用(假如启用了的话)(还在别的文件中)。合用于:一个实例办法(能够将它移至某个组件)、一个或多个静态办法、静态字段、范例、编译单位、包、源文件夹和项目,和剖析为这些元素范例中的个中一种的文本选择部分。变动办法特性符启动“变动办法特性符”重构对话框。变动参数称号、参数范例和参数按次,并更新对响应办法的一切援用。别的,能够撤除或增加参数,而且能够变动办法前往范例和它的可视性。能够将此重构使用于办法或剖析为办法的文本选择。将匿名类转换为嵌套类启动“将匿名类转换为嵌套类”重构对话框。匡助您将匿名外部类转换为成员类。能够将此重构使用于匿名外部类。将嵌套范例转换成顶层启动“将嵌套范例转换为顶层范例”重构对话框。为所选成员范例创立新的Java编译单位,并依据必要更新一切援用。关于非静态成员范例,将增加字段以同意会见先前的核心实例。能够将此重构使用于成员范例或剖析为成员范例的文本。下推启动“下推”重构对话框。将一组办法和字段从一个类移至它的子类。能够将此重构使用于在统一个范例中声明的一个或多个办法和字段大概字段或办法内的文本选择。上拉启动“上拉”重构导游。将字段或办法移至其声明类的超类大概(关于办法)将办法声明为超类中的笼统类。能够将此重构使用于在统一个范例中声明的一个或多个办法、字段和成员范例,也能够使用于字段、办法或成员范例内的文本选择。抽取接口启动“抽取接口”重构对话框。利用一组办法创立新接口并使选择的类完成该接口,并尽量地将对该类的援用变动为对新接口的援用(可选)。能够将此重构使用于范例。尽量利用超范例启动“尽量利用超范例”对话框。将某个范例的呈现交换为它的个中一个超范例,在实行此交换之前,必要标识一切有大概举行此交换的地位。此重构可用于范例。内联启动“内联”重构对话框。内联部分变量、办法或常量。此重构可用于办法、静态终态字段息争析为办法、静态终态字段或部分变量的文本选择。抽取办法启动“抽取办法”重构对话框。创立一个包括以后所选择的语句或表达式的新办法,并将选择交换为对新办法的援用。可使用编纂菜单中的扩展选择至以猎取无效的选择局限。此功效关于清算冗杂、混乱或过于庞大的办法是很有效的。抽取部分变量启动“抽取变量”重构对话框。创立为以后所选择的表达式指定的新变量,并将选择交换为对新变量的援用。此重构可用于剖析为部分变量的文本选择。可使用编纂菜单中的扩展选择至以猎取无效的选择局限。抽取常量启动“抽取常量”重构对话框。从所选表达式创立静态终态字段并交换字段援用,而且能够选择重写统一表达式的别的呈现地位。此重构可用于静态终态字段息争析为静态终态字段的文本选择。将部分变量转换为字段启动“将部分变量转换为字段”重构对话框。将部分变量转换为字段。假如该变量是在创立时初始化的,则此操纵将把初始化移至新字段的声明或类的机关函数。此重构可用于剖析为部分变量的文本选择。封装字段启动“自封装字段”重构对话框。将对字段的一切援用交换为getting和setting办法。它合用于所选择的字段或剖析为字段的文本选择。代码下载张昱遐想利泰软件公司(原遐想软件计划中央)
还是要自己一点一点写代码,然后编译,改错再编译好那。还有最重要的是.net的编译环境非常好,你甚是不需要了解太多工具,对于简单的系统,你可以之了解一些语法就哦了。
作者: 乐观    时间: 2015-1-21 14:25
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
作者: 不帅    时间: 2015-1-24 12:11
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
作者: 海妖    时间: 2015-1-24 15:14
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
作者: 山那边是海    时间: 2015-1-29 22:47
是一种将安全性(Security)列为第一优先考虑的语言
作者: 变相怪杰    时间: 2015-2-3 12:45
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
作者: 飘灵儿    时间: 2015-2-5 20:03
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
作者: 小女巫    时间: 2015-2-6 14:02
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
作者: 分手快乐    时间: 2015-2-16 10:09
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
作者: 因胸联盟    时间: 2015-2-23 18:55
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
作者: 小魔女    时间: 2015-3-7 09:57
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者: 若相依    时间: 2015-3-14 18:48
Java是一种计算机编程语言,拥有跨平台、面向对java
作者: 仓酷云    时间: 2015-3-21 12:58
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
作者: 活着的死人    时间: 2015-3-25 07:47
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
作者: 第二个灵魂    时间: 2015-3-31 17:08
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
作者: 简单生活    时间: 2015-4-1 18:18
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
作者: 金色的骷髅    时间: 2015-4-10 06:33
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
作者: 兰色精灵    时间: 2015-4-12 05:54
是一种将安全性(Security)列为第一优先考虑的语言
作者: 若天明    时间: 2015-4-16 10:34
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
作者: 蒙在股里    时间: 2015-4-26 23:28
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
作者: 透明    时间: 2015-5-1 20:11
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2