2011-01-13 68 views
2

我有两个数据访问对象,这些对象是反向生成的并且被我的应用程序使用。它们代表非常相似的表格。一张桌子有另外几列。由于面向业务的数据库所有权问题,这超出了我的控制范围。删除不带接口的复制/粘贴代码

该应用程序目前有两个对这些DAO进行操作的存储库实现。这些实现非常相似。其中有一些额外的操作对应于第二个DAO上的额外列。然而,除了少数几个例外,其中一个实现是另一个的复制和粘贴。实现数百行。

所以我想删除复制/粘贴作业。理想情况下,我可以在DAO前面添加一个接口,然后使用抽象类来保存共享代码(几乎所有代码)。但是,我无法在DAO之前放置一个接口。记住它们是反向生成的,如果不升级我们的ORM软件,我不认为这是一个合理的选择(Kodo 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

你可以发布一个简单的\淡化代码示例? – javamonkey79 2011-01-13 01:18:14

回答

2

我假设你有超过复制代码一些控制。如果您的代码生成器正在生成所有代码,那么您需要在其配置API &中搜索解决方案。

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

+0

那么,问题是代码只能“读取”几乎相同。从技术上讲,它运行在不同的类别上。我在你的文章后面添加了一个例子,我认为它稍微清理了一下。 – emulcahy 2011-01-13 01:53:18