我正在使用JDBC (没有Spring、Hibernate或其他任何东西)用Java编写一些简单的DAO。
将实现DAO放在与它们的接口相同的包中还是放在一个子包中更好?
示例:
com.mycompany.myproject.dao.MyDao
com.mycompany.myproject.dao.MyDaoImpl或
com.mycompany.myproject.dao.MyDao
com.mycompany.myproject.dao.impl.MyDaoImpl如果你建议的子包结构,你会建议什么作为子包的名称?.impl?.sql?.jdbc?
实际上,我不会有多个实现。我是不是过度设计了?
发布于 2012-04-03 02:09:43
在设计应用程序时,没有在包中构建结构的标准方法,经验通常会帮助每个人确定我们的包的合适名称。
关于将接口的实现打包在同一个包或不同的包中,只需考虑Java本身的结构:通常,实现类与其接口打包在同一个包中,但并不总是如此。
如果你打算使用同一DAO的多个实现,那么将它们构建在.jdbc、.jpa或.jdo子包中将是有意义的。如果只有一个实现,那么列举的两个选项在某种程度上都是有意义的(相同的包或.impl子包)。
关于过度工程,我推荐你这个article。尽管你的DAO只有一个实现,但将它们定义为接口和实现是有意义的,因为这将有助于你在潜在的未来为其他框架重写DAO,同时使用它们的代码保持不变。
最后,这取决于你(或你和你的同事)达成共识,并做出在你的特定情况下更有意义的决定。
编辑
应用程序通常每个DAO接口都有一个实现,这根本不是过度设计,让相同的DAO接口为JPA和JDO实现是没有意义的。使用接口/实现模式的一些目的是简化重构、通过模拟对象进行测试等。
附言:我通常依靠JDepend在包中分发我的应用程序类,尽可能避免周期。
发布于 2012-04-03 02:02:24
我认为两者都不是更好,但在这种情况下,我更喜欢第一种选择。它与将ArrayList、LinkedList等放在与List相同的包中是一致的。
在使用其他框架时,比如hibernate,我更喜欢使用MyDao和HibernateDao作为实现者的第二种选择。
发布于 2012-04-03 02:26:08
我会选择你的第二个选项(虽然没有一个更好),因为你可以在导入中立即看到impl是否被导入,如果你想将impl移到另一个项目中,重构会更简单。
这并不是过度的工程。使用DAO有多个优点:
https://stackoverflow.com/questions/9981277
复制相似问题