irgendwo beantwortet: einen Blick auf Onkel Bobs Nehmen
Package Design Principles
Er erklärt Gründe und Motivationen hinter diesen Grundsätzen.
EDIT: Ich hatte die ursprüngliche Antwort mehr als 2 Jahre zurück. Aber hat sich nicht geändert, weil es akzeptiert wurde. Aber ändern Sie es so, dass jeder neue Besucher davon profitieren kann und Link-Verrottung vermieden wird, wie von @bPraktik vorgeschlagen.
Klassen, die wiederverwendet werden, sollten zusammen verpackt werden, damit das Paket als eine Art vollständiges Produkt für Sie behandelt werden kann. Und diejenigen, die zusammen wiederverwendet werden, sollten von denen getrennt werden, die nicht wiederverwendet werden. Zum Beispiel werden Ihre Logging-Dienstprogrammklassen nicht unbedingt zusammen mit Ihren Dateiklassen verwendet. So verpacken Sie alle, die sie getrennt notieren. Protokollierungsklassen könnten jedoch miteinander verwandt sein. So erstellen Sie eine Art komplettes Produkt für die Protokollierung, sagen wir, für den Mangel an besseren Namen Commons-Logging-Paket es in einem (wiederverwendbaren Glas) und ein anderes separates komplettes Produkt für io Dienstprogramme, wieder für den Mangel an besseren Namen, sagen Gemeingüter- io.jar. Wenn Sie die Commons-io-Bibliothek aktualisieren, um Support-Java-NIO zu sagen, müssen Sie möglicherweise nicht unbedingt Änderungen an der Protokollierungsbibliothek vornehmen. Also ist es besser, sie zu trennen.
Nehmen wir an, Sie möchten, dass Ihre Logging-Utility-Klassen eine strukturierte Protokollierung unterstützen, z. B. eine Art Log-Analyse durch Tools wie Splunk. Einige Clients Ihres Protokollierungsdienstprogramms möchten möglicherweise auf Ihre neuere Version aktualisieren. einige andere nicht. Wenn Sie eine neue Version veröffentlichen, packen Sie alle benötigten Klassen zusammen und verwenden Sie sie zur Migration erneut. So können einige Clients Ihrer Utility-Klassen Ihr altes commons-logging jar löschen und in commons-logging-new jar wechseln. Einige andere Clients sind immer noch in Ordnung mit älteren jar. Es werden jedoch keine Clients benötigt, um diese beiden JAR-Dateien (neu und alt) zu haben, nur weil Sie sie gezwungen haben, einige Klassen für ältere gepackte JAR-Dateien zu verwenden.
Vermeiden Sie zyklische Abhängigkeiten. a hängen von b ab; b auf c; c auf d; aber d hängt von a ab. Das Szenario ist offensichtlich abschreckend, da es sehr schwierig sein wird, Schichten oder Module usw. zu definieren, und Sie können diese nicht unabhängig voneinander variieren.
Sie könnten Ihre Klassen auch so paketieren, dass sich bei Änderung einer Ebene oder eines Moduls andere Module oder Ebenen nicht unbedingt ändern müssen. Wenn Sie zum Beispiel von einem alten MVC-Framework zu einem Rest-API-Upgrade wechseln, müssen möglicherweise nur die Ansicht und der Controller geändert werden. Dein Modell nicht.
Gut verbundener Artikel, aber bitte aktualisieren Sie diese Antwort, um Link-Rot zu vermeiden. – bPratik
@bPratik aktualisiert. – Atul