2010-01-29 16 views
18

Sollen sich die Schnittstellen in Java in einem eigenen Verzeichnis befinden? Oder sollten sowohl die Schnittstelle als auch ihre Implementierung im selben Verzeichnis (Paket) platziert werden? Vielen Dank.Java Schnittstellen Verzeichnisstruktur?

+0

abhängig von der Logik für das Layout von Paketen, werde ich oft ein 'impl' Unterpaket hinzufügen, um die Implementierungen zu bezeichnen, wie: com.stackoverflow.questions, com.stackoverflow.questions.impl. – Kylar

Antwort

11

Schnittstellen benötigen nicht unbedingt ein eigenes Verzeichnis. Sie sollten dort platziert werden, wo es Sinn macht, genauso wie Klassen dort platziert werden sollten, wo sie sinnvoll sind. In vielen Fällen kann es sinnvoll sein, sie an derselben Stelle zu platzieren.

1

Gleiches Paket. Der Benutzer sollte nicht wissen oder sich darum kümmern, dass er eine Schnittstelle verwendet

+6

Ja. Die Verwendung des Präfixes "I" ist verrückt. –

+0

Der Benutzer muss wissen, ob er diese Klassen selbst instanziieren muss. – Powerlord

+2

"Gleiches Paket" beantwortet die Frage nicht. Es ist sehr üblich, einen Komponententest in demselben Paket zu haben wie die zu testende Klasse, jedoch in einem komplett anderen Verzeichnis. – SyntaxT3rr0r

14

Ein Muster, das ich gesehen habe, ist, die Schnittstellen in ein Basisverzeichnis zu setzen und dann die Implementierungen von dort in ein Unterverzeichnis zu legen.

Zum Beispiel könnte Schnittstellen gehen hier:

com.myproject.data.dao.CustomerDao (some people do ICustomerDao for interfaces, but some don't like that.) 
com.myproject.data.dao.ProductDao 

Und die Implementierungen könnten hier gehen:

com.myproject.data.dao.hibernate.HibernateCustomerDao 
com.myproject.data.dao.hibernate.HibernateProductDao 
com.myproject.data.dao.someotherorm.SomeOtherOrmCustomerDao 
etc. 

Dies könnte in einigen Situationen arbeiten, und vielleicht nicht in anderen, sondern nur etwas zu nachdenken über.

+0

danke für diese Perspektive – ken

+0

Ich habe diesen Ansatz für ein Projekt übernommen. Ich habe erkannt, dass ich wirklich nicht möchte, dass Benutzer Zugriff auf etwas anderes als die Schnittstelle haben. Aus meiner Sicht ist dies nicht möglich, wenn die Klassen in eigene Pakete aufgeteilt sind (Zugriffsebene muss öffentlich sein). Ich bevorzuge den Ansatz, den Sie gegeben haben, aber für den Fall, den ich gegeben habe, funktioniert es nicht gut. – abrarisme

0

Es ist überhaupt nicht notwendig, die Schnittstelle in demselben Verzeichnis (Paket) zu platzieren. Wenn Ihre Schnittstelle öffentlich zugänglich ist, können Sie sie überall in einem beliebigen Paket importieren.

-1

Die Frage, wie ich es gelesen habe (aber dann ist es seltsam formuliert) ist nicht, wenn die Schnittstelle in einem eigenen Verzeichnis sein sollte oder nicht. Die Frage ist, ob Sie Ihre komplette Verzeichnis Struktur neu sollte (fett Betonung, was in der Frage des Titel ist), in dem ein Zweig nur Schnittstellen enthalten würde, wie folgt aus:

pureooabstraction/ 
| 
|_com/ 
    | 
    |_example/ 
    | 
    |__SomeInterface.java 
    |__SomeOtherInterface.java 

src/ 
| 
|_com/ 
    | 
    |_example/ 
    | 
    |__SomeClass.java 
    |__... 

Wo die pureooabstraction/ Verzeichnis Struktur würde nur "reine abstrakte Klassen" enthalten (aus Sicht eines OO, nicht die 'abstrakte' Java-Definition), alias Schnittstellen in Java.

Und die kleinen Implementierungsdetails (die auf der OOA/OOD-Ebene nicht existieren), wo "Code" liegt, würden in das src/ Verzeichnis gehen.

Es macht sicherlich Sinn, wenn Ihr Entwicklungsprozess von OOA zu OOD zu OOP geht.

+0

Nein, er fragte nur, ob die Schnittstellen in dasselbe Paket wie die Implementierungen eingefügt werden sollten –

5

Da es bereits einige gute Punkte sind, ich will nur eins hinzufügen:

In einigen Projekten haben wir sogar so weit gegangen, dass wir alle Schnittstellen in einem Teilprojekt (Maven-Modul) und Implementierungen in eine andere gebracht ein. Auf diese Weise war es möglich, die Schnittstellen der Implementierungen VOLLSTÄNDIG zu trennen und das Schnittstellenprojekt sehr früh im Projekt fertigzustellen und an andere Teams, die an diesen Schnittstellen arbeiten, zu liefern. In jedem der Projekte haben wir dieselben Pakete verwendet.

Im Allgemeinen würde ich sagen, Sie sollten Schnittstellen und ihre Implementierungen trennen, der Weg ist nicht wirklich wichtig, solange Sie damit konsistent sind.

0

Wo immer Sie wollen, aber es ist absolut in Ordnung, Schnittstellen in der gleichen Paket- und Verzeichnisstruktur zu halten. Schauen Sie sich einfach die java api an. Wenn Sie eines der Pakete auswählen, werden Sie feststellen, dass viele Klassen und Interfaces enthalten sind.Einige der Schnittstellen werden von Klassen im selben Paket implementiert, andere nicht.

Ich denke, die schlimmste Praxis besteht darin, darauf zu bestehen, dass Sie ein anderes Verzeichnis für Schnittstellen haben müssen. Ich habe Verzeichnisse wie/services und/impl und andere gesehen, die nur die Verzeichnisstruktur verdorben haben. An meinem derzeitigen Arbeitsplatz beschäftigen wir viele Auftragnehmer, die kommen und gehen, und einige unserer Projekte haben mehrere Arten von Schnittstellenverzeichnissen. Die einzige Zeit, die ich denke, dass es sinnvoll ist, ein separates Verzeichnis zu verwenden, ist, wenn Sie die Schnittstellen in andere Projekte kopieren möchten, zum Beispiel für EJBs, aber auch dann können sie dasselbe Paket haben, wenn Sie ein gemeinsames Projekt für die Schnittstellen verwenden.

So kurze Antwort ist, wo immer Sie wollen, aber glaube nicht, dass Sie Ihre Klassen und Ihre Schnittstellen trennen müssen. In vielen Fällen ist es vorzuziehen, sie im selben Paket/Verzeichnis zu behalten.