Соглашение об именовании Spring-Hibernate? - PullRequest
8 голосов
/ 01 февраля 2010

Можно ли назвать DAO следующим образом:

UserDAO - interface
UserDAOImpl - implements UserDAO

Мне интересно, является ли стандартным использование суффикса «Impl» для реализации или что-то более значимое является лучшей практикой. Спасибо.

Ответы [ 4 ]

8 голосов
/ 01 февраля 2010

Я видел два соглашения:

  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);
}
7 голосов
/ 01 февраля 2010

Это обычно то, что я использую. Иногда префикс Default , такой как DefaultUserDAO, может иметь больше смысла, если вы создаете интерфейс, который, как вы ожидаете, будут реализовывать другие, но вы предоставляете эталонную реализацию.

Большую часть времени я чувствую, что эти два можно использовать взаимозаменяемо, но в некоторых ситуациях одно обеспечивает немного большую ясность, чем другое.

4 голосов
/ 01 февраля 2010

Прежде всего - вам может не понадобиться класс DAO для каждого из ваших классов. Не повторяйте DAO! * В статье 1002 * объясняется, что такое универсальный DAO. Хотите знать, как назвать шаблонный код не является продуктивным.

Теперь, когда у вас есть общий DAO, вы можете пойти на:

  • DAO (интерфейс)
  • SessionDAO и EntityManagerDAO - для использования Session или EntityManager

И, конечно, использовать DAO только по интерфейсу. Вы можете легко переключаться между реализациями.

(я на самом деле предпочитаю его в нижнем регистре - Dao, хотя это сокращение; и суффикс Impl)

1 голос
/ 02 февраля 2010

Я также был поклонником соглашений 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, так как это довольно мощная конструкция во многих случаях.

...