Spring-Hibernate DAO 命名规范是什么?

11

通常使用以下方式命名DAO吗:

UserDAO - interface
UserDAOImpl - implements UserDAO

我想知道在实现时是否标准使用后缀“Impl”,或者是否有更好的做法。谢谢。

4个回答

9

我见过两种惯例:

  1. 接口使用FooDao,实现使用FooDaoImpl
  2. 接口使用IFooDao,实现使用FooDao

前者的根源在于CORBA;后者是Microsoft COM/.NET的惯例。(感谢Pascal提供的更正。)

“不要重复DAO”是一个好主意。我个人认为那篇文章比它需要的复杂。有一种方法可以在查找器中不使用反射来完成,我碰巧更喜欢这种方法。如果您使用Hibernate,则可以通过示例查询来简单地完成它。接口看起来更像这样:

package persistence;

import java.io.Serializable;
import java.util.List;

public interface GenericDao<T, K extends Serializable>
{
   T find(K id);
   List<T> find();
   List<T> find(T example);
   List<T> find(String queryName, String [] paramNames, Object [] bindValues);

   K save(T instance);
   void update(T instance);
   void delete(T instance);
}

吹毛求疵:后者是微软的COM约定。 - Pascal Thivent
感谢纠正,Pascal。我对微软的所有事物都比较陌生,所以最近才通过 C# 知道了它。 - duffymo

9

一般我使用这种方式。有时,如果您正在创建一个期望他人实现但提供参考实现的接口,则像DefaultUserDAO这样的默认前缀可能更有意义。

大多数情况下,我认为这两个可以互换使用,但在某些情况下,一个比另一个提供更多的清晰度。


谢谢!把我的DAO接口放在dao包里,实现放在dao.hibernate包里(这样实现可以随后更换),这样做有意义吗? - oym

4
首先,您可能并不需要为每个类编写DAO类。 不要重复使用DAO!文章解释了什么是通用DAO。想知道如何命名样板代码并没有什么生产力。
现在,当您拥有通用DAO时,可以选择以下内容:
  • DAO(接口)
  • SessionDAOEntityManagerDAO - 用于使用SessionEntityManager
当然,只能通过接口使用DAO。 您可以轻松地在实现之间切换。
(实际上,我更喜欢小写的Dao,尽管这是一个缩写; 和Impl后缀)

1
我一直也是GenericDao和GenericDaoImpl的支持者,结合通用辅助类提供一些额外操作,以满足某些持久化类需要进行保存或删除操作的需求。
public interface PersistListener<T> {
   void onPersist(T item);
}

类似的结构也可以用于删除操作。如果您需要一种事件日志记录每个活动,但又不想使用AOP,则这尤其有用。

我的GenericDaoImpl大致如下:

public class GenericDaoImpl<T> extends HibernateTemplate {
  public void setPersistListeners(List<PersistListener> listeners) {
     this.persistListeners = new GenericInterfaceHandler( listeners, 
        PersistListener.class );
  }

  // hibernate updates the key to the object itself
  public T save(T item) {
     getSession().save( item );
     List<PersistListener<T>> listeners = this.persistListeners.getAll( item );
     for ( PersistListener<T> listener : listeners )
        listener.persist( item );
  }

  // ...
}

在上面的示例中,persistListener将查找与作为参数给定类匹配的泛型类PersistListener。如果找到,则调用委托给适当的侦听器。我的GenericInterfaceHandler也可以用于仅返回最具体的处理程序或仅针对给定类存在的处理程序。
如果您有兴趣,我还可以发布GenericInterfaceHandler实现,因为它在许多情况下都是非常强大的构造。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接