分享

关于java重构/复用思想浅尝

 Go_Ahead 2012-02-03
Java应用开发中,代码的重用得到了越来越多的工程师的重视,其中一个重要的原因在于对某些代码的重用能够使程序变得更加简练,清晰和易于维护,节约软件开发的成本和提高软件生产的效率,同时还能够增加代码的可靠性和增强被重用代码与系统的其它部分具有较强的一致性
----------------------------------------------------------------------------------------------------------------------------------------------------
Java也接触了两年了,第一年算是学习编码,认识与它相关的语言,工具啊!
第二年,也参与了几个小型项目,也算遇到贵人了吧,总算对Java,编程有了一点新的认识,但这总是认识,谈起实际操作来还是很2。。。
这一年学到不少,如果再勤快点可以收获更多,所以阿,新一年我一再要求自己不要太lazy了,多动点脑,动点手或许自己可以更加柳暗花明。
参与项目,感到最珍贵的就是对重构又那么点认识,也就是从正式做第一个模块时,做完以后在我的team leader 的帮助下,从整了一下我的代码,这时,我对自己写的重复代码才开始知道要提取出来,〈〈重构〉〉。代码重构,如果是高层次技术人员,他可能通过分析后面的业务及本身所用的技术架构特点,做一个比较前沿的规划,预计,知道那些方面可以共用哪段代码,而不用每个地方都去写这个方法,避免造成很多重复代码。但这也并不表示他们在后面真正实践的过程中不新添或做一些修改调整的工作。而像我这样的初级编码员,我可能站不了那么高层次看问题,那么就需要在基本完成模块的时候再全面浏览一遍代码,把能够复用/重构的代码提取出来,让大家共用一个方法就ok,这个可能需要多花费一点时间。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
通常我们在java应用开发的过程中往往会将项目中经常出现的一些功能相同的代码进行必要的管理,这里呢就会涉及到代码重用。那么在实际应用开发过程中究竟怎样做才能更有效的进行代码重用呢?
代码重用的策略
a.面向接口编程
在java程序设计过程中,实现代码重用的一个非常重要的策略就是面向接口编程。接口中它规定了实现本接口的类或接口必须拥有的一组规则,它(在一定粒度视图上)同类事物的抽象表示。而面向接口编程就是使用接口和同类型的组件进行通讯。在实际的程序设计中就是从那些具有相同功能组件中抽象出来的一个接口或一个抽象类。这样,当需要其它组件完成任务时,只需要替换该接口的实现,而不需要改变程序代码的其它部分。
具体开发实践中,从以下两个方面来使用接口:一是把参数类型改称接口,二是尽量选择最简单的参数接口类型<这个在以后的工作中有待进一步理解及验证>,下面具体看一下怎么描述的:[这两个总的来说是同一种形式,都是要把参数类型换成接口,放松对参数的要求]
1)所谓把参数类型改成接口,在java语言里,如果某个方法的所有参数都是对一些已知接口的引用(即这个方法的所有参数都是接口类型),那么这个方法就能操作哪些实际上可能还没有实现该接口的类的对象。在实际的编程中,只要能够把它所有类形式的参数改为接口形式,那么方法的参数就可以是实现了该接口的所有类的对象,而不仅仅是原来的类所创建的对象。这样,该方法就能够对可能存在大量的对象类型进行操作。看下面的例子----->
static public boolean contains (Rectangle rect, int x, int y){....}
将rect参数的类型Rectangle类变成接口类型:
public interface Rectangular {Rectangle getBounds();}
那么所有实现了Rectangular接口的类所创建的对象都可以作为提供给contains函数的rect参数,这样显然提高了代码的重用性。这种通过放宽参数类型的限制,即把方法的参数类型改成接口是实现代码可重用性的一个很好的方法。
2)选择最简单的参数接口类型
在把参数类型改为接口类型时,可能存在多种实施方案,那么我们要选择一个最优的方法,应该是描述参数对象要求的接口越简单,其他类实现该接口的机会就越大,其对象能够作为参数使用的类也越多。例子如下:
 static public boolean areOverlapping (Window window1, Window window2){.....}   这个方法用于检测两个窗口是否重叠。如果这个方法只要求从参数获得两个窗口的矩形坐标,此时相应的简化这两个参数是一种更好的选择:
