2010-03-27 15 views
6

Ho deciso di sviluppare un'applicazione web basata su database, ma non sono sicuro da dove iniziare. L'obiettivo finale del progetto è triplice:Da dove cominciare con lo sviluppo della prima app Web basata su database (lunga domanda)?

  1. di apprendere nuove tecnologie e pratiche,
  2. consegnare una demo non richiesti al management che avrebbe mostrato come le informazioni che gli spacci aziendali come documenti d'ufficio distribuite su una rete ingombrante la struttura delle cartelle può essere consolidata e facilitata all'accesso e alla manutenzione e
  3. mostrare ai miei colleghi come lo sviluppo guidato dai test e la prototipazione tramite diagrammi di classe possono essere molto utili e ridurre i futuri problemi di manutenzione.

Penso che questo finisca per essere un CMS di base al quale ho generato un insieme di funzionalità, vedi sotto.

  1. Creare un database per memorizzare la struttura del sito (organizzata come un albero con un "gruppo di progetti" -> struttura del progetto).
  2. Estrarre la struttura del sito dal database e visualizzarla come albero utilizzando le tecnologie front-end di base.
  3. Aggiungere privilegi/strumenti di amministratore per modificare la struttura del sito.
  4. Creazione automatica delle sottopagine secondarie * quando un amministratore aggiunge un nuovo progetto.
    4.1 Ci saranno diverse sottopagine sotto ogni progetto e il contenuto di ciascuna sottopagina è diverso.
  5. aggiungere i privilegi utente per l'assegnazione dei privilegi di lettura e scrittura alle pagine secondarie.

Quello che mi piacerebbe fare è utilizzare Test Driven Development e diagrammi di classe come parte del mio processo per lo sviluppo di questo progetto. Il mio problema; Non sono sicuro da dove cominciare. Ho letto su Unit Testing e UML, ma non li ho mai usati nella pratica. Inoltre, non avendo mai lavorato prima con i database, come posso incorporare questi elementi nei modelli e nelle unità di test?

Grazie a tutti in anticipo per la vostra esperienza.

+0

puoi iniziare il collaudo delle unità per il tuo prossimo codice che scrivi! il test dell'unità non si basa su nulla. hai solo bisogno di "codice test" che faccia affermazioni sul "codice testato". vedi http://en.wikipedia.org/wiki/Unit_testing – Karussell

risposta

6

Non so da dove iniziare.

Iniziamo sempre con il modello di dati.

aver mai lavorato con database prima, come ho incorporare questi elementi nei modelli e prova unità?

Ah, beh, c'è il problema.

è necessario avviare con i dati, perché tutto inizia con i dati.

  1. Casi di utilizzo scrittura. I tuoi 5 requisiti tecnici non sono davvero dei buoni casi d'uso perché non c'è un attore che interagisca con un sistema. Devi scrivere le cose che un attore fa - con cui l'attore interagisce.

  2. identificare gli oggetti che l'attore interagisce. In caso di dubbio, annota tutti i nomi nei tuoi casi d'uso.

  3. tracciare un quadro delle classi che implementeranno tali oggetti.

  4. Passeggiata attraverso i vostri casi d'uso per essere sicuri che tutte le cose che un attore deve fare sono basate su attributi dei definizioni di classe. Tutti i dati di cui un attore ha bisogno devono essere in queste classi, che diventeranno tabelle nel tuo database.

Ora, devi iniziare a fare più lavoro tecnico. Hai bisogno di un framework web con un livello ORM. Stai usando PHP, quindi dovrai trovare un buon framework per questo. Torta o Dottrina o qualcosa del genere.

  1. Definire una classe nel livello ORM. Non devi essere completo o preciso, hai solo bisogno di qualcosa che puoi testare.

  2. Test di unità di scrittura per questa classe per accertarsi che contenga i dati corretti. Questo sarà relativamente semplice all'inizio, poiché le singole classi di dati inizieranno in modo semplice.

Una volta definito il set di base delle classi, sarà necessario esaminare le relazioni tra classi. È qui che inizia il vero lavoro.

  1. Guarda una relazione nella tua foto. Qualsiasi linea Scegline uno a caso.

  2. Scrivere test di unità per essere sicuri di poter "navigare" su quella linea. Da un oggetto, recupera gli oggetti correlati all'altro capo della linea. Questo non dovrebbe essere molto complesso, solo poche righe di codice.

  3. Creare un "fixture" - dati di test che è possibile caricare in un database - per rappresentare gli oggetti e le loro relazioni.

  4. Eseguire il test. Se si rompe, aggiornare le definizioni ORM per supportare correttamente la navigazione.

Quando hai finito di fare tutte le varie relazioni, avrai costruito un modello di dati completo ragionevole in modalità Test-Driven.

Ora è possibile creare la presentazione PHP per gli oggetti del modello.

+0

In genere non mi piace iniziare con il modello di dati - penso che ti porti ad un modello di dominio anemico - ma tu stendi una sessione di design piuttosto buona. –

+1

@ Mark Brackett: "anemico"? Come puoi iniziare con qualcos'altro? Se si inizia con la presentazione della GUI, il modello di dati diventa un hash confuso basato su una determinata presentazione e qualsiasi piccola modifica a quella presentazione interrompe il modello. Il modello di dati è fondamentale per tutto. Cosa puoi intendere con "anemico"? –

+0

@ S.Lott - Personalmente, trovo che l'interfaccia utente o il dominio siano in primo luogo migliori per il comportamento di completamento. I dati in primo luogo, IME, portano a un modello di "dominio" che è poco più di getter/setter - spesso con relazioni non necessarie e complesse tra di loro. Quando è costretto ad aggiungere un comportamento, tende a entrare in servizi, controllori o processi memorizzati. –

