Ich schreibe ein paar einfache DAOs in Java mit JDBC (kein Spring, Hibernate oder irgendetwas anderes).
Ist es besser, die Implementierungs-DAOs im gleichen Paket wie ihre Schnittstellen zu platzieren oder sie in ein Unterpaket zu packen?
Beispiel:
%Vor%ODER
%Vor%Wenn Sie die Unterpaketstruktur vorschlagen, was würden Sie als Unterpaketnamen vorschlagen? .impl? .sql? .jdbc?
Realistisch gesehen werde ich nicht mehrere Implementierungen haben. Übertreibe ich das?
Beim Entwerfen einer Anwendung gibt es keinen Standard Weg zum Strukturieren in Paketen, Erfahrung hilft normalerweise jedem, die passenden Namen für unsere Pakete zu finden.
Über Paketierungsimplementierungen Ihrer Schnittstellen im selben Paket oder in einem anderen denken Sie einfach darüber nach, wie Java selbst strukturiert ist: Normalerweise ist eine Implementierungsklasse im gleichen Paket wie die Schnittstelle verpackt, aber nicht immer.
Wenn Sie mehrere Implementierungen der gleichen DAO's hätten, wäre es sinnvoll, sie in .jdbc
, .jpa
oder .jdo
Sub-Pakete zu strukturieren. Wenn Sie nur eine Implementierung haben, sind die beiden Optionen, die Sie aufzählen, in gewisser Weise sinnvoll (dasselbe Paket oder ein .impl
Unterpaket).
In Bezug auf Over-Engineering würde ich Ihnen diesen Artikel empfehlen . Obwohl Sie nur eine Implementierung Ihrer DAOs haben, wäre es sinnvoll, sie als Schnittstelle und Implementierung zu definieren, da dies Ihnen in einer möglichen Zukunft hilft, Ihre DAOs für andere Frameworks neu zu schreiben, während der Code verwendet wird Sie bleiben unverändert.
Am Ende liegt es an Ihnen (oder an Ihnen und Ihren Kollegen), einen Konsens zu finden und die Entscheidung zu treffen, die in Ihrem speziellen Fall sinnvoller ist.
BEARBEITEN
Eine Anwendung hat normalerweise eine Implementierung pro DAO-Schnittstelle und das ist überhaupt kein Über-Engineering, es macht einfach keinen Sinn, dieselbe DAO-Schnittstelle für JPA und für JDO zu implementieren. Einige der Zwecke der Verwendung der Schnittstelle / des Implementierungsmusters besteht darin, das Re-Factoring zu vereinfachen, das Testen mittels Mock-Objekten usw..
PS: Normalerweise verlasse ich mich auf JDepend , um meine Anwendungsklassen in Paketen zu verteilen, wobei die Zyklen möglichst vermieden werden.
Ich glaube auch nicht, dass besser ist, aber in diesem Fall bevorzuge ich die erste Alternative. Es wäre in Übereinstimmung mit ArrayList
, LinkedList
usw. im selben Paket wie List
.
Bei Verwendung von zusätzlichen Frameworks, wie zB hibernate
, bevorzuge ich die zweite Option mit MyDao
und HibernateDao
als Implementierer.
Ich würde mit Ihrer zweiten Option gehen (obwohl keine wirklich besser ist), weil Sie sofort in Ihren Importen sehen können, wenn ein Impl importiert wird und das Refactoring einfacher wäre, wenn Sie Ihr Impl in ein anderes Projekt verschieben möchten.
>Dies ist kein übermäßiges Engineering. Die Verwendung von DAO bietet mehrere Vorteile: