Qual è una buona architettura (ordinata) nella programmazione di un semplice sito Web, ad esempio un libro di contatto?


28

Quando creo un sito Web semplice, ad es. Una rubrica in cui posso aggiungere, eliminare e aggiornare i contatti, creo un index.phpfile in cui un utente, se non ha effettuato l'accesso, è tenuto a inserire una password e se inserisce la password giusta, è assegnato una sessione e può fare determinate cose con i contatti.

Ho due file:

  1. Il primo ( contacts.php) è per mostrare il codice HTML. Sopra il codice HTML includo il secondo file e creo la classe.
  2. Il secondo ( contacts_class.php) contiene tutti i metodi per aggiungere, eliminare e aggiornare.

Penso che sia ok, ma quando si tratta di implementare un grande progetto, come dovrei farlo? Devo creare cartelle per ogni pagina e inserire file (come sopra, HTML e classe) e come devo fare? Qual è un'architettura buona e ordinata per la costruzione di grandi progetti che ogni altro programmatore avrebbe capito perfettamente?

Risposte:


67

Hai sollevato una domanda molto interessante e fondamentale. La domanda riguardante l'architettura del progetto su larga scala e l'organizzazione della struttura delle cartelle (che è secondaria all'architettura).

Oggi l'approccio più comune alla costruzione dell'architettura del framework CMS è l'uso del modello MVC. Ci sono alcuni buoni articoli sulla costruzione dei propri framework MVC, uno di questi è Build a MVC Framework con PHP .

MVC sta per Model, View, Controller. Puoi chiamare questi approcci come preferisci: MVC, HMVC, MVP. L'essenza è isolare i singoli componenti del sistema. Il "Controller" recupera i dati dal "Modello" e li invia a "Visualizza", che esegue il rendering dell'HTML finale. Hai già implementato la "V" nella tua contacts.phpe "MC" nella tua contacts_class.php. Quindi hai isolato la vista dal modello e dal controller. Ora puoi facilmente cambiare la "Vista" lasciando intatte le altre parti.

Non sto suggerendo di seguire ciecamente il modello MVC, MVP o qualsiasi altra cosa "MV". È questione di adeguatezza, efficacia e gusto.

L'applicazione del sito Web dinamico comune può includere componenti quali:

  • Il punto di ingresso, diciamo index.php
  • Le librerie / classi di supporto
  • Il router di richiesta
  • I moduli, i componenti o i controller
  • Il motore del modello o forse viste singole

La vera applicazione web può includere qualsiasi altro componente come gestori di eventi, dispatcher e hook di eventi, ma in realtà si tratta di sfumature. Bene, vorrei presentarlo nel modo in cui voglio presentarlo:

Il diagramma di routine dell'operazione

La routine operativa quadro comune come segue:

  1. La richiesta del browser viene inviata direttamente all'eseguibile / script del punto di ingresso ( index.php).
  2. Lo script del punto di ingresso carica le librerie helper, le classi ed esegue un'ulteriore inizializzazione del nostro ambiente di programmazione.
  3. L'URL viene passato all'istanza del router di richiesta. Questo passaggio può far parte del passaggio 2.
  4. Il router di richiesta analizza l'URL e invia l'operazione a un particolare componente, modulo o controller.
  5. Il componente (o controller) elabora la richiesta instradata e invia i dati alla vista per il rendering.

La struttura delle cartelle del progetto corrispondente è mostrata nel diagramma.

Ti suggerirei di indagare su come sono implementati gli altri framework. I CMS / framework consigliati per iniziare sono CodeIgniter, OpenCart, Joomla 1.5 e Tango CMS.


3
Cosa hai usato per creare quell'immagine? Bella risposta!
Mark Tomlin,

3
Grazie per la valutazione positiva della mia risposta! Lo apprezzo molto! Questa risposta è interamente il risultato dell'analisi di vari framework di applicazioni Web open source, che ho condotto in precedenza per me stesso. Per coloro che sono interessati a come è stata creata l'immagine e il software utilizzato, l'immagine è stata creata usando Inkscape 0.48 e GIMP 2.6.10. Nessun problema. Usa solo due livelli: uno per i rettangoli con il testo, uno per le ombre (i rettangoli neri sfocati). Immagino tu capisca il resto?

Una domanda, perché dovresti separare i controller dei "contatti" in 3 file. Non sarebbe solo più pulito combinarli in un contatto.php. Tutto quello che devi fare è passare un parametro di azione dal router. Lo stesso si può dire per le viste "contatti" a meno che la vista non combini modello e logica in un file per ogni azione. Non faccio molto sviluppo in PHP (lavoro principalmente in Python) ma spero che non tutti i framework utilizzino questo approccio. Altrimenti +1 per un ottimo writeup.
Evan Plaice,

2

Per avere un'idea di quali domande porre e quali soluzioni sono disponibili, consiglio il libro Patterns of Enterprise Application Architecture di Martin Fowler. Puoi avere un'idea di cosa c'è nel libro leggendo il suo sito web

Tieni presente che il libro è già piuttosto vecchio (in ambito IT) ma molti principi sono ancora validi o dovresti impararli da cui imparare. (Aveva senso?)

(Software) L'architettura è un argomento molto vasto, non aspettarti un proiettile d'argento ma sempre più domande e più dubbi fino a quando il tempo e il denaro finiscono e devi rimanere con la soluzione migliore finora.


2

Prima di tutto, dai un'occhiata a un progetto ben sviluppato. Wordpress è un esempio molto preciso di struttura del codice: è semplice da capire ma offre molto "plug". Quindi wordpress è facile da stimare tramite "plug in".

In secondo luogo, un modo molto semplice per verificare la tua architettura è provare a scrivere unit test. Ad esempio, se la classe "Card Deck" ha un metodo "shuffle ()", devi essere in grado di creare un Card Deck di dimensioni predefinite (cioè 5 carte 1,2,3,4,5), chiamare shuffle e verificare in un modo semplice il risultato (id 1,4,2,5,3)

Devi essere in grado di farlo senza creare istanze per l'intera classe del progetto e il test deve essere molto pulito da leggere.

Se non riesci a farlo, devi aggiungere livelli tra le classi, ristrutturarle, fino a ottenere un modo semplice per farlo.

Quindi riabilitare questo passaggio per tutte le classi principali del progetto.

Ultimo ma non meno importante: una buona architettura potrebbe essere "pigra" su classi non così fondamentali (è una questione di economia: le cose ben progettate costano troppo nel mondo reale).


1

Una buona architettura per progetti su larga scala è MVC (Model View Controller): http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

Tuttavia, se altri programmatori lo capiranno, è una questione completamente diversa. MVC può diventare complesso ed è talvolta eccessivo per i piccoli progetti. Uno dei vantaggi è che si ridimensiona facilmente.


Questo è uno schema, non un'architettura.
metà

Direi che sono una cosa sola in questo caso. Come differenzieresti i due? Inoltre, leggi la prima riga della pagina di Wikipedia che ho pubblicato.
Chris Laplante,

1
Dalla mia esperienza, MVC non è complesso ed è molto utile anche in piccoli progetti. Concordo tuttavia che si tratta di un modello e non di un'intera architettura.
Danny Varod,

MVC è un modello, non un'architettura in sé, ma può essere considerato parte dell'architettura. E non è poi così complicato.

1

Se capisco correttamente la tua domanda, stai parlando della struttura delle cartelle del progetto e non essenzialmente di un'architettura. Se la mia comprensione è corretta, continua a leggere; altrimenti modifica la tua domanda o metti un commento e io modificherò la mia risposta di conseguenza.

Durante la progettazione di un'applicazione, dopo aver risposto ad alcune domande di base come (cosa? Ea chi?), È necessario identificare i componenti e classificarli in base a funzionalità / responsabilità. Ci sono due modi principali che conosco. È possibile classificare i componenti in base a, utilizzare i casi che gestiscono (come login, ricerca, ecc.) O classificare in base alle risorse (Oggetti ...). Il primo modo si chiama Activity oriented e il secondo si chiama Resource Oriented. Tradizionalmente la maggior parte delle applicazioni classifica i componenti in base alle attività (dal momento che i progettisti l'hanno trovato, facile durante il trasferimento dal dominio problematico al dominio della soluzione). Ma sto divagando.

