【问题标题】:Removing copy/pasted code without an interface在没有界面的情况下删除复制/粘贴的代码
【发布时间】:2011-06-08 05:35:30
【问题描述】:

我有两个反向生成的数据访问对象,它们被 jar'ed 以供我的应用程序使用。它们代表非常相似的表。一个表比另一个表有一些额外的列。由于面向业务的数据库所有权问题,这超出了我的控制范围。

应用程序当前有两个在这些 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
}

【问题讨论】:

  • 你能发布一个简单\淡化的代码示例吗?

标签: java


【解决方案1】:

我假设您对重复的代码有一定的控制权。如果您的代码生成器正在生成所有这些,我怀疑您需要在其 API 和配置中搜索解决方案。

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

【讨论】:

  • 好吧,问题在于代码几乎相同地“读取”。从技术上讲,它在不同的类上运行。我在您的帖子之后添加了一个示例,我认为它有点清楚。
  • 听起来你想要的是 Duck Typing。我不会假装知道如何在 java 中做到这一点,但看起来这里有一个可靠的讨论:stackoverflow.com/questions/4330330/…
猜你喜欢
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多