服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

jbuilder2005实现重构之分布式重构


  由于软件工程的复杂性,一个大型的软件常常被切割成不同的子软件模块,并由不同的团队承担。假设一个大型的软件分为三个子模块:
  
  a模块:底层处理类模块。
  
  b模块:高层业务模块1。
  
  c模块:高层业务模块2。
  
  a模块作为底层的模块,会被b和c模块调用,但因为a模块由单独的团队开发(在jbuilder中表现为单独的工程),a模块的重构仅在当前工程中进行。jbuilder会记录重构轨迹,并允许你通过jar档案包含这些重构的记录,当b及c模块工程通过工程类库重新引入a的jar档案文件时,可以将在a工程中的重构应用于b及c模块工程。这种重构,解决了关联工程间的重构问题,称为分布式重构。
  
  为了演示分布式重构,我们重新创建了一个新的工程common_lib,开发一个dateutils类:
  
  代码清单 21 dateutils类
  
  1. package common_lib;
  2. public class dateutils {
  3.  public static string getnowtime()
  4.  {
  5.   return ""+(new java.util.date());
  6.  }
  7. }
  
  将common_lib工程打成common_lib.jar包输出,并在myrefactor工程目录下创建一个extralib子文件夹,将common_lib.jar拷贝到这个文件夹中,在工程扩展类库中引用这个jar包。
  
  在myrefactor中新建一个distribute类,引用common_lib.jar中的dateutils.getnowtime(),其代码如下所示:
  
  代码清单 22 在myrefactor工程中引用common_lib工程的类
  
  1. package myrefactor ;
  2. import common_lib.dateutils;
  3. public class distribute
  4. {
  5.  public void printcurrtime()
  6.  {
  7.   system.out.println(dateutils.getnowtime()) ;
  8.  }
  9. }
  
  过了一段时间,common_lib工程的负责人对dateutils.getnowtime()方法名进行重构,将其更名为getcurrtime()。通过refactor->refactoring history...调出refactoring history对话框,如下图所示:
   jbuilder2005实现重构之分布式重构(图一)
  图 30 重构历史记录
  
  对话框中列出了当前工程所有重构历史记录,也许你不希望将所有的重构都分发出去,那么你可以通过remove按钮删除那些重构记录。
  
  为了这个方法重命名重构分发到引用了工程的其他工程中,需要在打包时包括重构的信息。
  
  如果common_lib工程资源树中已经有了一个打包节点,仅需右击该节点在弹出菜单中选择properties更改打包的设置即可,在弹出的properties for ‘archive’选择refactoring设置页,如下图所示:
   jbuilder2005实现重构之分布式重构(图二)
  图 31
  
  在档案文件中包含重构记录
  
  重新打包生成common_lib.jar档案文件,将这个档案文件覆盖<myrefactor工程目录>/extralib/common_lib.jar。
  
  打开myrefactor.jpx工程,通过refactor->distributed refactorings...打开distributed refactorings对话框,切换到pending refactorings标签页,如下图所示:
   jbuilder2005实现重构之分布式重构(图三)
  图 32 未决的重构列表
  
  由于我们在common_lib工程中对dateutils类的getnowtime()重构为getcurrtime(),所以列表中仅中一条记录,记录简要描述了重构的变化。
  
  注意:
  
  如果你在打开工程的同时覆盖common_lib.jar,distributed refactorings对话框的pending refactorings标签页中并不会列出未决重构项,此时,你需要关闭并重启myrefactor.jpx工程。
  
  在列表中选择这条未决的重构记录,点击apply应用这个重构,distribute类的调用被更改过来:
  
  代码清单 23 应用分式重构后的distribute类
  
  1. …
  2. public class distribute
  3. {
  4.  public void printcurrtime()
  5.  {
  6.   system.out.println(dateutils.getcurrtime()) ;
  7.  }
  8. }
  
  你也可以通过errorinsight应用分布式的重构:在工程扩展类型被的api被更改后,引用到发生重构类的当前工程类的结构窗格会出现一个 图标,右击这个图标,在弹出的菜单中选择重构修复菜单项,如这个distribute类,我们可以选择refactor method,弹出如下的对话框:
   jbuilder2005实现重构之分布式重构(图四)
  图 33 通过errorinsight进行重构修复的对话框
  
  点击ok,jbuilder不但会在当前类中应用这个方法的重构,还会在查找当前工程中其他引用这getnowtime()方法的地方,一并重构。
  
  切换到
  jbuilder2005实现重构之分布式重构(图五)
  图 32的completed refactorings标签页中将列出所有完成的重构项。
  
  总结
  
  有了重构,就应当尽量少用替换功能了,重构保证了更改的安全性和一致性。有了jbuilder重构功能的支持,对工程进行代码重构有如行云流水,一气呵成。重构不是阶段性的工作,当你一发现代码队伍阵脚不齐,或说闻到代码的坏味道时,就应该进行重构了。即使你的工程已经被其他工程当成api使用,也不必担心,jbuilder分布式重构的功能使开发伙伴团队只需要少许的工作,就可以保持代码的一致性了。

扫描关注微信公众号