Das ist im Allgemeinen, was ich benutze. Manchmal macht das Präfix Standard wie DefaultUserDAO
mehr Sinn, wenn Sie eine Schnittstelle erstellen, von der Sie erwarten, dass sie implementiert wird, aber Sie stellen die Referenzimplementierung bereit.
Meistens fühle ich, dass diese zwei austauschbar verwendet werden können, aber in manchen Situationen liefert man ein wenig mehr Klarheit als die anderen.
Es gibt zwei Konventionen, die ich gesehen habe:
Ersteres hat seine Wurzeln in CORBA; Letzteres ist eine Microsoft COM / .NET-Konvention. (Danke an Pascal für die Korrektur.)
"Wiederhole das DAO nicht" ist eine gute Idee. Ich persönlich finde diesen Artikel komplexer als nötig. Es gibt einen Weg, es ohne Reflexion in Findern zu tun, die ich bevorzuge. Wenn Sie Hibernate verwenden, kann die Abfrage anhand eines Beispiels eine gute Möglichkeit sein, dies einfach zu tun. Die Schnittstelle würde eher so aussehen:
%Vor%Zuallererst - Sie brauchen möglicherweise nicht wirklich eine DAO-Klasse für jede Ihrer Klassen. Wiederhole nicht den DAO! -Artikel erklärt, was ein generisches DAO ist. Sich darüber zu wundern, wie man einen Standardcode benennt, ist nicht produktiv.
Wenn Sie nun ein generisches DAO haben, können Sie Folgendes tun:
DAO
(Schnittstelle) SessionDAO
und EntityManagerDAO
- für die Verwendung von Session
oder EntityManager
Und natürlich, verwenden Sie das DAO nur über die Schnittstelle. Sie können problemlos zwischen Implementierungen wechseln.
(Ich bevorzuge es eigentlich in der unteren Hälfte - Dao
, obwohl es eine Abkürzung ist und das Impl
Suffix)
Ich war auch Fan von GenericDao und GenericDaoImpl-convention mit etwas Unterstützung von generischen Hilfsklassen, falls das Speichern oder Löschen zusätzliche Aktionen für einige persistente Klassen erfordern würde:
%Vor%Ähnliche Konstrukte können auch zum Löschen verwendet werden. Dies ist besonders nützlich, wenn Sie eine Art von Ereignisprotokoll zum Schreiben jeder Aktivität benötigen und AOP nicht dafür verwenden möchten.
Mein GenericDaoImpl würde etwa so aussehen:
%Vor%Was der persistListener im obigen Beispiel tut, ist einen PersistListener mit einer generischen Klasse zu finden, die zu der Klasse passt, die als Parameter angegeben wurde. Ist dies der Fall, wird der Anruf an die richtigen Zuhörer delegiert. Mein GenericInterfaceHandler kann auch verwendet werden, um nur den spezifischsten Handler oder den einzigen Handler für die gegebene Klasse zurückzugeben, falls vorhanden.
Wenn Sie interessiert sind, könnte ich die GenericInterfaceHandler-Implementierung auch posten, da sie bei vielen Gelegenheiten recht mächtig ist.