Question

principes de POO étaient difficiles pour moi à saisir parce que, pour une raison que je ne pourrais jamais les appliquer au développement web. Comme je l'ai développé de plus en plus de projets que j'ai commencé à comprendre comment certaines parties de mon code pourraient utiliser certains modèles de conception pour les rendre plus faciles à lire, réutiliser et maintenir donc je commencé à l'utiliser de plus en plus.

COMPREHEND une chose que je peux encore pas tout à fait pourquoi je devrais abstraite ma couche de données. En gros, si je dois imprimer une liste des éléments stockés dans mon DB au navigateur que je fais quelque chose le long des lignes de:

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

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

Je lis tous ces tutoriaux ou des articles prêchant la grandeur de AOP mais je ne comprends pas pourquoi. Je ne semble pas être sauver des lettres de crédit et je ne vois pas comment il serait plus réutilisable parce que toutes les fonctions que j'appel ci-dessus semblent juste être encapsulé dans une classe, mais faire exactement la même chose. L'avantage que je vois à PDO sont des déclarations préparées.

Je ne dis pas abstraction de données est une mauvaise chose, je pose ces questions parce que je suis en train de concevoir correctement actuels mes classes et ils ont besoin de se connecter à un DB, donc je pensais que je ferais cela le < em> droit chemin. Peut-être que je suis en train de lire mauvais articles sur le sujet:)

J'apprécierais vraiment des conseils, des liens ou des exemples concrets de la vie réelle de sur le sujet!

Était-ce utile?

La solution

Un autre avantage de l'abstraction de la couche de données est d'être moins dépendante de la base de données sous-jacente.

Avec votre méthode, le jour que vous souhaitez utiliser autre chose que MySQL ou votre changement de nom de colonne ou l'API php mysql en ce qui concerne le changement, vous devrez réécrire beaucoup de code.

Si toute la partie d'accès de base de données a été soigneusement résumé, les changements nécessaires sera minime et limitée à quelques fichiers au lieu de l'ensemble du projet.

Il est également beaucoup plus facile de code de réutilisation concernant l'injection sql ou d'autres fonction d'utilité si le code est centralisé dans un seul endroit.

Enfin, il est plus facile de faire des tests unitaires si tout va creux certaines classes que sur toutes les pages de votre projet.

Par exemple, dans un récent projet de la mine (désolé, pas de partage de code est possible), les fonctions connexes mysql ne sont appelés à une seule classe. Tout de génération de requête pour instanciation d'objets se fait ici. Il est donc très pour moi de passer à une autre base de données ou réutiliser cette classe un autre endroit.

Autres conseils

Pensez à une abstraire la couche de données comme un moyen de gagner du temps dans l'avenir.

En utilisant votre exemple. Disons que vous avez changé les noms des tables. Vous devez aller à chaque fichier dans lequel vous avez un SQL en utilisant cette table et de le modifier. Dans le meilleur des cas, il était une question de recherche et de remplacement des fichiers N. Vous auriez pu gagner beaucoup de temps et de minimiser l'erreur si vous ne deviez modifier un fichier, le fichier qui avait toutes vos méthodes SQL.

Le même pour les noms de colonnes.

Et ce ne considérant que le cas où vous renommez des choses. Il est également tout à fait possible de changer les systèmes de base de données complètement. Votre SQL pourrait ne pas être compatible entre SQLite et MySQL, par exemple. Vous devez aller et modifier, une fois encore, un grand nombre de fichiers.

Abstraction vous permet de découpler une partie de l'autre. Dans ce cas, vous pouvez apporter des modifications à la partie de base de données sans affecter la partie de la vue.

Pour les très petits projets que cela pourrait être plus d'ennuis que cela vaut la peine. Et même alors, vous devriez le faire encore, au moins pour s'y habituer.

Je ne suis pas une personne php mais c'est une question plus générale donc ici va.

Vous êtes probablement construire petit quelque chose, parfois bien même quelque chose de petit / moyen devrait avoir une couche de données abstraites afin qu'il puisse mieux se développer.

Le but est de faire face à Modifier

Pensez à cela, vous avez un petit site de réseautage social. Pensez aux données que vous allez stocker, les détails de profil, photos, amis, messages. Pour chacun de ces pages, vous aurez comme pictures.php?&uid=xxx.

Vous aurez alors un petit morceau de SQL giflé là-bas avec le code de MySQL. Maintenant, pensez à la façon dont il serait facile / difficile est de changer cela? Vous changeriez 5-10 pages? Quand vous faites cela, vous aurez probablement mal quelques fois avant de le tester à fond.

Maintenant, pensez à Facebook. Pensez au nombre de pages il y aura, pensez-vous qu'il sera plus facile de changement une ligne de SQL dans chaque page!

