Raggruppando classi per soggetto o dipendenze?

1

Il nostro progetto è costituito da applicazioni utente e applicazioni server. L'applicazione server prepara i file di dati che l'applicazione utente consuma. Poiché i dati sono enormi, vengono archiviati in formato personalizzato. Quindi il progetto include molte classi relative alla lettura e alla scrittura dei dati. L'applicazione utente non ha bisogno del lato scrittura, quindi non vogliamo avere il codice lì sia perché potrebbe essere eseguito su dispositivi con risorse limitate sia perché prolunga la compilazione (C ++ non è noto per avere compilatori veloci).

Quindi dì che ho due classi (ne ho decine):

  • DataReader
  • DataWriter

Queste classi operano entrambe sulla stessa cosa, i dati serializzati. Ma il primo è necessario solo nell'applicazione utente e il secondo è necessario solo nell'applicazione server. Suggeriresti di mantenere tali classi

  • Insieme; in dire
    • common/data/DataReader
    • common/data/DataWriter
  • Separa come
    • userapp/data/DataReader
    • serverapp/data/DataWriter

Con questo va la compilazione. Il materiale comune vive in common ed è compilato in una libreria collegata a entrambi. Quindi la prima opzione si divide ulteriormente in due:

  • Insieme in common/data e collegati a common.a o
  • Insieme nella directory common/data , ma ciascuna collegata al target che ne ha bisogno.

Ora ognuno ha i suoi vantaggi e svantaggi:

  • Sono strettamente correlati, quindi ha senso tenerli insieme. Ma
    • avere entrambi in una libreria rende la libreria più grande e più lunga
    • compilarli separatamente significa che il layout della directory non corrisponde al layout del progetto, il che è piuttosto confuso e complica gli script di compilazione
  • Mantenerli separati rende la struttura di build più logica ed evita il lavoro non necessario per il compilatore, ma quando li aggiorna, i componenti distanti devono essere modificati (entrambe le applicazioni sono gestite dallo stesso team, quindi non è come se qualcuno non essere a conoscenza dell'altra parte)

Al momento abbiamo una miscela tra gli approcci (alcune classi sono separate, altre no e la libreria comune contiene molte cose che dovrebbero essere nei singoli progetti), che vorrei ripulire.

C'è qualche raccomandazione abituale per tale situazione? O qualche esperienza utile con casi simili?

    
posta Jan Hudec 30.11.2012 - 13:44
fonte

1 risposta

1

Mantienili insieme: qualsiasi modifica del formato richiede la modifica di questi elementi e l'unità di test del formato è più semplice con il tuo lettore e ampli esistente; codice di scrittura insieme.

Tuttavia, solo perché i file di origine sono memorizzati insieme, non significa che devono compilare insieme. È possibile configurarlo in modo che (convenzioni del nome file UNIX solo per illustrazione):

userapp depends on libreader.a depends on DataReader.o

, mentre

serverapp depends on libwriter.a depends on DataWriter.o

e quindi non vi è alcun motivo per creare libwriter quando si sta solo compilando il client.

    
risposta data 30.11.2012 - 13:51
fonte

Leggi altre domande sui tag