Domanda

Come si fa a organizzare il codice in modo che possa facilmente essere portato attraverso progetti di business senza portare troppo grosso inutili?

Per esempio (in Net), diciamo che sono disponibili le seguenti spazi dei nomi:

namespace Computers
    - Hardware
         - Motherboard
         - GPU
namespace Monitors
    - Display
         - Mirrors
namespace Peripherals
    - USB
    - PS/2
  • Non si crea un progetto per ogni spazio dei nomi genitore e quindi fare riferimento che dll progetto in altri progetti?
  • Si crea una libreria di classi grande e porta quella cosa in giro (anche se è necessario solo il 5% della biblioteca)?
  • O, basta creare un file e copiare il codice necessario in quel file; armati di quel file in giro in tutti i progetti che avete bisogno di ottenere un "plug and play" architettura (così male come sembra)?

Modifica Non sto cercando risposte .Net specifico, ma è l'esempio concreto che sto usando (in quanto un esempio astratto renderebbe più difficile per capire la domanda in questo caso)

È stato utile?

Soluzione

  

Non si crea un progetto per ogni genitore   spazio dei nomi e quindi di riferimento che   progetto DLL in altri progetti?

Non necessariamente. E 'di solito finisce in questo modo perché le mie librerie in genere non sono molto grandi, ma si noterà Microsoft certamente non farlo. System.Web esiste anche se non si include il riferimento System.Web. Basta avere più classi se si fa. Indicando che lo spazio dei nomi System.Web viene utilizzato in diverse DLL differenti.

  

Si crea una libreria grande classe   e la porta che cosa intorno (anche se   è necessario solo il 5% della biblioteca)?

Sì. Spazio libero su disco è a buon mercato, più conveniente che il mantenimento di codice ridondante.

  

In alternativa, ti basta creare un file e   copiare il codice necessario in quel file;   armati di quel file in giro in tutto il   progetti che avete bisogno di ottenere un   "Plug and play" architettura (così male   come questo sembra)?

E 'dipende dalla funzione. Mi piacerebbe solito avviene qualcosa di simile in un frammento. Ad esempio, una tipica funzione che si presenta nei miei progetti web è qualcosa di simile:

void ShowErrorMessage(HtmlTableRow row, string message)
{
   row.Cells.Clear();
   row.Cells.Add(new HtmlTableCell());
   row.Cells[0].InnerHtml = message;
   row.Cells.Attributes.Add("class", "error");
   row.Visible = true;
}

Non è mai sembrato un buon candidato per una funzione di libreria perché poi avrei dovuto passare nella classe CSS ho voluto usare e, occasionalmente, il valore colspan per la cellula. Ma vedrete una sorta di realizzazione come questa seduta in pochi luoghi nei miei progetti web.

Altri suggerimenti

Prendo spunto da DNA, e copiare tutto o in parte mia una libreria di classi enorme da progetto a progetto, anche se io uso solo l'1% della biblioteca in ogni progetto. Ho liberamente riscrivere i metodi e le classi a seconda delle necessità.

Anche se questo approccio è un po 'in contrasto con la saggezza di programmazione convenzionale, non mi picchio è: ha lavorato con successo per gli esseri viventi per gli ultimi 3,5 miliardi di anni. Come nella vita, l'alternativa (cementare le interfacce e le implementazioni condividendo assembly compilati attraverso progetti) inibisce il cambiamento e garantisce virtualmente eventuale estinzione.

Continuo a ciascun componente come un modulo digitale, e utilizzare Maven per gestire le mie dipendenze (non è solo per Java, vedere questo , Byldan è un Net equivalente).

In questo modo è possibile riutilizzare il codice senza dover includere nel progetto. Nel tuo esempio sopra potrei avere tre artefatti, uno per ogni spazio dei nomi a meno che non ci sia un buon motivo per tenerli insieme (questo consente di applicare accoppiamento lasco).

Ho scoperto di recente che cerco di mantenere il numero di progetti verso il basso, anche se solo in modo che si riduce il numero di assemblee effettivi creati alla fine - Ho appena trovato più facile trattare con durante lo sviluppo. Questo è forse perché trovo difficile la creazione di progetti che sono veramente modulari e indipendenti l'uno dall'altro però.

Credo che la regola generale potrebbe essere: se il progetto può davvero essere sviluppato indipendentemente da tutti gli altri e collegato ad altri progetti, senza altre dipendenze, allora ne fanno il proprio progetto. Se si scopre che ci sono sempre altri progetti che devono essere fatto riferimento in modo per farlo funzionare (per esempio, forse nel vostro monitor progetto che si trova che nulla funziona a meno che non si include anche lo spazio dei nomi computer con le classi GPU), poi avevo messo insieme in un unico progetto.

A parte questo, non credo che le regole sono troppo duro e veloce. In realtà dipende molto su ciò che è nelle assemblee, è difficile fare regole arbitrarie ...

Solo i miei due centesimi, non vale molto ...

I iniziare con una singola DLL, e come si diventa più grande e comincia a contenere alcune componenti abbastanza indipendenti, posso scegliere di fattore loro come DLL separata. Per me, è in primo luogo una questione di estetica - mi piace mantenere le cose indipendenti e ortogonali e ben organizzato. Non c'è niente di sbagliato con una grande dll, data la quantità di memoria, spazio su disco disponibile al giorno d'oggi.

Per le cose che è condivisa in più progetti Io in genere andare con quella grande approccio DLL. Qui sta il punto, però, se si dispone di molti progetti che utilizzano questo ragazzo, mi raccomando forte nominarlo e gettando nella GAC. Quello che più volte si esegue in quando si aggiungono più e più progetti è il desiderio di fare un cambiamento di rottura di un componente condiviso. Se non si utilizza forte denominazione / GAC, allora dovete andare e aggiornare tutte le app quando si effettua il cambio, e inevitabilmente si dimentica uno, e qualcosa nella produzione esploderà.

Forte nome di esso, mantenere una versione di rilascio in una cartella centralizzata nel controllo del codice sorgente, e sempre riferimento che. Poi, il deploy gettarlo nel GAC.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top