我正在使用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?
实际上,我不会有多个实现。我是否过度设计了这个?
答案 0 :(得分:5)
在设计应用程序时,在包中没有标准结构化方法,经验通常可以帮助每个人确定我们的包的适当名称。
关于在同一个包或不同的包中打包接口的实现,只需考虑Java本身的结构:通常一个实现类打包在与其接口相同的包中,但并不是所有时间。
如果您将要使用相同DAO的多个实现,那么在.jdbc
,.jpa
或.jdo
子包中构建它们是有意义的。如果你只有一个实现,你枚举的两个选项都有某种意义(相同的包或.impl
子包)。
关于过度工程,我会建议你article。即使您只有一个DAO的实现,将它们定义为接口和实现也是有意义的,因为这将有助于您在将来使用的代码重写其他框架的DAO。他们保持不变。
最后,由您(或您和您的同行)达成共识,并在您的具体案例中做出更有意义的决定。
修改强>
应用程序通常每个DAO接口都有一个实现,而且根本不会过度工程,为JPA和JDO实现相同的DAO接口是没有意义的。使用接口/实现模式的一些目的是为了简化重新分解,通过模拟对象进行测试等。
P.S。:我通常依靠JDepend将我的应用程序类分发到软件包中,尽可能避免循环。
答案 1 :(得分:2)
我不认为更好,但在这种情况下,我更喜欢第一种选择。它与ArrayList
,LinkedList
等在与List
相同的包中符合。
使用其他框架时,例如hibernate
我更喜欢使用MyDao
和HibernateDao
作为实现者的第二个选项。
答案 2 :(得分:2)
我会选择你的第二个选项(虽然没有一个更好),因为你可以在你的导入中立即看到导入的impl,如果你想在另一个项目中移动你的impl,重构会更简单。
这不是过度工程。使用DAO有很多好处:
答案 3 :(得分:0)
仅存在命名空间和包以防止冲突。只要它们是独一无二的,它们都不是优选的。
答案 4 :(得分:0)
软件包的目的之一是提高团队中其他程序员的可读性。通常,我将实现与接口放在同一包中,因为这是显而易见的地方,并且在大多数情况下,DAO实现很简单。如果您的实现很复杂,那么您应该找到适合您的应用程序的框架。
考虑使用单独程序包的其他原因包括:如果您正在编写将由其他组使用的库,或者是否要支持多种实现。