2012-04-02 11 views
8

Ich schreibe einige einfache DAOs in Java mit JDBC (keine Spring, Hibernate oder irgendetwas anderes).DAO-Paketstruktur

Ist es besser, die Implementierungs-DAOs im selben Paket wie ihre Schnittstellen zu platzieren oder sie in ein Unterpaket zu packen?

Beispiel:

com.mycompany.myproject.dao.MyDao 
com.mycompany.myproject.dao.MyDaoImpl 

ODER

com.mycompany.myproject.dao.MyDao 
com.mycompany.myproject.dao.impl.MyDaoImpl 

Wenn Sie die Unterpaketstruktur vorschlagen, was würden Sie als Sub-Paketnamen vorschlagen? .impl? .sql? .jdbc?

Realistisch, ich werde nicht mehrere Implementierungen haben. Übertreibe ich das?

+0

Keine alternativen Implementierungen? Nicht mal Unit Test Mocks? –

Antwort

5

beim Entwurf neuer Anwendungen gibt es keine Standard Art und Weise in Paketen zu strukturieren, die Erfahrung ist das, was in der Regel ein jeder hilft zu entscheiden, was die entsprechenden Namen für unsere Pakete sind.

Über Paketierung Implementierungen Ihrer Schnittstellen im selben Paket oder in einem anderen nur darüber nachzudenken, wie Java selbst strukturiert ist: Normalerweise ist eine Implementierungsklasse im selben Paket wie die Schnittstelle verpackt, aber nicht immer.

Wenn Sie mehrere Implementierungen der gleichen DAO's hätten, dann wäre es sinnvoll, sie in den Unterpaketen .jdbc, .jpa oder .jdo zu strukturieren. Wenn Sie nur eine Implementierung haben, sind die beiden Optionen, die Sie aufzählen, in gewisser Weise sinnvoll (dasselbe Paket oder ein Unterpaket .impl).

In Bezug auf Über-Engineering würde ich Ihnen diese article 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 erzielen und die Entscheidung zu treffen, die in Ihrem speziellen Fall sinnvoller ist.

EDIT

Eine Anwendung hat in der Regel eine Implementierung pro DAO-Schnittstelle und das ist nicht über Engineering überhaupt, es einfach nicht sinnvoll, die gleiche DAO-Schnittstelle für JPA und für JDO umgesetzt hat . Einige der Zwecke der Verwendung der Schnittstelle/Implementierungsmuster ist es, Re-Factoring, Test mittels Mock-Objekte, etc. zu erleichtern.

PS: Ich verlasse mich normalerweise auf JDepend, um meine Anwendung Klassen in Paketen zu verteilen Zyklen wie die meisten zu vermeiden so wie ich kann.

2

Ich glaube nicht, ist auch besser, aber in diesem Fall bevorzuge ich die erste Alternative. Es wäre in Übereinstimmung mit ArrayList, LinkedList, etc., in der gleichen Packung wie List.

Bei der Verwendung von zusätzlichen Frameworks, wie hibernate bevorzuge ich die zweite Option mit MyDao und als der Implementierer.

0

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

+1

Also ist es in Ordnung, nur Ihre Pakete lange, zufällige Zeichenfolgen zu benennen? Sinnvolle Paketnamen erleichtern die Navigation durch Ihre API und erleichtern das Refactoring. Auch die Trennung von z.B. Implementierung und Schnittstelle ist eine gute Praxis in Umgebungen, in denen Exporte und Abhängigkeiten vom Paket angegeben werden, da Sie oft nur von einer Schnittstelle oder Implementierung abhängig sein wollen. –

+0

Meine Antwort war spezifisch für den Fall von OP. Es gibt keinen objektiven Unterschied zwischen seinen vorgeschlagenen Alternativen. In Bezug auf Ihren Kommentar kann ich nur sagen, dass das Erstellen eines verständlichen Namespace gesunden Menschenverstand ist. – nsfyn55

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 Over-Engineering. Es gibt mehrere Vorteile DAO verwenden:

  1. es die Qualität des Codes verbessert durch den Datenbankzugriff von anderen Überlegungen Entkopplung
  2. Testen der Code leichter gemacht und Sie können es mit einem feineren Korn testen.
  3. Wenn Sie eines Tages herausfinden, dass Hibernate tatsächlich viel einfacher für Sie ist, wird es den Rest Ihres Codes nicht beeinflussen.