Una volta identificata la classificazione dei componenti, è necessario identificare la classificazione in base ai livelli. Un'applicazione Web tipica avrà View Tier, Model Tier e Controller Tier (MVC). Naturalmente potrebbero esserci anche applicazioni più complesse. (la maggior parte delle applicazioni del mondo reale sono più complesse di così semplice).

Dopo aver identificato queste due tassonomie, creerò cartelle di livello superiore che identificano ogni livello. (UI, Controller, Servizi, Utilità ecc.). Sotto ogni cartella di alto livello, creerò cartelle secondarie basate su Funzionalità o Risorse (Progetto - / Modifica progetto - / Cerca progetto ecc.). La classificazione idealmente funzionale sarà multilivello.


Non ho approfondito le differenze tra progettazione orientata alle risorse e progettazione orientata alle attività. Oltre a divagare, non ero molto sicuro della domanda. Ma personalmente quando si tratta di chiarezza del design (quanto facilmente un nuovo sviluppatore può capire i componenti e il design sottostanti), l'architettura orientata alle risorse è migliore. Esaminando semplicemente la gerarchia di cartelle, uno sviluppatore può comprendere tutte le risorse e le risorse secondarie partecipanti e anche l'operazione su ciascuna risorsa è uniforme.

1

Ci sono buone architetture e cattive architetture, tuttavia non ci sono proiettili d'argento. Un'architettura deve essere adatta alle esigenze attuali e altamente possibili future.

