Als Strohmann betrachten Sie das Paket java.util
als einen Abladeort für verschiedene Klassen, die in den meisten Fällen nichts gemeinsam haben, außer der Person, die sie dort abgelegt hat, die faul oder einfallslos war, einen semantisch korrekteren Paketnamen für ihre Klasse zu finden.
Nehmen wir als einziges Beispiel die Klasse UUID
, die ein semantisch korrekter Paketname für diese Klasse gewesen wäre.
Ich arbeite daran, meine eigene UUID
Klasse leichter zu machen. Ich möchte nicht me.myproject.util.UUID
für meinen Paketnamen verwenden.
Ich dachte darüber nach, me.myproject.rfc4122.UUID
aber das impliziert nicht die Semantik der Verwendung von UUID
.
Ich habe auch darüber nachgedacht, me.myproject.uuid.UUID
aber ich mag die Tautologie darin nicht, obwohl es in Python ein gängiger Ansatz ist, eine Klasse in ein Modul mit demselben Namen zu setzen, und packages
in Java semantisch nicht mit modules
Python identisch sind .
Ich habe es auch in Betracht gezogen, me.myproject.UUID
aber abgelehnt, weil ich diesen Teil des Namespaces nicht mit Dingen verschmutzen möchte, die nichts miteinander zu tun haben. Dies verschiebt das Problem nur um eine Stufe nach oben.
Ich habe auch darüber nachgedacht, me.myproject.lib.UUID
aber das hat keine semantischere Bedeutung als .util
und benennt das Problem einfach um.
semantics
: der Zweig der Linguistik und Logik, der sich mit Bedeutung befasst .
me.myproject.UUID
? Oderme.UUID
from me.myproject.uuid import UUID, GetUUIDInfo
sieht so etwas in Ordnung aus. Ein Modul kann mehrere exportierte Objekte enthalten.identity
oderidentifiers
erkläre ihn etwas ausführlicher, da er wahrscheinlich akzeptiert wird.Antworten:
Das Problem beim Versuch, jede Klasse in ein Paket einzufügen, das einen semantisch korrekten Namen für diese Klasse hat, besteht darin, dass es dazu führt, dass Pakete nur sehr wenige Klassen oder manchmal sogar nur eine Klasse enthalten. Dies führt wiederum zu einer Vielzahl von Paketen.
Ein pragmatischerer Ansatz für die Benennung von Paketen besteht darin, Ihnen bei der Suche nach Informationen zu helfen. Wenn Sie häufig benutzte Dinge aufbewahren, von denen Sie immer wissen, wo Sie sie finden, halten Sie sie fern und erleichtern so das Auffinden der seltener benutzten Dinge. Sie brauchen also nicht wirklich Paketnamen, die für jede der enthaltenen Klassen semantisch korrekt sind, sondern nur Paketnamen, die semantisch nicht falsch sind. Offensichtlich wurde der Paketname 'util' gemäß dieser Überlegung gewählt: Es ist nicht der semantisch korrekte Name für die enthaltenen Klassen, aber es ist auch nicht semantisch inkorrekt, und das ist gut genug.
Wenn also Ihr UUID-Typ nur für diese bestimmte Anwendung bestimmt ist (was sich aus der Tatsache ergibt, dass Sie planen, ihn unter "myproject" zu platzieren), ist er wahrscheinlich Teil Ihres "Modells" Projekt. Sie sollten bereits ein "Modell" -Paket haben, das die Menge aller Klassen enthält, die Ihren persistenten Entitäten entsprechen, von denen viele wahrscheinlich Beziehungen zwischen ihnen haben, wobei UUIDs wahrscheinlich das Mittel zur Implementierung dieser Beziehungen sind. Außerdem wissen Ihre UUIDs wahrscheinlich, wie sie sich selbst behaupten müssen, oder? Außerdem können Ihre UUIDs wahrscheinlich nur als Mitglieder Ihrer Modellentitäten gefunden werden, oder? Ihr Modellpaket ist also wahrscheinlich der beste Ort dafür.
Andernfalls muss dieser UUID-Typ als Teil eines Frameworks betrachtet werden, wenn er möglicherweise auch in anderen Projekten verwendet wird. Es kann sich also im Stammquellordner dieses Frameworks oder in einem Unterpaket "types" befinden, wie von MainMa vorgeschlagen, oder sogar in einem Unterpaket dieses Frameworks mit dem Namen "util" oder "misc". Daran ist nichts auszusetzen.
quelle
Der Zweck von Paketen besteht darin, Klassen nach bestimmten Kriterien zu gruppieren (Paket nach Typ / Layer vs. Paket nach Merkmal usw.). Ich sehe keinen Grund, ein Paket nur für eine Klasse zu erstellen - besonders wenn Sie nicht damit rechnen, dass es in Zukunft weitere Klassen in diesem Paket geben wird.
Außerdem denke ich, dass der Paketname "util" nicht völlig bedeutungslos ist - er gruppiert Klassen nur nach bestimmten Kriterien -. Für mich bedeutet die Klasse "util", dass sie nicht Teil der Domäne der Anwendung ist, aber auch nicht Teil der Framework (es hat keinen Einfluss auf die Struktur der Anwendung). Es ist im Grunde nur eine Erweiterung der (nicht) Standardbibliothek.
In diesem Fall hätte ich kein Problem damit, diese UUID-Klasse in das "util" -Paket zu setzen. Wenn es einige andere UUID-bezogene Dienstprogrammklassen gibt (z. B. eine separate Klasse zum Generieren von UUIDs), ist es einfach, das Paket "util.uuid" für diese umzugestalten und zu erstellen (es sei denn, Sie erstellen eine Bibliothek und die UUID ist Teil der offengelegten Schnittstelle , dann muss man ein bisschen "vorausschauend" sein).
quelle
Onkel Bob hat einige Richtlinien für die Trennung von Paketen.
Die ersten drei Paketprinzipien befassen sich mit dem Zusammenhalt von Paketen. Sie sagen uns, was in Paketen enthalten sein soll:
Also, Ihre Frage zu beantworten, wer / was geht verwendet die UUID - Klasse, hat es als Attribut oder invoke Operationen in ihm? Wie ist Ihr Abhängigkeitsdiagramm ? UUID wird zusammen mit welchen anderen Klassen verwendet ?
Je nach Ihrer Antwort, vielleicht sollten Sie nennen es das me.myproject.identity Paket, das me.myproject.serialization Paket, me.myproject. DTO oder noch etwas ganz anderes. Vielleicht sollte die UUID-Klasse mit Ihren Modellen zusammengehalten werden und Sie werden sie in ein Paket packen , das Sie bereits haben, wie z . B. me.myproject.models .
quelle
dto
ist ungefähr so semantisch nutzlos wielib
oderutils
, das gesamtedto
Konzept ist ein naivesmodel
Zunächst scheint mir UUID (mit Großbuchstaben) eine sehr schlechte Idee für den Paketnamen oder Klassennamen zu sein, da bei allen Stilen, die auf die eine oder andere Weise erzwungen werden, alle Großbuchstaben den "Konstanten" zugeordnet sind. Pakete sind dazu gedacht, Dinge zu organisieren. Der einfachste Weg, ein Paket zu benennen, ist der Wert der Klassen, die es enthält:
com.example.identifier
.com.example.uuid
.Halten Sie die IT einfach
quelle
java.util.UUID
,java.net.URL
,java.util.zip.CRC32
etc.java.util.zip.GZIPOutputStream
Klasse?GZIP
steht für ...? there is also a
java.util.zip.ZipOutputStream`UUID
wird auch in Großbuchstaben geschrieben.