Verwenden von Paketen (Edelsteine, Eier usw.), um entkoppelte Architekturen zu erstellen

10

Das Hauptproblem

Sehen die gute Unterstützung modernsten Programmierplattformen für das Paketmanagement haben (denken gem, npm, pip, usw.), macht es Sinn, eine Anwendung oder ein System zu entwerfen , der intern entwickelten Paketen zusammengesetzt werden, um zu fördern und eine lose gekoppelte Architektur zu schaffen?

Beispiel

Ein Beispiel hierfür wäre das Erstellen von Paketen für den Datenbankzugriff sowie für die Authentifizierung und andere Komponenten des Systems. Diese verwenden natürlich auch externe Pakete. Anschließend importiert und verwendet Ihr System diese Pakete, anstatt ihren Code in seine eigene Codebasis aufzunehmen.

Überlegungen

Mir scheint, dies würde die Codeentkopplung fördern und die Wartbarkeit verbessern, fast auf eine Art webbasierte oder Desktop-Anwendung (Aktualisierungen werden fast automatisch angewendet, einzelne Codebasis für einzelne Funktionen usw.).

Scheint dies ein rationales und vernünftiges Designkonzept zu sein? Wird dies heute tatsächlich als Standard für die Strukturierung von Anwendungen verwendet?

Juan Carlos Coto
quelle

Antworten:

12

Ich habe in Projekten wie dies jetzt zweimal (beide mit nuget mit .NET) beteiligt, und ich würde sagen , dass unter dem Strich ist es eine gute Idee. Ihr Kilometerstand kann jedoch variieren.

Denken Sie keine Minute lang, dass es ein Allheilmittel ist, dass es alle Ihre Probleme lösen wird, ohne neue zu verursachen. Das Release-Management wird eine völlig neue Komplexitätsebene erhalten, Sie müssen sich mit Versionsabhängigkeitsproblemen befassen, von denen Sie nie gewusst haben, dass sie existieren, und Sie werden Zeiten haben, in denen Sie die Entscheidung verfluchen, weil Sie aufgrund von a vier verschiedene Pakete aktualisieren müssen kleiner Fehler, den Sie schnell beheben und beheben müssen.

Auf der anderen Seite haben Sie Recht, dass es die Dinge gut entkoppelt. Wenn Sie es nicht übertreiben, werden Sie wahrscheinlich mehr Gelegenheiten finden, wenn Sie denken "Oh, das hat gut geklappt", als "das hat viel Aufwand verursacht". Wenn Sie Code für mehrere Anwendungen freigegeben haben, ist dies besonders effektiv, da Sie Ihre Apps problemlos unabhängig voneinander aktualisieren können.

Und wenn Sie so etwas wie ich sind, werden Sie schnell Test-Apps schreiben, die Ihre Pakete verwenden, um ganze Anwendungsebenen aus Ihrem Fehlerfindungsprozess zu entfernen. Und das allein kann die Kosten mehr als wert sein.

pdr
quelle
Wunderbare Eingabe. Im Allgemeinen sollten alle Dinge ausgewogen sein, und mir gefällt, wie Ihr Kommentar in diesen Zeilen bleibt. Es ist schön zu hören, dass Sie denken, dass es in mehr als allen Fällen gut funktioniert ... und das Auftreten von Problemen ist sowieso eine Konstante. Ich liebe deinen Tipp zum Testen von Apps :). +1.
Juan Carlos Coto
1
Ich würde hinzufügen, dass es viele Projekte gibt, die dies auch in der * nix-Welt tun. Sie haben oft Bibliotheken von Front-End von GUI von Entwicklungsressourcen usw. getrennt
David Cowden
Interessant. Es klingt nach einer guten Art, ein komplexes System zu organisieren, aber ich hatte Angst, dass es sich um eine Überentwicklung handelt. Es sieht so aus, als ob es nicht mit Vorsicht angewendet werden sollte. Vielen Dank!
Juan Carlos Coto
3

Alles in allem ist dies eine gute Idee. Sie müssen darüber nachdenken, ein internes Paket-Repository einzurichten (in der Java-Welt normalerweise als "Artefakt-Repository" oder in der Python-Welt als "Pypi-Server" bezeichnet), damit Sie dort die Pakete behalten, die Sie nicht wollen oder können. t als Open Source veröffentlichen.

Wie @pdr bemerkt hat, sollten Sie darauf vorbereitet sein, Ihre eigene Abhängigkeitshölle zu haben , in der eine Änderung an einem Paket zuerst eine weitere Änderung in einem anderen Paket erfordert. Dies bedeutet, dass Sie nicht nur eine Codezeile ändern, sondern sie testen und möglicherweise die Änderungen akzeptieren müssen. Erstellen einer Version und Hochladen der Version in das oben genannte Paket-Repository. Und dann ändern, was Sie ändern wollten .

Das einzige Rezept, das ich Ihnen aus meiner Erfahrung geben kann, um dies zu minimieren: Verlassen Sie sich nicht nur darauf, gemeinsame Konzepte aus Ihren Paketen in ein "gemeinsames" oder "Framework" -Paket zu abstrahieren . Dies kann sehr objektiv erscheinen, führt jedoch zu einem Monsterpaket, das häufige, möglicherweise widersprüchliche Änderungen und Veröffentlichungen erfordert. Denken Sie viel besser über die Funktionen in Ihrem System nach und erstellen Sie für jede einzelne ein Hilfspaket, wie Sie in Ihrer Frage dargelegt haben.

Abgesehen davon besteht der Hauptvorteil darin, dass Ihre Apps von (vielen) Abhängigkeiten isoliert sind, sodass Sie sie problemlos austauschen können.

logc
quelle
Hervorragender Tipp. Ich habe ein commonPaket nicht als Option in Betracht gezogen , aber wie Sie sagen, könnte ich sehen, dass es in Zukunft eine "vernünftige" Entscheidung wird. Meine Absicht war eher die von Komponenten als von Code - daher sollten Sie im Idealfall nicht zu viele Codeteile haben, die dasselbe in verschiedenen Paketen tun, weil sie unterschiedliche Dinge tun sollen. Ich würde vermuten, dass diese Art der Wiederholung bei Gemeinsamkeiten zwischen Paketen nicht gegen gute Programmierprinzipien verstoßen würde, da die Projekte per Definition getrennt sind.
Juan Carlos Coto