Ich habe vor einiger Zeit darüber nachgedacht und es ist kürzlich wieder aufgetaucht, als mein Shop seine erste echte Java-Web-App macht.
Als Intro sehe ich zwei Hauptstrategien zur Benennung von Paketen. (Um klar zu sein, ich beziehe mich nicht auf den gesamten Teil von 'domain.company.project', ich spreche über die Paketkonvention darunter.) Wie auch immer, die Paketbenennungskonventionen, die ich sehe, lauten wie folgt:
Funktional: Benennen Sie Ihre Pakete architektonisch nach ihrer Funktion und nicht nach ihrer Identität gemäß der Geschäftsdomäne. Ein anderer Begriff hierfür könnte die Benennung nach "Schicht" sein. Sie hätten also ein * .ui-Paket und ein * .domain-Paket und ein * .orm-Paket. Ihre Pakete sind eher horizontale als vertikale Scheiben.
Dies ist weitaus häufiger als die logische Benennung. Tatsächlich glaube ich nicht, dass ich jemals ein Projekt gesehen oder gehört habe, das dies tut. Das macht mich natürlich misstrauisch (so als würde ich denken, dass Sie eine Lösung für ein NP-Problem gefunden haben), da ich nicht besonders schlau bin und davon ausgehe, dass jeder gute Gründe haben muss, es so zu machen, wie er es tut. Auf der anderen Seite bin ich nicht gegen Leute, die nur den Elefanten im Raum vermissen, und ich habe noch nie ein Argument dafür gehört , wie man Pakete so benennt. Es scheint nur der De-facto-Standard zu sein.
Logisch: Benennen Sie Ihre Pakete nach ihrer Geschäftsdomänenidentität und fügen Sie jede Klasse, die mit diesem vertikalen Funktionsbereich zu tun hat, in dieses Paket ein.
Ich habe das noch nie gesehen oder gehört, wie ich bereits erwähnt habe, aber es macht für mich eine Menge Sinn.
Ich nähere mich eher vertikalen als horizontalen Systemen. Ich möchte das Auftragsabwicklungssystem entwickeln, nicht die Datenzugriffsschicht. Natürlich besteht eine gute Chance, dass ich bei der Entwicklung dieses Systems die Datenzugriffsschicht berühre, aber der Punkt ist, dass ich das nicht so sehe. Dies bedeutet natürlich, dass es schön wäre, wenn ich einen Änderungsauftrag erhalte oder eine neue Funktion implementieren möchte, nicht in einer Reihe von Paketen herumfischen zu müssen, um alle zugehörigen Klassen zu finden. Stattdessen schaue ich einfach in das X-Paket, weil das, was ich tue, mit X zu tun hat.
Unter Entwicklungsgesichtspunkten sehe ich es als großen Vorteil an, dass Ihre Pakete eher Ihre Geschäftsdomäne als Ihre Architektur dokumentieren. Ich bin der Meinung, dass die Domäne fast immer der Teil des Systems ist, der schwieriger zu erfassen ist, da die Architektur des Systems, insbesondere zu diesem Zeitpunkt, in seiner Implementierung fast banal wird. Die Tatsache, dass ich mit dieser Art von Namenskonvention zu einem System kommen kann und sofort aus der Benennung der Pakete weiß, dass es sich um Bestellungen, Kunden, Unternehmen, Produkte usw. handelt, scheint verdammt praktisch.
Dies scheint es Ihnen zu ermöglichen, die Zugriffsmodifikatoren von Java besser zu nutzen. Auf diese Weise können Sie Schnittstellen in Subsystemen viel sauberer definieren als in Schichten des Systems. Wenn Sie also ein Auftragssubsystem haben, das transparent persistent sein soll, können Sie theoretisch nie etwas anderes wissen lassen, dass es persistent ist, indem Sie keine öffentlichen Schnittstellen zu seinen Persistenzklassen in der Dao-Schicht erstellen und stattdessen die Dao-Klasse in packen müssen mit nur den Klassen, mit denen es sich befasst. Wenn Sie diese Funktionalität verfügbar machen möchten, können Sie natürlich eine Schnittstelle dafür bereitstellen oder sie öffentlich machen. Es scheint nur so, als ob Sie viel davon verlieren, wenn Sie einen vertikalen Teil der Funktionen Ihres Systems auf mehrere Pakete verteilen.
Ich nehme an, ein Nachteil, den ich sehen kann, ist, dass es das Herausreißen von Schichten etwas schwieriger macht. Anstatt nur ein Paket zu löschen oder umzubenennen und dann ein neues mit einer alternativen Technologie zu entfernen, müssen Sie alle Klassen in allen Paketen ändern. Ich sehe jedoch nicht, dass dies eine große Sache ist. Es mag an mangelnder Erfahrung liegen, aber ich muss mir vorstellen, dass die Häufigkeit, mit der Sie Technologien austauschen, im Vergleich zu der Häufigkeit, mit der Sie vertikale Feature-Slices in Ihrem System bearbeiten, verblasst.
Ich denke also, die Frage würde dann an Sie gehen, wie benennen Sie Ihre Pakete und warum? Bitte haben Sie Verständnis dafür, dass ich nicht unbedingt denke, dass ich hier auf die goldene Gans oder so gestoßen bin. Ich bin ziemlich neu in all dem mit größtenteils akademischer Erfahrung. Ich kann jedoch die Löcher in meiner Argumentation nicht erkennen, also hoffe ich, dass Sie alle es können, damit ich weitermachen kann.