Poche librerie o molte piccole librerie?

7

Nel corso di alcuni mesi ho creato una piccola struttura per lo sviluppo del gioco che attualmente includo in tutti i miei progetti.

Il framework dipende da SFML, LUA, JSONcpp e altre librerie. Si occupa di audio, grafica, networking, threading; ha alcune utilità utili per il file system e funzionalità di wrapping LUA. Inoltre, ha molti utili metodi di utilità "casuali", come gli helper di analisi delle stringhe e gli strumenti matematici.

La maggior parte dei miei progetti utilizza tutte queste funzionalità, ma non tutte:

  • Ho un programma di aggiornamento automatico che utilizza solo il file system e le funzionalità di rete
  • Ho un gioco senza funzionalità di rete
  • Ho un progetto che non ha bisogno di JSONcpp
  • Ho un progetto che richiede solo quei programmi di utilità stringa / matematica

Ciò significa che devo includere le librerie condivise SFML / LUA / JSON in ogni progetto, anche se non vengono utilizzate. I progetti (non compressi) hanno una dimensione minima di 10 MB in questo modo, la maggior parte dei quali non è utilizzata.

L'alternativa sarebbe dividere il framework in molte librerie più piccole, che penso sarebbero molto più efficaci ed eleganti, ma avrebbe anche il costo di dover mantenere più file e progetti DLL.

Dovrei dividere il mio framework in molte librerie più piccole:

  • Grafica
  • Threading
  • Rete
  • File system
  • Utilità più piccole
  • JSONcpp utilizza
  • Utilità LUA

Questa è la soluzione migliore?

    
posta Vittorio Romeo 18.03.2013 - 16:56
fonte

4 risposte

13

Personalmente andrei a cercare molte piccole librerie.

  • Scoraggia gli sviluppatori dalla creazione di dipendenze tra pacchetti altrimenti non correlati.
  • Librerie più facili da gestire e molto più mirate.
  • Più facile da suddividere e disporre di team separati per gestire ciascuna libreria.
  • Una volta che hai un nuovo requisito sufficientemente complesso, è meglio aggiungere un nuovo modulo piuttosto che trovare una libreria esistente per inserire il nuovo codice. Le piccole librerie incoraggiano questo modello.
risposta data 18.03.2013 - 17:01
fonte
3

Hai dato una parte del compromesso, ma non l'altra. Senza una "giusta ed equilibrata" delle pressioni che stai operando, non possiamo assolutamente dirlo.

Dici che dividere le librerie renderà più piccoli tutti i tuoi progetti. Questo è un chiaro vantaggio. Posso immaginare vari svantaggi:

  • dividere le librerie è di per sé uno sforzo, anche se deve essere fatto una sola volta.
  • mantenere le versioni di molte librerie in modo consistente è un piccolo ma persistente sforzo aggiuntivo.
  • non è così facile essere sicuri che ogni progetto contenga davvero le cose di cui ha bisogno
  • la suddivisione potrebbe non essere possibile in modo pulito come credi al momento, e introdurre un lavoro in più, forse persino minacciare l'integrità concettuale di alcuni moduli.

A seconda di quanto probabile / importante siano questi argomenti controversi per te, la suddivisione può o non può essere la scelta giusta per te. (Si noti che la dicotomia tra "splitter" e "lumpers" è considerata da molti come un tratto fondamentale della personalità che non è suscettibile alla logica in primo luogo!)

Detto questo, i diversi compiti che stai facendo i tuoi moduli sono così lontani l'uno dall'altro che considererei almeno alcuni la divisione probabilmente richiesta.

    
risposta data 18.03.2013 - 17:05
fonte
2

Non c'è una risposta chiara. Il miglior fattore di guida che riesco a pensare è quanto siano interconnesse le librerie ora, e ti aspetti che possano essere correlate in seguito. Se si dispone di un complesso web di dipendenze, una grande libreria sarà probabilmente più semplice, se si hanno relazioni minime, allora è possibile suddividerle in modo pulito.

    
risposta data 18.03.2013 - 17:30
fonte
0

Questo potrebbe essere molto soggettivo e dipende dalla tua psicologia e sensibilità, ma le mie librerie di più lunga durata che ho usato per i miei progetti personali e non ho iniziato a odiare nel corso degli anni sono sempre state le mie più piccole, le più isolate (no dipendenze esterne ad altre librerie).

È perché ci vuole solo un'idea stupida o arcaica per confondere la mia intera percezione della biblioteca. Come se potessi avere un codice C perfettamente ragionevole per rasterizzare le forme in una libreria di disegni, eccetto che dipende da una libreria di immagini e matematica che ho scritto negli anni '90 contro le immagini a 16 bit che, in retrospettiva, ora sono completamente shite. Potrei anche avere una libreria di analisi in C ++ con qualche codice di analisi e codice AST decente, tranne che l'ho accoppiato a un flusso di analisi monolitico che, in retrospettiva, era un progetto davvero stupido e poco pratico. Quindi ora l'intera cosa sembra una merda. La maggior parte del mio codice C ++ degli anni '90 è una schifezza totale per me dato che non sapevo come progettare in modo efficace in C ++ allora e facevo cose stupide come usare l'ereditarietà per "estendere" e fornire funzionalità superset formando classi con oltre 100 membri e astrazioni sciocche invece di modellare sottotipi appropriati con interfacce minimaliste. Più del mio codice C è sopravvissuto al mio filtro shite, anche se solo in minima parte. Per lo più sono venuto con una montagna di shite. Le piccole pepite d'oro che ero in grado di individuare erano sempre il codice più disaccoppiato e minimalista con la più grande singolarità di scopo e spesso dipendevano da poco più che da tipi di dati primitivi.

Quindi non voglio nemmeno più preoccuparmi di queste librerie, eccetto forse portare il codice su una nuova libreria che non si preoccupa di quelle e funziona solo contro i raw 32 bit e 128 bit e incorpora invece la matematica vettoriale di dipendere da una lib di matematica esterna per, per esempio, la lib di rasterizzazione. Quindi il codice dura molto più a lungo e mi rende felice. Sono un po 'cinico con le mie opinioni sulle librerie. Tendo a giudicarli dagli anelli più deboli invece che dai collegamenti più forti. Non posso trascurare il male a favore del bene fino a che il male non è completamente eliminato da quella libreria.

Quindi io voto per le biblioteche più piccole e indipendenti perché hanno una probabilità più bassa, almeno per me, di sentirsi come se fossero più tardi. Se lavori in una squadra, voterei ancora di più con standard più forti per mantenere le librerie separate tra loro, dal momento che possono diventare molto veloci con molte mani su di esse a meno che non abbiano uno scopo molto singolare e un obiettivo verso il minimalismo (cercando ragioni per non aggiungere altro invece sempre trovando ragioni per aggiungere altro - non si può odiare ciò che non si aggiunge) ... anche se suonava dalla domanda che questo era più per progetti personali dove forse fattori psicologici in più. Ma più lontano voterei per separare i pezzi di funzionalità molto disaccoppiati. Non devi necessariamente dividere il tuo quadro in tutti i pezzi che desideri subito. Cercherei solo di iniziare a creare librerie di codice stabili, ben collaudate, che siano di natura minima e disaccoppiata - cose che ti fanno stare bene per un bel po 'di tempo.

    
risposta data 18.12.2017 - 11:56
fonte