【问题标题】:Patterns to remove duplicated code删除重复代码的模式
【发布时间】:2013-03-26 19:12:46
【问题描述】:

我一直在从事的一个 Java 项目与多个 RDBMS 集成。对我们来说,减少处理它们的方式之间的代码重复的最明显方法是创建一个类型层次结构,如下所示:

               ThirdPartySoftware (superclass)
                      /|\
                     / | \
                 TPS1  2  3

但是,这种方法最终导致 TPS1、TPS2 和 TPS3 的实现非常相似(但不完全是!)。如果超类本质上没有意识到每个地方可能会有所不同,就很难将所有功能都拉入超类,击败封装子类意味着要收买我们。

我们考虑过的一种方法是通过它们共享的特性来表示 DB,例如“支持特性 X”和“不能执行特性 Y”,但代码最终是否更易于维护尚不完全清楚那样是因为:

  1. 许多怪癖只适用于一个数据库。
  2. 我们想不出足够多的共享/可比较(基本上是可抽象的)特性来让这变得有价值。

是否有人对我们可以减少子类之间的代码重复的方法有其他建议,也许可以使用设计模式?

【问题讨论】:

  • 如果没有可以抽象出来的代码,那我说你只需要写出来。对于可以抽象出来的功能,也许mixins 会起作用。
  • Scala 在特性方面做得很好。围绕 stackoverflow,一些人提出了 Java 中的 mixins/traits 实现,例如 here 或 here
  • 只是一个想法 - 为什么不使用 hibernate 或其他 ORM 框架。
  • 我对这个问题的措辞有点含糊,但我们正在对数据库和底层数据库文件执行管理操作,而不是在其中存储对象,所以很遗憾在这种情况下 ORM 对我们没有帮助。

标签: java oop design-patterns code-duplication


【解决方案1】:

http://en.wikipedia.org/wiki/Bridge_pattern

只针对您的情况,但无论如何,找出 API 是什么是您的工作。

或许,org.hibernate.dialect.Dialect 会给你一些新的想法。

【讨论】:

    【解决方案2】:

    我不是 Java 人,但除了超类/抽象类之外,您还可以使用接口和 dependency injection 以及 repository pattern。这些模式不是唯一的,我经常有接口实现是主类的子类,例如

    SqlDataAccess:BaseDataAccess、IDataAccess 和 TPSDataAccess:SqlDataAccess、ITPSDataAccess

    【讨论】:

      猜你喜欢
      • 2011-04-12
      • 1970-01-01
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多