7

Ho la sensazione che tu stia cercando di afferrare troppo in una volta. Va bene sperimentare database, TDD e diagrammi UML; questo di per sé sarebbe IMHO sufficiente per un singolo progetto. Questo primo progetto sperimentale ti insegnerà molto, in base al quale sarai in grado di fare un lavoro molto migliore sul prossimo progetto. Ma non mi aspetto che questo primo tentativo porti a risultati che possano convincere altri sviluppatori a scegliere TDD e/o il management a cambiare il suo modo di pensare. Devi capire e sperimentare le cose da solo, prima di poterle spiegare ragionevolmente agli altri.

Per consigli su applicazioni DB unit test, vedere questi fili per i principianti:

io non sono sicuro di quello che vuoi dire da "prototipazione tramite diagrammi di classe". I diagrammi delle classi vanno bene per discutere/comunicare il tuo design ad altri sviluppatori, e dovrebbero certamente essere nel toolkit di ogni buon sviluppatore.Una sessione di lavagna con qualcuno, che disegna e cancella gli elementi di design al volo è un ottimo modo per chiarire il design e le forze che lo influenzano. Tuttavia, IMHO questo è "prototipazione" solo in un senso molto ampio. Un vero prototipo per me è il codice: questo è l'unico modo per verificare se il tuo progetto funziona davvero o meno nella pratica.

2

Prima la dorsale di qualsiasi applicazione Web è il database. Suggerirei di iniziare in modo semplice, facendo il disegno del database e poi scrivendo il modello e osservando le classi per renderle. In secondo luogo, dovresti progettare il DB con i tuoi obiettivi in ​​mente (sotto-pagine, struttura ad albero) ma non aver paura di sbagliare. Potremmo trivellarti sulla normalizzazione o sui benefici dell'uso di un modello relazionale di oggetti, ma se personalmente non ne vedi la necessità, sarà difficile interiorizzare i concetti.

TDD può essere impiegato dal primo giorno, come si testare il modello e visualizzare le classi della DB. UML Non sono sicuro che sarebbe utile - se possibile, limitatevi a diagrammi di sequenza, classe e collaborazione.

una risposta concreta per l'utilizzo di DB nel test di unità - inserire righe fittizie durante l'installazione, e rimuoverli durante le fasi teardown. Si consiglia di scrivere uno script PHP per "ripulire" un DB dopo il test.

Spero che questo aiuti!

1

Quello che mi piacerebbe fare è utilizzare Test Driven Development e diagrammi di classe come parte del mio processo per lo sviluppo di questo progetto.

Questi sono 2 diversi approcci alla progettazione: è necessario sceglierne uno. TDD guida il design in base a comportamenti e test. UML tende ad essere usato in BDUF (Big Design Up Front) - sebbene possa essere usato solo per comunicare in modo informale tra gli sviluppatori senza far parte del "design". In conclusione, però, è necessario decidere come progettare il software. Per me, di solito mi sento più a mio agio con un approccio TDD, ma per un dominio ben noto, potrei fare una sessione BDUF (anche se non uso UML).

Il mio problema; Non sono sicuro da dove cominciare. Ho letto su Unit Testing e UML, ma non li ho mai usati nella pratica.

Supponendo che si stia parlando di [T | B] DD, e non di "test dell'unità", si inizia con i test che dimostrano i comportamenti necessari per l'applicazione. Se segui la rotta DD [T | B], probabilmente salterò interamente l'UML. Altrimenti, basta eseguire un generatore UML quando hai finito e ti farà fare delle belle foto. ;)

[TestFixture] 
public class WhenAddingNewProject { 
    [Test] 
    public void SubPagesAreCreated() { 
     var p = Project.Create("MyProjectGroup\\MyTestProject"); 

     Assert.IsGreaterThan(p.SubPages.Count, 0); 
    } 

    [Test] 
    public void FirstSubPageIsWikiPage() { 
     var p = CreateProject(); 
     var subPage = p.SubPages[0]; 

     Assert.AreEqual(subPage.Title == "MyTestProject Wiki"); 
     Assert.IsTypeOf<WikiSubPage>(subPage); 
    } 

    [Test(ExpectedException := typeof(SecurityException))] 
    public void DefaultsToAdministratorPrivileges() { 
     var p = CreateProject(); 

     var u = User.Login("testuser", "testpassword"); 
     Assert.IsNotNull(u); 
     Assert.AreEqual(UserRole.User, u.Role); 

     p.Delete(); 
     Assert.Fail(); 
    } 

    private Project CreateProject() { 
     return Project.Create("MyProjectGroup\\MyTestProject"); 
    } 
} 

Inoltre, non avendo mai lavorato con i database prima, come ho incorporare questi elementi nei modelli e le unità di prova?

Non è così. Per definizione, se si sta colpendo il database - si sta eseguendo un test di integrazione, non un test unitario. Per i test unitari, si desidera astrarre il database e ignorarlo/deridere/sostituirlo. Eliminando la logica dal database, è possibile testarla separatamente, quindi è sufficiente testare il caricamento/salvataggio dei dati (si sta utilizzando un ORM, giusto?).

1

Perché non iniziare con un diagramma delle classi? Si modella l'applicazione quindi si crea il codice java con annotazione JPA proveniente direttamente dal modello (ad esempio, gli stereotipi sono anche annotazioni) e infine si utilizza un mapper come Hibernate/EJB 3 per creare il database.

Problemi correlati