Semantisch geeigneterer Paketname als "util" für die folgenden Dinge?

18

Als Strohmann betrachten Sie das Paket java.utilals 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 UUIDKlasse leichter zu machen. Ich möchte nicht me.myproject.util.UUIDfür meinen Paketnamen verwenden.

Ich dachte darüber nach, me.myproject.rfc4122.UUIDaber das impliziert nicht die Semantik der Verwendung von UUID.

Ich habe auch darüber nachgedacht, me.myproject.uuid.UUIDaber 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 packagesin Java semantisch nicht mit modulesPython identisch sind .

Ich habe es auch in Betracht gezogen, me.myproject.UUIDaber 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.UUIDaber das hat keine semantischere Bedeutung als .utilund benennt das Problem einfach um.

semantics: der Zweig der Linguistik und Logik, der sich mit Bedeutung befasst .


quelle
Wie wäre es me.myproject.UUID? Oderme.UUID
Robert Harvey
Für mich from me.myproject.uuid import UUID, GetUUIDInfosieht so etwas in Ordnung aus. Ein Modul kann mehrere exportierte Objekte enthalten.
9000,
2
JXTA hat ein 'ID'-Paket für Dinge, die mit IDs zu tun haben.
Greg-449,
@ greg-449 - Ich neige zu Ihrem Vorschlag identityoder identifierserkläre ihn etwas ausführlicher, da er wahrscheinlich akzeptiert wird.

Antworten:

11

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.

Mike Nakis
quelle
2
Bitte versuchen Sie, Kommentare in Antworten einzuschränken, die den Nutzen der Antwort nicht wirklich erhöhen. Der Kommentarbereich ist für solche Haftungsausschlüsse reserviert. Vielen Dank.
maple_shaft
1

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).

qbd
quelle
1
Das ist mein Ansatz. Es macht keinen Sinn, ein Paket zu erstellen, das keinen klaren Zweck hat. Wenn eine Klasse nicht einfach einem sinnvollen Paket zugeordnet werden kann, ist 'util' in Ordnung und wird vielleicht sogar bevorzugt. Normalerweise passiert im Laufe der Zeit, dass genügend Klassen in util landen, die miteinander verwandt sind, und dass es einfach ist, sie aus util (zumindest während der Entwicklung) in sinnvolle Pakete umzuwandeln. Wenn Sie versucht haben, eindeutige Pakete für jede Klasse zu erstellen, von denen Sie nicht wissen, wohin sie führt, können Sie diese Beziehungen und die Möglichkeit einer Umgestaltung in eine sauberere Architektur leicht verpassen.
Dunk
@Dunk, das ist eigentlich ein sehr guter Punkt - das vorzeitige Erstellen einer künstlichen Paketstruktur verhindert, dass Sie eine bessere, natürlichere Organisation auf dem Weg sehen.
qbd
1

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:

  1. Das Granulat der Wiederverwendung ist das Granulat der Freisetzung
  2. Klassen, die sich gemeinsam ändern, werden zusammen gepackt
  3. Klassen, die zusammen verwendet werden, werden zusammen gepackt

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 .

Hbas
quelle
1
dtoist ungefähr so ​​semantisch nutzlos wie liboder utils, das gesamte dtoKonzept ist ein naives model
Wir wissen nicht genug über Ihr Projekt, um Ihnen weitere nützliche Namen zu nennen
Hbas
-2

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:

  • Sie können beispielsweise festlegen, dass die Klassen nach ihrem Geschäftswert getrennt werden com.example.identifier.
  • oder zum Beispiel nach ihrem technischen Wert com.example.uuid.

Halten Sie die IT einfach

Tiberiu C.
quelle
2
Beispiele für ALLCAPS Klassen in Java: java.util.UUID, java.net.URL, java.util.zip.CRC32etc.
scriptin
@scriptin Wäre es für einen Entwickler nicht einfacher, wenn er eine Klasse von "Konstante", ein Mitglied von einem Paketnamen und so weiter nur von der Großschreibung unterscheiden könnte? Warum ist CRC32, UUID Ihrer Meinung nach ein guter Name für eine Klasse, nur weil Java es getan hat? Oder weil es ein Akronym für "Universally Unique Identifier" oder "Cyclic Redundancy Check" ist ... aber warte ein bisschen! Was ist mit dieser java.util.zip.GZIPOutputStreamKlasse? GZIPsteht für ... ? there is also a java.util.zip.ZipOutputStream`
Tiberiu C.
1
Klassen sind Typen, Konstanten sind Werte, es gibt keine Verwirrung. Ich denke nicht, dass diese Namen gut oder schlecht sind, ich weise nur darauf hin, dass (Codierungs-) Stile, von denen Sie sprechen, Klassen nicht zwingen, Kleinbuchstaben zu haben. In PythonUUID wird auch in Großbuchstaben geschrieben.
Skript
Wenn Sie jeden Tag / mantain-Code sehen, macht der Stil den Unterschied zwischen einer "einfach zu lesenden" und einer "hin und zurück und vor" -Festa aus. Ich denke, das ist wertvoller, um es auszudrücken Die Großbuchstaben, der Typ des Members (Klasse, Konstante, Paket usw.) als die Tatsache, dass es sich um ein Akronym handelt.
Tiberiu C.
1
Die ursprüngliche Frage hatte nichts damit zu tun, welche Groß- / Kleinschreibung beim Schreiben des Paketnamens zu verwenden ist. Semantisch unterscheidet sich UUID nicht von Uuid, uuid, UuId, UuID oder einem anderen willkürlichen Kapitalisierungsschema, das Sie für "am besten" halten.
Brandin