Domanda

principi OOP erano difficili per me capire perché per qualche motivo non potrei mai applicarle allo sviluppo web. Come ho sviluppato sempre di più progetti ho iniziato a capire come alcune parti del mio codice potrebbe utilizzare alcuni modelli di progettazione per rendere più agevole la lettura, il riutilizzo, e mantenere così ho iniziato ad usarlo sempre di più.

L'unica cosa che ancora non arrivano a comprendere è il motivo per cui dovrei astratto il mio livello di dati. In pratica, se ho bisogno di stampare un elenco di elementi memorizzati nel mio DB al browser faccio qualcosa sulla falsariga di:

$sql = 'SELECT * FROM table WHERE type = "type1"';'
$result = mysql_query($sql);

while($row = mysql_fetch_assoc($result))
{
    echo '<li>'.$row['name'].'</li>';
}

sto leggendo tutti questi how-to o articoli predicare la grandezza della DOP, ma io non capisco perché. Non mi sembra di salvare le LoCs e io non vedo come sarebbe più riutilizzabili in quanto tutte le funzioni che io chiamo sopra sembrano solo essere incapsulati in una classe, ma fare la stessa cosa. L'unico vantaggio che vedo a DOP sono istruzioni preparate.

Non sto dicendo che l'astrazione dei dati è una brutta cosa, sto chiedendo a queste domande perché sto cercando di progettare le mie classi attuali correttamente e hanno bisogno di connettersi a un DB così ho pensato di fare questo il < em> destra modo. Forse sto solo leggendo articoli difettosi sul tema:)

Vorrei davvero apprezzare eventuali consigli, link, o cemento esempi di vita reale in materia!

È stato utile?

Soluzione

Uno degli altri vantaggi di astrazione livello dati deve essere meno dipendenti dal database sottostante.

Con il metodo, il giorno che si desidera utilizzare qualcosa di diverso da MySQL o la vostra colonna cambiamento di denominazione o il php API riguardante il cambiamento mysql, si dovrà riscrivere un sacco di codice.

Se tutta la parte di accesso al database è stato ben riassunto, i cambiamenti necessari sarà minimo e limitato a un paio di file anziché l'intero progetto.

E 'anche molto più facile per il riutilizzo del codice relativa funzione di utilità iniezione o altri sql se il codice è centralizzata in un unico luogo.

Infine, è più facile fare test di unità, se tutto va attraverso alcune classi che su ogni pagina del tuo progetto.

Per esempio, in un recente progetto di mine (mi dispiace, nessuna condivisione di codice è possibile), le funzioni correlate MySQL sono chiamato solo in una classe. Tutto da generazione di query di istanze di oggetti è fatto qui. Quindi è molto per me di cambiare in un altro database o riutilizzare questa classe da qualche altra parte.

Altri suggerimenti

Pensate ad un astrazione strato di dati come un modo per risparmiare tempo in futuro.

Usando il tuo esempio. Diciamo che hai cambiato i nomi delle tabelle. Si dovrebbe andare ad ogni file in cui si dispone di uno SQL utilizzando quel tavolo e modificarlo. Nel migliore dei casi, si trattava di una questione di ricerca e sostituzione di file N. Si potrebbe aver salvato un sacco di tempo e di ridurre al minimo l'errore se si aveva solo per modificare un file, il file che aveva tutti i metodi SQL.

Lo stesso vale per i nomi delle colonne.

E questo sta prendendo in considerazione solo il caso in cui si rinomina roba. E 'anche abbastanza possibile cambiare completamente sistemi di database. SQL potrebbe non essere compatibile tra SQLite e MySQL, per esempio. Si dovrebbe andare a modificare, ancora una volta, un sacco di file.

L'astrazione consente di disaccoppiare una parte dall'altra. In questo caso, è possibile apportare modifiche alla parte del database senza intaccare la parte visuale.

Per molto piccoli progetti questo potrebbe essere più problemi che ne vale la pena. E anche allora, si dovrebbe comunque farlo, almeno per abituarsi ad esso.

Io non sono una persona php ma questa è una questione più generale quindi ecco qui.

Probabilmente stai costruendo qualcosa di piccolo, a volte però anche qualcosa di piccola / media dovrebbe avere uno strato di dati astratto in modo che possa crescere meglio.

Il punto è quello di far fronte alle Cambia

Pensate a questo, avete un piccolo sito di social networking. Pensate i dati si memorizzano, dettagli del profilo, foto, amici, messaggi. Per ognuno di questi avrete pagine come pictures.php?&uid=xxx.

Avrai quindi un piccolo pezzo di SQL lì schiaffeggiato con il codice mysql. Ora, pensare a quanto sia facile / difficile sarebbe per cambiare questo? Si potrebbe cambiare 5-10 pagine? Quando si esegue questa operazione, probabilmente si sbaglia un paio di volte prima di testare a fondo.

Ora, pensare a Facebook. Pensate al numero di pagine ci saranno, pensi che sarà più facile per modifica una linea di SQL in ogni pagina!?

Quando si astrarre l'accesso ai dati in modo corretto:

  1. La sua in un unico luogo, la sua più facile da cambiare.
  2. Quindi è più facile da testare.
  3. La sua più facile da sostituire. (Pensate a quello che avrebbe dovuto fare se si dovesse passare a un altro database)

