Ce n'est peut-être pas la meilleure idée de considérer les rails comme un élément de base du modèle de conception MVC. Ledit cadre a été créé avec quelques lacunes inhérentes (je l'ai un peu développé dans un article différent ) et la communauté vient de commencer à s'attaquer aux retombées. Vous pouvez considérer le développement de DataMapper2 comme la première étape majeure.
Une théorie
Les personnes qui donnent ce conseil semblent être affligées par une idée fausse assez courante. Alors laissez-moi commencer par clarifier les choses: le modèle, dans le modèle de conception MVC moderne, n'est PAS une classe ou un objet. Le modèle est une couche.
L'idée principale derrière le modèle MVC est la séparation des préoccupations et la première étape est la division entre la couche de présentation et les couches de modèle. Tout comme la couche de présentation se décompose en contrôleurs (instances, responsables de la gestion des entrées utilisateur), vues (instances, responsables de la logique de l'interface utilisateur) et modèles / mises en page, la couche de modèle en fait autant.
Les principaux composants de la couche de modèle sont les suivants:
Objets de domaine
Également connu sous le nom d'entités de domaine, d'objets métier ou d'objets de modèle (je n'aime pas ce dernier nom car il ne fait qu'ajouter à la confusion). Ces structures sont ce que les gens appellent à tort des «modèles». Ils sont responsables de contenir les règles métier (toutes les mathématiques et la validation pour une unité spécifique de la logique de domaine).
Abstractions de stockage:
Habituellement implémenté à l'aide d' un modèle de mappeur de données (ne pas confondre avec les ORM , qui ont abusé de ce nom). Ces instances sont généralement chargées du stockage et de la récupération des informations dans les objets du domaine. Chaque objet de domaine peut avoir plusieurs mappeurs, tout comme il existe plusieurs formes de stockage (DB, cache, session, cookies, / dev / null).
Prestations de service:
Structures responsables de la logique d'application (c'est-à-dire interaction entre les objets du domaine et interaction entre les objets du domaine et les abstractions de stockage). Ils doivent agir comme "l'interface" à travers laquelle la couche de présentation interagit avec la couche modèle. C'est généralement ce qui se retrouve dans le code de type Rails dans les contrôleurs.
Il existe également plusieurs structures qui peuvent se trouver dans les espaces entre ces groupes: les DAO , les unités de travail et les référentiels .
Oh ... et quand on parle (dans le contexte du web) d'un utilisateur qui interagit avec l'application MVC, ce n'est pas un être humain. L '«utilisateur» est en fait votre navigateur Web.
Alors qu'en est-il des divinités?
Au lieu d'avoir un modèle effrayant et monolithique avec lequel travailler, les contrôleurs devraient interagir avec les services. Vous transmettez les données de l'entrée utilisateur à un service spécifique (par exemple MailService
ou RecognitionService
). De cette façon, le contrôleur change l'état de la couche de modèle, mais cela se fait en utilisant une API claire et sans jouer avec les structures internes (ce qui provoquerait une abstraction qui fuit).
De telles modifications peuvent provoquer une réaction immédiate ou affecter uniquement les données que l'instance de vue demande à la couche de modèle, ou les deux.
Chaque service peut interagir avec n'importe quel nombre (cependant, ce n'est généralement qu'une poignée) d'objets de domaine et d'abstractions de stockage. Par exemple, le RecogitionService
ne se soucie pas moins des abstractions de stockage pour les articles.
Notes de clôture
De cette façon, vous obtenez une application qui peut être testée unitaire à n'importe quel niveau, a un faible couplage (si elle est correctement mise en œuvre) et une architecture clairement compréhensible.
Cependant, gardez à l'esprit: MVC n'est pas destiné aux petites applications. Si vous écrivez une page de livre d'or en utilisant le modèle MVC, vous le faites mal. Ce modèle est destiné à faire respecter la loi et l'ordre dans les applications à grande échelle.
Pour les personnes qui utilisent PHP comme langue principale, cet article pourrait être pertinent. C'est une description un peu plus longue de la couche de modèle avec quelques extraits de code.