解惑

解己之惑,解人之惑

标签:Proxy

增加一个方法要修改多少个地方?

被调到新的项目组,理论上算个Team Leader,没有真正的转正,老大最开始跟我说这边的事情我可以做主,但是美国那边有个架构师开始搭了个架子,意思是在这个架子的基础上做,试了下,发现很繁琐,为了增加一个方法,得修改好多个类。这个阶段其实是个过渡阶段,以后我们会使用Web Service,所以我们哟定义Web Service的接口,然后因为是过渡阶段,所以提供了EJB2的过渡方案和原来的系统整合,所以还得改Remote接口,Local接口可以直接从Service接口extends一下就行了,然后得修改Service的实现类,加上原先的架子里面,设计的是Service里面的每个public方法对应一个Operation类,这些类设计成Command模式,方便以后可以更好的进行负载的Dispatch,就这样,给Service增加一个接口,要完全实现得至少修改3个类,增加一个类,而且前两天也提过这个项目使用的Annotation的一个好处,但是这样一来,我要实现那个接口,也得在Finder里面增加方法。最终,我得修改4个类,增加一个类来增加一个Service接口。天啊,这个是我最讨厌的。

下周打算修改这个架子,取消EJB2的临时方案,使用Dynamic Proxy实现Service,同时可以引人Transaction(这个方案原来也用了,但是架构师以Transaction的问题否决了,那个时候还没有想到怎么解决Transaction的问题,前天突然想起来我的EJB单元测试框架就是用的自定义Transaction的),同时也抛弃Finder的那个方案,因为其实我的BaseOperation已经提供了进行Hibernate的查询的方便的基础功能。最重要的是Finder中定义的Query如果有问题的话修改后不能Hot Deploy,如果在Operation的方法体里面的修改就可以Hot Deploy。这样修改后,增加一个接口只需要修改Service然后增加一个Operation类实现就行了,只要改两个地方。

使用Cglib

现在在做我的持久层,本来是打算现在就做延迟加载的,但是考虑到刚开始没有太大的必要,这个框架的定位还是快速开发,开发小型的应用,所以先完全加载,这样比较简单。不过还是先做了接口,开始使用的是JDK带的Proxy类,但是它只能创建Interface,不能扩展类,后来想到Cglib应该是做这个的,大致看了下,使用也很简单,就先写了一个简单的,目前只是延迟克隆(clone),因为我对数据库记录对应的对象只保留一个主要的,其他部分要使用,返回的是一个深度克隆的对象,现在使用Cglib返回一个增强的实例,保存了对那个数据库对象的引用,只有在对那个对象进行写操作的时候才进行真正的克隆并且把变化保存到克隆的对象,然后调用对象的save方法才会进行持久化并替换原来的对象,还不知道这样会有多大的性能提高,但是不会有太大的坏处。

© 2024 解惑

本主题由Anders Noren提供向上 ↑