DAO包结构

时间:2012-04-02 17:54:41

标签: java dao

我正在使用JDBC(没有Spring,Hibernate或其他任何东西)在Java中编写一些简单的DAO。

将实现DAO放在与其接口相同的包中还是将它们放在子包中更好?

示例:

com.mycompany.myproject.dao.MyDao
com.mycompany.myproject.dao.MyDaoImpl

OR

com.mycompany.myproject.dao.MyDao
com.mycompany.myproject.dao.impl.MyDaoImpl

如果你建议子包结构,你会建议什么作为子包名? .impl? .SQL? .jdbc?

实际上,我不会有多个实现。我是否过度设计了这个?

5 个答案:

答案 0 :(得分:5)

在设计应用程序时,在包中没有标准结构化方法,经验通常可以帮助每个人确定我们的包的适当名称。

关于在同一个包或不同的包中打包接口的实现,只需考虑Java本身的结构:通常一个实现类打包在与其接口相同的包中,但并不是所有时间。

如果您将要使用相同DAO的多个实现,那么在.jdbc.jpa.jdo子包中构建它们是有意义的。如果你只有一个实现,你枚举的两个选项都有某种意义(相同的包或.impl子包)。

关于过度工程,我会建议你article。即使您只有一个DAO的实现,将它们定义为接口和实现也是有意义的,因为这将有助于您在将来使用的代码重写其他框架的DAO。他们保持不变。

最后,由您(或您和您的同行)达成共识,并在您的具体案例中做出更有意义的决定。

修改

应用程序通常每个DAO接口都有一个实现,而且根本不会过度工程,为JPA和JDO实现相同的DAO接口是没有意义的。使用接口/实现模式的一些目的是为了简化重新分解,通过模拟对象进行测试等。

P.S。:我通常依靠JDepend将我的应用程序类分发到软件包中,尽可能避免循环。

答案 1 :(得分:2)

我不认为更好,但在这种情况下,我更喜欢第一种选择。它与ArrayListLinkedList等在与List相同的包中符合。

使用其他框架时,例如hibernate我更喜欢使用MyDaoHibernateDao作为实现者的第二个选项。

答案 2 :(得分:2)

我会选择你的第二个选项(虽然没有一个更好),因为你可以在你的导入中立即看到导入的impl,如果你想在另一个项目中移动你的impl,重构会更简单。

这不是过度工程。使用DAO有很多好处:

  1. 通过将数据库访问与其他注意事项分离来提高代码质量
  2. 测试代码变得更容易,您可以用更精细的粒度进行测试。
  3. 如果有一天,你发现Hibernate实际上对你来说更容易,它不会影响你的其余代码。

答案 3 :(得分:0)

仅存在命名空间和包以防止冲突。只要它们是独一无二的,它们都不是优选的。

答案 4 :(得分:0)

软件包的目的之一是提高团队中其他程序员的可读性。通常,我将实现与接口放在同一包中,因为这是显而易见的地方,并且在大多数情况下,DAO实现很简单。如果您的实现很复杂,那么您应该找到适合您的应用程序的框架。

考虑使用单独程序包的其他原因包括:如果您正在编写将由其他组使用的库,或者是否要支持多种实现。