DAO-Paketstruktur

8

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?

    
dhalsim2 02.04.2012, 17:54
quelle

4 Antworten

5

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.

    
Alonso Dominguez 02.04.2012, 18:09
quelle
2

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.

    
Johan Sjöberg 02.04.2012 18:02
quelle
2

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:

  1. Es verbessert die Qualität Ihres Codes, indem der Datenbankzugriff von anderen Überlegungen abgekoppelt wird
  2. Das Testen Ihres Codes wird vereinfacht und Sie können ihn mit einer feineren Körnung testen.
  3. Wenn Sie eines Tages herausfinden, dass Hibernate tatsächlich viel einfacher für Sie ist, wird sich das nicht auf den Rest Ihres Codes auswirken.
Guillaume Polet 02.04.2012 18:26
quelle
0

Namespaces und Pakete sind nur vorhanden, um Kollisionen zu verhindern. Weder ist vorzuziehen, solange sie einzigartig sind.

    
nsfyn55 02.04.2012 18:25
quelle

Tags und Links