由于软件工程的复杂性一个大型的软件常常被切割成不同的子软件模块并由不同的团队承担假设一个大型的软件分为三个子模块 A模块底层处理类模块 B模块高层业务模块 C模块高层业务模块 A模块作为底层的模块会被B和C模块调用但因为A模块由单独的团队开发(在JBuilder中表现为单独的工程)A模块的重构仅在当前工程中进行JBuilder会记录重构轨迹并允许你通过JAR档案包含这些重构的记录当B及C模块工程通过工程类库重新引入A的JAR档案文件时可以将在A工程中的重构应用于B及C模块工程这种重构解决了关联工程间的重构问题称为分布式重构 为了演示分布式重构我们重新创建了一个新的工程common_lib开发一个DateUtils类 代码清单 DateUtils类 package common_lib; public class DateUtils { public static String getNowTime() { return +(new javautilDate()); } } 将common_lib工程打成common_libjar包输出并在myrefactor工程目录下创建一个extralib子文件夹将common_libjar拷贝到这个文件夹中在工程扩展类库中引用这个JAR包 在myrefactor中新建一个Distribute类引用common_libjar中的DateUtilsgetNowTime()其代码如下所示 代码清单 在myrefactor工程中引用common_lib工程的类 package myrefactor ; import common_libDateUtils; public class Distribute { public void printCurrTime() { Systemoutprintln(DateUtilsgetNowTime()) ; } } 过了一段时间common_lib工程的负责人对DateUtilsgetNowTime()方法名进行重构将其更名为getCurrTime()通过Refactor>Refactoring History调出Refactoring History对话框如下图所示 educitycn/img_///jpg> 图 重构历史记录 对话框中列出了当前工程所有重构历史记录也许你不希望将所有的重构都分发出去那么你可以通过Remove按钮删除那些重构记录 为了这个方法重命名重构分发到引用了工程的其他工程中需要在打包时包括重构的信息 如果common_lib工程资源树中已经有了一个打包节点仅需右击该节点在弹出菜单中选择Properties更改打包的设置即可在弹出的Properties for Archive选择Refactoring设置页如下图所示 educitycn/img_///jpg> 图 在档案文件中包含重构记录 重新打包生成common_libjar档案文件将这个档案文件覆盖<myrefactor工程目录>/extralib/common_libjar 打开myrefactorjpx工程通过Refactor>Distributed Refactorings打开Distributed Refactorings对话框切换到Pending Refactorings标签页如下图所示 educitycn/img_///jpg> 图 未决的重构列表 由于我们在common_lib工程中对DateUtils类的getNowTime()重构为getCurrTime()所以列表中仅中一条记录记录简要描述了重构的变化 注意 如果你在打开工程的同时覆盖common_libjarDistributed Refactorings对话框的Pending Refactorings标签页中并不会列出未决重构项此时你需要关闭并重启myrefactorjpx工程 在列表中选择这条未决的重构记录点击Apply应用这个重构Distribute类的调用被更改过来 代码清单 应用分式重构后的Distribute类 … public class Distribute { public void printCurrTime() { Systemoutprintln(DateUtilsgetCurrTime()) ; } } 你也可以通过ErrorInsight应用分布式的重构在工程扩展类型被的API被更改后引用到发生重构类的当前工程类的结构窗格会出现一个 图标右击这个图标在弹出的菜单中选择重构修复菜单项如这个Distribute类我们可以选择Refactor Method弹出如下的对话框 educitycn/img_///jpg> 图 通过ErrorInsight进行重构修复的对话框 点击OKJBuilder不但会在当前类中应用这个方法的重构还会在查找当前工程中其他引用这getNowTime()方法的地方一并重构 切换到 educitycn/img_///jpg> 图 的Completed Refactorings标签页中将列出所有完成的重构项 总结 有了重构就应当尽量少用替换功能了重构保证了更改的安全性和一致性有了JBuilder重构功能的支持对工程进行代码重构有如行云流水一气呵成重构不是阶段性的工作当你一发现代码队伍阵脚不齐或说闻到代码的坏味道时就应该进行重构了即使你的工程已经被其他工程当成API使用也不必担心JBuilder分布式重构的功能使开发伙伴团队只需要少许的工作就可以保持代码的一致性了 |