删除没有接口的复制/粘贴代码

时间:2011-01-13 01:15:55

标签: java

我有两个数据访问对象,这些对象是反向生成的,并且可以由我的应用程序使用。它们代表非常相似的表格。一个表比另一个表有一些额外的列。由于面向业务的数据库所有权问题,这是我无法控制的。

应用程序当前有两个在这些DAO上运行的存储库实现。实现非常相似。一个有一些额外的操作,对应于第二个DAO上的额外列。但是,除了少数例外,一个实现是另一个的复制和粘贴。这些实现长达数百行。

所以我想删除复制/粘贴作业。理想情况下,我可以只是坚持一个接口在DAO的面前,那么也许使用抽象类来保存共享代码(几乎所有的话)。但是,我不能在DAO前放置一个接口。记住自己是逆向生成,无需升级我们的ORM软件,我不认为这是一个合理的选择(科多兽3.x中,我相信,这个变化是不是在范围内)。

我能想到的唯一的事情甚至会工作的一些龌龊与反思,但导致一些更糟糕的,比我现在有。

任何聪明的解决方案?

编辑:这是一个非常淡化的代码示例

package one.dao
//reverse generated
class UserDao {
    getFirstName(..);
    setFirstName(..);
    getLastName(..);
    .... 50 more just like this
}

package two.dao
//reverse generated
class UserDao {
    getFirstName(..);
    setFirstName(..);
    getLastName(..);
    .... the same 50 more as above

    getSomethingElse(..); //doesn't exist in one.dao.UserDao
    setSomethingElse(..); //doesn't exist in one.dao.UserDao
}

class RepositoryOne(one.dao.UserDao userDao) {
    //insert code here. perform operations on nearly all methods, lots of code
}

class RepositoryTwo(two.dao.UserDao userDao) {  
    //insert code here. same as Repository one

    //some extra code that isn't above, maybe 10 lines
}

1 个答案:

答案 0 :(得分:2)

我假设您可以控制重复的代码。如果您的代码生成器正在生成所有代码生成器,那么您需要在其API和API中搜索解决方案。配置,我怀疑。

当继承不起作用时,请尝试合成。创建第三个类来保存共享代码(SharedCode)。为两个现有类中的每一个提供SharedCode类的私有成员实例,并使在SharedCode中实现的所有例程通过方法传递给成员实例。