Wenige große Bibliotheken oder viele kleine Bibliotheken?

9

Im Laufe einiger Monate habe ich einen kleinen Rahmen für die Spieleentwicklung geschaffen, den ich derzeit in alle meine Projekte einbeziehe.

Das Framework hängt von SFML, LUA, JSONcpp und anderen Bibliotheken ab. Es befasst sich mit Audio, Grafik, Networking, Threading; Es verfügt über einige nützliche Dateisystem-Dienstprogramme und LUA-Wrapping-Funktionen. Außerdem gibt es viele nützliche "zufällige" Dienstprogrammmethoden, z. B. Hilfsprogramme zum Parsen von Zeichenfolgen und mathematische Dienstprogramme.

Die meisten meiner Projekte verwenden alle diese Funktionen, aber nicht alle:

  • Ich habe einen automatischen Updater, der nur das Dateisystem und die Netzwerkfunktionen nutzt
  • Ich habe ein Spiel ohne Netzwerkfähigkeiten
  • Ich habe ein Projekt, das JSONcpp nicht benötigt
  • Ich habe ein Projekt, das nur diese String / Math-Utils benötigt

Dies bedeutet, dass ich die gemeinsam genutzten Bibliotheken SFML / LUA / JSON in jedes Projekt einbeziehen muss, auch wenn sie nicht verwendet werden. Die Projekte (unkomprimiert) haben auf diese Weise eine Größe von mindestens 10 MB, von denen die meisten nicht verwendet werden.

Die Alternative wäre die Aufteilung des Frameworks in viele kleinere Bibliotheken, was meiner Meinung nach viel effektiver und eleganter wäre, aber auch die Kosten für die Wartung von mehr DLL-Dateien und -Projekten verursachen würde.

Ich müsste mein Framework in viele kleinere Bibliotheken aufteilen:

  • Grafik
  • Einfädeln
  • Vernetzung
  • Dateisystem
  • Kleinere Utensilien
  • JSONcpp-Dienstprogramme
  • LUA-Utensilien

Ist das die beste Lösung?

Vittorio Romeo
quelle
1
Denken Sie daran, dass Sie in der Lage sein sollten, ein gerichtetes Diagramm Ihrer Abhängigkeiten zu erstellen. Wenn einige Ihrer Module von Modulen abhängen, die von ihnen abhängen, fragen Sie nur nach Problemen. Wenn Sie dies nicht so strukturieren können, dass die Abhängigkeiten nicht zirkulär sind, sollten Sie sich nicht damit anlegen.
Bobson
Es hängt auch davon ab, wie Ihre Programmierung und die damit verbundene Programmierumgebung Bibliotheken und verwandte Konzepte wie Bibliotheken, Pakete, Namespace und
dergleichen verwalten
Für mich ist eine Bibliothek nur ein Versandbehälter - es kommt auf die Größe und die Abhängigkeiten (und äußeren Abhängigkeiten) der Kisten an, die sich innerhalb befinden. Solange Sie die einzelnen Kisten (z. B. Objektdateien) als eigenständige funktionierende Teile ohne unnötige Abhängigkeiten entwerfen, sind beide Möglichkeiten in Ordnung.
Tofro

Antworten:

14

Ich würde persönlich für viele kleine Bibliotheken gehen.

  • Verhindert, dass Entwickler Abhängigkeiten zwischen ansonsten nicht verwandten Paketen erstellen.
  • Kleinere, besser verwaltbare Bibliotheken, die viel fokussierter sind.
  • Einfachere Trennung und separate Teams verwalten jede Bibliothek.
  • Sobald Sie eine neue Anforderung haben, die ausreichend komplex ist, ist es besser, ein neues Modul hinzuzufügen, als eine vorhandene Bibliothek zu finden, in die der neue Code eingefügt werden kann. Kleine Bibliotheken unterstützen dieses Muster.
pswg
quelle
Insgesamt stimme ich zu, obwohl ich Fälle gesehen habe, in denen der Ansatz der kleinen Bibliothek nicht gut verwaltet wurde und außer Kontrolle geriet. In einem Projekt hatte jede Bibliothek einen halb duplizierten Datenzugriffsschichtcode. Zum anderen gab es zu viele abhängige Beziehungen zwischen Bibliotheken.
Jfrankcarr
@jfrankcarr Richtig, eine schlechte Codeverwaltung kann sich auf jedes Projekt auswirken. Meiner Meinung nach sind Projekte mit monolithischen Bibliotheken anfälliger als Projekte mit kleinen „Mikrobibliotheken“.
pswg
Nur eine Randnotiz - SFML selbst ist in mehrere Module unterteilt, sodass Sie keine Verknüpfung zu z. B. einem Netzwerkmodul herstellen müssen, wenn Ihr Spiel nur für Einzelspieler gedacht ist.
Sjaustirni
4

Sie haben eine Seite des Kompromisses angegeben, aber nicht die andere. Ohne einen "fairen und ausgewogenen" Druck, unter dem Sie arbeiten, können wir es Ihnen unmöglich sagen.

Sie sagen, dass durch das Aufteilen der Bibliotheken alle Ihre Projekte kleiner werden. Das ist ein klares Plus. Ich kann mir verschiedene Minuspunkte vorstellen:

  • Das Aufteilen der Bibliotheken ist an sich schon ein Aufwand, auch wenn es nur einmal durchgeführt werden muss.
  • Das konsistente Verwalten von Versionen vieler Bibliotheken ist ein kleiner, aber anhaltender zusätzlicher Aufwand.
  • Es ist nicht so einfach, sicher zu sein, dass jedes Projekt tatsächlich die Dinge bündelt, die es benötigt
  • Das Aufteilen ist möglicherweise nicht so sauber möglich, wie Sie derzeit glauben, und führt zusätzliche Arbeit ein, gefährdet möglicherweise sogar die konzeptionelle Integrität einiger Module.