Una buona linea guida sarebbe, assicurarsi che ogni parte dell'applicazione possa essere cambiata con un effetto minimo sulle altre parti e che ogni parte abbia unità di copertura totale automatizzata e test di integrazione.


1

L'architettura consiste nell'assicurarsi che tu possa continuare a sviluppare a lungo termine. Per applicazioni più grandi, ciò include il compromesso tra rendere indipendenti le cose in modo che più persone possano lavorare contemporaneamente ed evitare la duplicazione (DRY) in modo che il progetto possa rimanere agile. I progetti PHP tendono a concentrarsi sul rendere le cose indipendenti e hanno una grande quantità di duplicazioni.

Per avere una buona sensazione per l'altra posizione estrema, dai un'occhiata a Seaside


1

Se non sai come strutturare un grande progetto, dovresti prendere in prestito il design / l'architettura di altri usando uno dei tanti buoni frame PHP. Consiglierei CakePHP, CodeIgniter o Symfony. Tutti questi implementano un modello, View, Controller, patten MVC che funziona bene nello sviluppo web, sono tutti abbastanza leggeri e facili da imparare.

Una volta che conosci uno di questi framework potresti essere in grado di progettare la tua struttura per il tuo particolare progetto, ma se sei appena agli inizi starei sul lavoro di altri invece di reinventare la ruota.


0

MVC è l'architettura più comunemente usata, che ha dimostrato di risolvere la maggior parte dei problemi. Una buona architettura avrà le seguenti caratteristiche (e altro, orcourse)

  1. Può essere testato in unità
  2. Separazione degli interessi
  3. Molte persone saranno in grado di lavorarci senza alcuna collisione.
  4. Può essere esteso senza molti problemi
  5. Può essere scalabile. Quando si tratta di grandi progetti, la scalabilità sarà una delle maggiori preoccupazioni. Checkout Kohana quadro, che è ben scritto e può essere scalata molto bene

0

prima di scrivere un codice di produzione, prendi 2 settimane (notti :) e leggi questo libro. Per molto tempo cambierà idea sulla programmazione di architettura, pratiche e packiging.

Principi, modelli e pratiche agili C # di Prentice Hall

Gli esempi sono in C # ma sono facili da leggere, non si tratta di come scrivere la sintassi corretta del codice, ma di come pensare come programmatore.

Ti prometto che lo salverai sul tuo posto più accessibile sul tuo PC e sarai sorpreso di aver programmato senza saperlo. Sposterà il tuo pensiero.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.