10

以下列方式命名 DAO 是否很典型:

UserDAO - interface
UserDAOImpl - implements UserDAO

我想知道它的标准是否使用后缀“Impl”来实现,或者更有意义的东西是否是最佳实践。谢谢。

4

4 回答 4

9

这通常是我使用的。有时,如果您正在创建一个您希望其他人实现但您提供参考实现的接口,则Default前缀 like可能更有意义。DefaultUserDAO

大多数时候我觉得这两个可以互换使用,但在某些情况下,一个比另一个更清晰。

于 2010-01-31T22:00:18.187 回答
8

我见过两种约定:

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

前者源于 CORBA;后者是 Microsoft COM/.NET 约定。(感谢帕斯卡的更正。)

“不要重复 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);
}
于 2010-01-31T22:29:38.580 回答
4

首先 - 您可能并不真的需要为您的每个类创建一个 DAO 类。不要重复 DAO!文章解释了什么是通用 DAO。想知道如何命名样板代码是没有效率的。

现在,当你有一个通用的 DAO 时,你可以选择:

  • DAO(界面)
  • SessionDAOEntityManagerDAO- 用于使用SessionEntityManager

当然,只能通过接口使用 DAO。您可以轻松地在实现之间切换。

(我实际上更喜欢它小写 - Dao,虽然它是一个缩写;和Impl后缀)

于 2010-01-31T22:00:13.480 回答
1

我也是 GenericDao 和 GenericDaoImpl -convention 的粉丝,在通用帮助类的一些支持下,如果保存或删除需要一些持久类的额外操作:

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 实现,因为它在很多情况下都是非常强大的构造。

于 2010-02-02T07:48:58.673 回答