Spero che questo aiuti

A mio parere, l'accesso ai dati è uno degli aspetti più importanti per separare / out astratta dal resto del codice.

separando vari 'strati' ha diversi vantaggi.

1) Organizza ordinatamente il vostro codice di base. Se si deve fare un cambiamento, saprete subito dove deve essere fatta e dove trovare il codice del cambiamento. Questo potrebbe non essere così tanto di un grosso problema se si sta lavorando su un progetto da soli, ma con una squadra più grande dei benefici può diventare rapidamente ovvio. Questo punto è in realtà piuttosto banale, ma ho aggiunto comunque. La vera ragione è il numero 2 ..

2) si dovrebbe cercare di cose separate che potrebbe aver bisogno di cambiare in modo indipendente l'uno dall'altro. Nel vostro esempio specifico, è concepibile che si vorrebbe cambiare la logica di accesso DB / dati senza impattare l'interfaccia utente. In alternativa, si potrebbe desiderare di modificare l'interfaccia utente senza impattare sul accesso ai dati. Sono sicuro che si può vedere come questo è reso impossibile se il codice è mescolato in uno con l'altro.

Quando il livello di accesso ai dati, è dotato di un'interfaccia ben definita, è possibile modificare il suo funzionamento interno come vuoi, e fintanto che aderisce ancora l'interfaccia si può essere abbastanza certi che non avrete rotto niente più in alto. Ovviamente questo sarebbe ancora bisogno di verificare con il test.

3) Riutilizzo. La scrittura di codice di accesso ai dati può diventare piuttosto ripetitivo. E 'ancora più ripetitivo quando si deve riscrivere il codice di accesso ai dati per ogni pagina che si scrive. Ogni volta che si nota qualcosa di ripetitivo nel codice, campanelli d'allarme dovrebbero suonare. Ripetitività, è soggetto a errori e provoca un problema di manutenzione.

Sono sicuro di vedere le stesse query iniziano ad essere presenti varie pagine diverse? Questo può essere risolto mettendo le query più in basso nel livello di dati. In questo modo aiuta a facilità di manutenzione; ogni volta che una tabella o colonna Nome modifiche, è solo bisogno di correggere l'unico posto nel livello di dati che i riferimenti invece di pesca a strascico attraverso l'interfaccia utente intera e potenzialmente manca qualcosa.

4) Testing. Se si desidera utilizzare strumento automatico per effettuare Unit Testing dovrai tutto ben separati. Come pensate di testare il codice per selezionare tutti i record dei clienti quando questo codice è sparsi in tutta l'interfaccia? E 'molto più facile quando si dispone di una funzione di SelectAllCustomers specifici su un oggetto di accesso ai dati. È possibile verificare questo, una volta qui ed essere sicuri che funzionerà per ogni pagina che l'utilizza.

Non ci sono più motivi che mi lascerò altre persone aggiungere. La cosa principale da togliere è che separando gli strati permette un livello a un cambiamento senza lasciare che il cambiamento ripple attraverso ad altri livelli. Come database e l'interfaccia utente sono aree di un'applicazione / sito web che il cambiamento più frequentemente si tratta di una buona idea per tenerli separati e ben isolati da tutto il resto e gli altri.

Nel mio punto di vista per stampare solo un elenco di elementi in una tabella di database, il vostro frammento è il più appropriato: veloce, semplice e chiara

.

Credo che un po ' astrazione potrebbe essere utile in altri casi a ripetizioni di codice evitano con tutti i relativi vantaggi.

Si consideri un semplice CMS con gli autori, articoli, tag e una tabella di riferimento trasversale per Articoli e tag.

Nella tua home page la query semplice diventerà una più complessa. Vi unirete articoli e gli utenti, allora si avrà recuperare tag correlato per ogni articolo che unisce la tabella tag con la croce un riferimento e il filtraggio dalle article_id.

Si ripeterà questa query con alcuni piccoli cambiamenti nel profilo dell'autore e nei risultati di ricerca di tag.

Utilizzando uno strumento di astrazione come questo , è possibile definire le relazioni una volta e utilizza una sintassi più concisa come :

// Home page
$articles = $db->getTable('Article')->join('Author a')
    ->addSelect('a.name AS author_name');
$first_article_tags = $articles[0]->getRelated('Tag');

// Author profile
$articles = $db->getTable('Article')->join('Author a')
    ->addSelect('a.name AS author_name')->where('a.id = ?', $_GET['id']);

// Tag search results
$articles = $db->getTable('Article')->join('Author a')
    ->addSelect('a.name AS author_name')
    ->join('Tag')->where('Tag.slug = ?', $_GET['slug']);

È possibile ridurre il codice di ripetizione restante incapsulare in modelli e refactoring del codice di cui sopra:

// Home page
$articles = Author::getArticles();
$first_article_tags = $articles[0]->getRelated('Tag');

// Author profile
$articles = Author::getArticles()->where('a.id = ?', $_GET['id']);

// Tag search results
$articles = Author::getArticles()
    ->join('Tag')->where('Tag.slug = ?', $_GET['slug']);

Ci sono altre ragioni buone a astratto più o meno, con i suoi pro e contro. Ma a mio parere per una grande parte dei progetti web il principale è questo:

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