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?
quelle
Antworten:
Ich würde persönlich für viele kleine Bibliotheken gehen.
quelle
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:
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.
quelle
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.
quelle
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