static public boolean areOverlapping (Rectangular rect1, Rectangular rect2){....}
上面的代码假定Window类型实现了Rectangular接口。经过改动之后,对于任何矩形对象都可以重用该方法。
b.代码分离
由于java面向对象的特点,继承的方法当然也能实现代码的重用,但它并不是最理想的方法(由继承的缺点造成)。因此,在实际编程中,我们通常将继承与代码分离技术相结合来实现代码的重用。而所谓代码分离就是将可变的部分和不可变的部分分离开来,它是面向对象设计的一个重要原则。在通过继承实现代码重用的时候,可以在抽象基类中定义好不可变的部分,而由其子类去具体实现可变的部分,这样,不可变的部分就不需要重复定义,也便于维护。举例,在项目中体现的----〉
 public class RangeCheck{
        private int rangeCheckId;
        private String rangeCheckNo;
        private Calendar rangeCheckDate;
        private String rangeCheckBy;
        //下面是多个类中都会有的属性
        String createdBy = null;
        Calendar createdDate = null;
        String updatedBy = null;
        Calendar updatedDate = null;
        String createdSource = null;
 }
 
public class OffShelfLabel {
         private int offShelfLabelId;
         private String location;
         private String locationDesc;
         private int itemId;
         private String itemNo;
 
         //共用的属性
         String createdBy = null;
        Calendar createdDate = null;
        String updatedBy = null;
        Calendar updatedDate = null;
        String createdSource = null;
}
上面的两个类中,原本我可以就这样定义,但是如果这样的类多了,那么那些共同属性将在每一个类中都要定义一遍,这样我们就可以用到上面所述的方法,通过代码分离和继承把不可变的与可变的分开,可以这样做:
public class BaseVO{ 
         String createdBy = null;
         Calendar createdDate = null;
         String updatedBy = null;
         Calendar updatedDate = null;
         String createdSource = null;
}//把每个类中不会变得属性提取出来,然后由他们具体的类来继承这个类
 public class RangeCheck extends BaseVO{
        private int rangeCheckId;
        private String rangeCheckNo;
        private Calendar rangeCheckDate;
        private String rangeCheckBy;
 }
 
public class OffShelfLabel  extends BaseVO{
         private int offShelfLabelId;
         private String location;
         private String locationDesc;
         private int itemId;
         private String itemNo;
}
这样写,我们就只用写一次公共属性,实现共用。
c.改写类的实例方法
 待续.....
 
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
除了以上之外,今天继续,受感悟如此之深,怎能不记录记录呢?
下面是我的项目<Saturn>中的关于页面部分,学习我的同事的,他做的非常好。我一直在想怎样重构,可是他做的这一点我确实没有想过,我的懒惰造成的啊.....我接触项目这么长时间我竟然没有想到这样做,过失过失!!!
 这个项目呢采用的什么ejb架构,还用jboss做服务器,以前也没有接触过这种的,项目从我接手已经做了两三年了,因此了我算是一个维护者,项目整体架构挺大的,至始至终没有弄明白它是怎样跑起来的<终究还是自己太懒了>,还真是悲哀啊~不过呢今天这一点是一定不允许错过的:
我的项目是ejb架构,但这个项目并不像我们想象中的那么重量型,虽然对技术方面我是菜鸟,我没有什么大的发言权,但也有资历深的人说项目存在很大的漏洞。项目中页面部分,其实页面风格大都相同,每个页面中有很多地方要写重复代码,因此呢我才来的时候也就是拷贝,粘贴,也没有往深的地方挖掘(项目页面主要用yui),想着重复就让他重复,反正每个页面都是这样的,其实我错了....
 这里暂时添加不了附件,如果可以添加附件,就好了,可以对照着看。。。。
我的项目中很多jsp里面都有这样功能,[列表中复选框,删除,给某一列添加可链接功能,让列表中某一列可编辑<包括单纯的文本框,弹出时间选择器,单选/复选按钮.....>,分页]这些功能基本是用同一代码,因此可以考虑提取出来。
 
//自我认为,java的重构是一定离不开java的几大特性的:
封装/继承/多态 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多