2009-08-24 8 views
5

Quali sono i motivi più comuni per dividere un progetto di sviluppo (ad esempio l'applicazione ASP.NET MVC) in più progetti? L'organizzazione del codice può essere eseguita anche tramite le cartelle. Più progetti tendono a generare conflitti di riferimento circolari e aumentare la complessità dovendo gestirli/risolverli.Motivi per suddividere il progetto in più progetti?

Quindi, perché?

risposta

3

Una possibilità è disporre di un sistema su cui un determinato gruppo (o singolo sviluppatore) può lavorare indipendentemente dal resto del codice. Un altro è quello di calcolare il codice di utilità comune di cui ha bisogno il resto del sistema: vengono in mente cose come la gestione degli errori, la registrazione e le utilità comuni.

Naturalmente, proprio quando si pensa a ciò che accade in una particolare funzione/classe/file, dove i confini sono una questione di arte, non di scienza.

0

Proprietà per una cosa. Se si hanno sviluppatori responsabili di diverse parti del codice di base, suddividere il progetto su è la cosa naturale da fare. Si potrebbero anche dividere progetti per funzionalità. Questo riduce i conflitti e la complessità. Se aumenta, ciò significa solo mancanza di comunicazione e stai solo sbagliando.

+0

Ciò rende la proprietà del codice più esclusiva, che a mio parere è una cosa negativa. La proprietà esclusiva del codice richiede più comunicazioni (come hai notato) e la comunicazione è sempre difficile da ottenere. Richiede anche più cooperazione (se ho bisogno che il tuo codice sia cambiato, ora è molto più difficile farlo da solo) che è anche difficile da ottenere. In questo scenario, un giocatore di squadra cattivo può fottere le cose per tutti. – Imagist

1

Un esempio che posso pensare è che potresti trovare nello sviluppo di un progetto che si finisce per sviluppare una libreria che può essere di uso più generale e che merita di essere un suo progetto. Ad esempio, forse stai lavorando a un videogioco e finisci per scrivere una libreria audio che non è in alcun modo legata al progetto di gioco.

5

Alcune ragioni sono

Encapsulation - Con il confezionamento di una serie di routine in un'altra libreria, sia come una libreria statica o un set di DLL, diventa una scatola nera. Perché sia ​​una buona scatola nera, tutto ciò che devi fare è assicurarti di dare gli input giusti e ottenere le uscite corrette. Aiuta quando riutilizzi quella libreria. Applica anche alcune regole e impedisce la programmazione da parte degli hacker ('hmm ... renderò pubblica la funzione membro per ora')

Riduce il tempo di compilazione - la libreria è già stata rispettata; non è necessario ricostruirlo in fase di compilazione, basta collegarlo (supponendo che si stia facendo C++).

Disaccoppiamento: racchiudendo le classi in librerie indipendenti, è possibile ridurre l'accoppiamento e consentire di riutilizzare la libreria per altri scopi. Allo stesso modo, purché l'interfaccia della libreria non cambi, è possibile apportare modifiche alla libreria come preferisci e altre persone che si collegano ad essa o che fanno riferimento ad essa non hanno bisogno di modificare il loro codice. Le DLL sono utili in questo aspetto che non richiede alcuna ri-compilazione, ma può essere complicato lavorare se molte applicazioni installano versioni diverse delle stesse DLL. È possibile aggiornare le librerie senza influire sul codice del client. Mentre puoi fare lo stesso con solo le cartelle, non esiste un meccanismo esplicito per forzare questo comportamento.

Inoltre, praticando questa disciplina di avere diverse librerie, puoi anche assicurarti che ciò che hai scritto sia generico e disaccoppiato dall'implementazione.

Licensing/Commercialization - Beh, penso che questo sia abbastanza ovvio.

1
  1. Riutilizzo del codice. Diciamo che hai il progetto A e inizi un nuovo progetto B che ha molte delle stesse funzioni del progetto A. Ha senso estrarre le parti condivise di A e trasformarle in una libreria che può essere utilizzata sia da A che da B Ciò consente di avere il codice in entrambi senza dover mantenere lo stesso codice in due punti.

  2. Riutilizzo del codice, invertito. Diciamo che hai un progetto che funziona su una piattaforma. Ora vuoi che funzioni su due piattaforme. Se è possibile separare il codice dipendente dalla piattaforma, è possibile avviare diversi progetti per ciascuna libreria dipendente dalla piattaforma e quindi compilare la base di codici centrale con diverse librerie per piattaforme diverse.

+0

Perché i downvotes? – Imagist

1

Invece di mettere in discussione il valore di codice in più assemblee, in dubbio il valore di aggregazione tutto il codice in un unico luogo.

Vuoi mettere tutto nella tua cucina in un armadio singolo?

I riferimenti circolari sono riferimenti circolari, indipendentemente dal fatto che si verifichino tra assiemi o all'interno di essi. Il design dei componenti incriminati è molto probabilmente non ottimale; l'organizzazione di evitamento tramite assemblee ironicamente impedisce al compilatore di rilevare la situazione.

Non capisco l'affermazione che è possibile organizzare il codice altrettanto bene con le cartelle come con i progetti. Se ciò fosse vero, i nostri sistemi operativi non avrebbero il concetto di unità separate; avrebbero solo una gigantesca struttura di cartelle. I modelli organizzativi di ordine superiore esprimono un tipo di intento diverso rispetto alle cartelle semplici.

I progetti dicono "Questi concetti sono strettamente correlati e solo marginalmente correlati ad altri concetti".

+0

Hai ragione; Sto solo incontrando molti riferimenti circolari (descritti in questa domanda: http://stackoverflow.com/questions/1320561/resolving-circular-references-c) che sembrano rendere estremamente noiosa la separazione dei progetti, o sto facendo alcuni enormi errori di progettazione di cui non sono a conoscenza (e vorrei imparare da). – Alex

+0

È stata aggiunta una risposta alla domanda collegata. –

0

Qui ci sono alcune buone risposte, quindi cercherò di non ripetere.

Un vantaggio del codice di suddivisione per il proprio progetto è il riutilizzo dell'assieme su più applicazioni.

Mi è piaciuto anche l'approccio funzionale menzionato (ad esempio, Inventory, Shipping, ecc. Potrebbero tutti ottenere i propri progetti). Un'altra idea è considerare il modello di implementazione. Il codice condiviso tra livelli, livelli o server dovrebbe probabilmente essere nel proprio progetto comune (o insieme di progetti se si desidera un controllo più preciso). Il codice assegnato a un determinato livello potrebbe trovarsi nel proprio progetto. per esempio. se si dispone di un server Web e di un server applicazioni separati, non si desidera distribuire il codice UI sul server delle applicazioni.

Un altro motivo per suddividere può essere quello di consentire piccoli deployment incrementali una volta che l'applicazione è in produzione. Diciamo che ottieni un bug di produzione di emergenza che deve essere corretto. Se il piccolo cambiamento richiede una ricostruzione dell'intera applicazione (un progetto), potresti avere difficoltà a giustificare un piccolo ciclo di test al QA. Si potrebbe avere una vendita più semplice se si distribuisse solo un assieme con un set di funzionalità più piccolo.

Problemi correlati