Lorsque vous abstrait correctement l'accès aux données:

  1. Son dans un endroit, il est plus facile à changer.
  2. Par conséquent, il est plus facile à tester.
  3. Il est plus facile à remplacer. (Pensez à ce que vous auriez à faire si vous deviez passer à une autre base de données)

Hope this helps

A mon avis, l'accès aux données est l'un des aspects les plus importants pour séparer / abstrait du reste de votre code.

La séparation de différentes 'couches' présente plusieurs avantages.

1) Il organise soigneusement votre base de code. Si vous devez faire un changement, vous saurez immédiatement où le changement doit être fait et où trouver le code. Cela pourrait ne pas être tellement d'une grosse affaire si vous travaillez sur un projet sur votre propre mais avec une plus grande équipe les avantages peuvent rapidement devenir évident. Ce point est en fait assez banal, mais je l'ai ajouté de toute façon. La vraie raison est le numéro 2 ..

2) Vous devriez essayer de choses différentes qui pourraient avoir besoin de changer indépendamment les uns des autres. Dans votre exemple précis, il est concevable que vous voulez changer la logique d'accès DB / données sans impact sur l'interface utilisateur. Ou bien, vous pouvez modifier l'interface utilisateur sans impact sur l'accès aux données. Je suis sûr que vous pouvez voir comment cela est rendu impossible si le code est mélangé avec l'autre.

Lorsque votre couche d'accès aux données, dispose d'une interface bien définie, vous pouvez modifier son fonctionnement interne mais vous voulez, et aussi longtemps qu'il adhère toujours à l'interface que vous pouvez être certain qu'il wont a rien de cassé plus haut. Évidemment, cela aurait encore besoin de vérifier avec le test.

3) La réutilisation. code d'accès L'écriture des données peut être assez répétitif. Il est encore plus répétitif lorsque vous devez réécrire le code d'accès aux données pour chaque page que vous écrivez. Chaque fois que vous remarquez quelque chose répétitive dans le code, la sonnette d'alarme devrait retentir. Répétitivité, est sujette à des erreurs et provoque un problème de maintenance.

Je suis sûr que vous voyez les mêmes requêtes apparaître dans différentes pages différentes? Cela peut être résolu en mettant ces requêtes plus bas dans votre couche de données. Cela contribue à l'entretien de la facilité; chaque fois une table ou un changement de nom de colonne, il vous suffit de corriger une place dans votre couche de données que les références au lieu de la pêche au chalut à travers l'ensemble de votre interface utilisateur et quelque chose de potentiellement manquants.

4) Test. Si vous voulez utiliser l'outil automatisé pour effectuer les tests unitaires, vous aurez besoin de tout bien séparés. Comment allez-vous tester votre code pour sélectionner tous les enregistrements clients lorsque ce code est dispersa tout au long de votre interface? Il est beaucoup plus facile quand vous avez une fonction SelectAllCustomers de spécifique sur un objet d'accès aux données. Vous pouvez tester cette fois ici et être sûr que cela fonctionnera pour chaque page qui l'utilise.

Il y a plus de raisons que je vais laisser d'autres personnes ajouter. La principale chose à emporter est que la séparation des couches permet une couche à changement sans laisser l'ondulation de changement par d'autres couches. Comme la base de données et l'interface utilisateur sont des zones d'une application / site que le changement le plus souvent, il est une très bonne idée de les garder séparés et bien isolés de tout le reste et l'autre.

Dans mon point de vue d'imprimer seulement une liste d'éléments dans une table de base de données, votre extrait est le plus approprié: rapide, simple et clair

.

Je pense que un peu plus abstraction pourrait être utile dans d'autres cas pour éviter les répétitions de code avec tous les avantages connexes.

Considérons un CMS simple avec des auteurs, des articles, des tags et une table de références croisées pour des articles et des balises.

Dans votre page d'accueil de votre requête simple deviendra plus complexe. Vous intégrerez des articles et des utilisateurs, vous chercher étiquette associée pour chaque article se joindre à la table des balises avec une référence croisée et le filtrage par article_id.

Vous répétera cette requête avec quelques petits changements dans le profil de l'auteur et dans les résultats de recherche du tag.

L'utilisation d'un outil d'abstraction comme ceci , vous pouvez définir vos relations une fois et d'utiliser une syntaxe plus concise comme :

// 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']);

Vous pouvez réduire la répétition de code restant encapsulant dans les modèles et refactorisation du code ci-dessus:

// 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']);

Il y a d'autres bonnes raisons d'abstraire plus ou moins, avec ses avantages et ses inconvénients. Mais à mon avis, pour une grande partie des projets web principal est celui-ci: P

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top