Je nachdem, wie wahrscheinlich / wichtig solche Gegenargumente für Sie sind, kann die Aufteilung die richtige Wahl für Sie sein oder auch nicht. (Beachten Sie, dass die Dichotomie zwischen "Splittern" und "Lumpern" von vielen als grundlegendes Persönlichkeitsmerkmal angesehen wird, das überhaupt nicht logisch ist!)

Die verschiedenen Aufgaben, die Ihre Module ausführen, sind jedoch so weit voneinander entfernt, dass ich zumindest eine Aufteilung in Betracht ziehen würde , die wahrscheinlich erforderlich ist.

Kilian Foth
quelle
2

Es gibt keine eindeutige Antwort. Der beste treibende Faktor, den ich mir vorstellen kann, ist, wie eng die Bibliotheken jetzt miteinander verbunden sind, und erwarten Sie, dass sie später in Beziehung gesetzt werden. Wenn Sie ein komplexes Netz von Abhängigkeiten haben, ist eine große Bibliothek wahrscheinlich einfacher. Wenn Sie nur minimale Beziehungen haben, können Sie diese sauber aufteilen.

Schild
quelle
0

Dies mag sehr subjektiv sein und hängt von Ihrer Psychologie und Sensibilität ab, aber meine langlebigsten Bibliotheken, die ich für meine persönlichen Projekte verwendet und über die Jahre nicht gehasst habe, waren immer meine kleinsten, isoliertesten (keine externen Abhängigkeiten dazu) andere Bibliotheken).

Das liegt daran, dass es nur einer blöden oder archaischen Idee bedarf, um meine gesamte Wahrnehmung der Bibliothek durcheinander zu bringen. Als ob ich einen völlig vernünftigen C-Code hätte, um Formen in einer Zeichnungsbibliothek zu rastern, außer dass dies von einer Bild- und Mathematikbibliothek abhängt, die ich in den 90er Jahren gegen 16-Bit-Bilder geschrieben habe, die im Nachhinein jetzt völlig beschissen sind. Ich könnte auch eine C ++ - Parsing-Bibliothek mit anständigem Parsing-Code und AST-Code haben, außer ich habe sie mit einem monolithischen Parsing-Stream gekoppelt, der im Nachhinein ein wirklich dummes und unpraktisches Design war. Jetzt fühlt sich das Ganze wie Scheiße an. Der größte Teil meines C ++ - Codes aus den 90ern ist für mich jetzt totaler Mist, da ich damals nicht wirklich wusste, wie man effektiv in C ++ entwirft, und dumme Dinge wie die Verwendung von Vererbung zum "Erweitern" getan habe. und bieten Superset-Funktionen zur Bildung von Klassen mit mehr als 100 Mitgliedern und albernen Abstraktionen, anstatt geeignete Subtypen mit minimalistischen Schnittstellen zu modellieren. Mehr von meinem C-Code hat meinen Shite-Filter überlebt, wenn auch nur einen Bruchteil. Meistens habe ich mir einen Berg Scheiße ausgedacht. Die kleinen Goldnuggets, die ich heraussuchen konnte, waren immer der am meisten entkoppelte, minimalistische Code mit der größten Singularität des Zwecks und oft abhängig von wenig mehr als primitiven Datentypen.

Dann möchte ich mich nicht einmal mehr mit diesen Bibliotheken beschäftigen, außer vielleicht den Code auf eine neue Bibliothek zu portieren, die sich nicht mit diesen befasst und nur gegen rohe 32-Bit- und 128-Bit-Pixel arbeitet und die Vektormathematik einbindet, anstatt davon abhängig zu sein eine externe Mathe-Bibliothek für beispielsweise die Rasterisierungs-Bibliothek. Dann hält der Code viel länger und macht mich glücklich. Ich bin ein bisschen zynisch mit meinen Ansichten über Bibliotheken. Ich neige dazu, sie nach den schwächsten Gliedern anstatt nach den stärksten Gliedern zu beurteilen. Ich kann das Schlechte nicht zugunsten des Guten übersehen, bis das Schlechte vollständig aus dieser Bibliothek entfernt ist.

Deshalb stimme ich für die kleineren, unabhängigeren Bibliotheken, da sie zumindest für mich eine geringere Wahrscheinlichkeit haben, sich später beschissen zu fühlen. Wenn Sie in einem Team arbeiten, würde ich mit stärkeren Standards noch mehr dafür stimmen, um die Bibliotheken voneinander zu entkoppeln, da sie mit vielen Händen sehr schnell chaotisch werden können, es sei denn, sie haben einen sehr besonderen Zweck und ein Ziel in Richtung Minimalismus (auf der Suche nach Gründen, nicht mehr hinzuzufügen, anstatt immer Gründe zu finden, mehr hinzuzufügen - Sie können nicht hassen, was Sie nicht hinzufügen) ... obwohl es sich nach der Frage anhörte, dass dies eher für persönliche Projekte war, wo vielleicht Psychologie Faktoren in mehr. Aber weiter würde ich dafür stimmen, sehr entkoppelte Teile der Funktionalität abzuspalten. Sie müssen Ihr Framework nicht unbedingt sofort auf alle gewünschten Teile aufteilen. ICH'


quelle