Pourquoi tout le monde place les contrôleurs dans un dossier et les vues dans un autre?


36

Je me prépare à prendre le virage de asp et dans un framework mvc, asp.net mvc ou nancy. Partout où je vais, je vois des dossiers pour les contrôleurs / modules et des dossiers pour les vues. Est-ce juste un réflexe pavlovien consistant à ranger les choses par type, ou y a-t-il une sagesse plus profonde qui opère? J'ai un petit projet de validation de concept dans lequel je stocke ensemble les fichiers que je suis susceptible d'ouvrir ensemble, ce qui me procure un confort considérable. Comme ces fichiers sont également susceptibles de s’appeler, ils peuvent le faire avec des liens relatifs plus courts et moins fragiles. Mvc conteste ce modèle, car le chemin du dossier ne correspond plus automatiquement au chemin de l'url et, dans asp.net mvc, les modèles de projet et le routage appliquent les vues \ controllers \ schism.

Cette page de Microsoft introduit le concept de zones. Cela peut être lu comme un aveu de la lourdeur des grandes applications à cause de cette séparation artificielle.

Les gens s'opposeront à la "séparation des préoccupations", mais la séparation des préoccupations est déjà réalisée en disposant de fichiers sources séparés. Il me semble qu’il n’ya aucun avantage concret à prendre ces fichiers source étroitement couplés et à les envoyer aux extrémités opposées de la structure de dossiers?

Est-ce que quelqu'un d'autre lutte contre ça? Des conseils?


3
Vous ne pensez pas qu'il est logique de séparer les fichiers de code back-end des fichiers de vue? Si nous prenons déjà la direction, pourquoi ne pas mettre également les fichiers CSS et JavaScript appropriés dans le même dossier?
Alternatex

2
Si vous obtenez Resharper, F12 sur l'appel Viewdu contrôleur vous amène à la vue et la première option du menu contextuel de la vue vous conduit au contrôleur, et le problème de l'absence de navigation disparaît.
Pete Kirkham

4
@Alternatex Je suis désolé mais je ne vois pas comment un contrôleur est "back-end". Il est étroitement associé à ses vues. La vue n'est pas bonne sans contrôleur, le contrôleur ne sert à rien sans vue. Un jour, vous voudrez les supprimer ensemble. C'est pour moi le meilleur test de ce qui est réuni dans un dossier? À moins que quelqu'un puisse me montrer un meilleur moyen?
bbsimonbb

2
Les vues sont la couche de présentation. Les contrôleurs sont des couches contenant des services pouvant contenir des objets de votre domaine, contenant votre logique métier, qui contiennent donc la logique back-end de votre application. Les vues ne comprennent que des conditions triviales et des boucles simples pour l'itération sur des collections. Si vos vues contiennent autre chose, vous le faites mal. Comme pour la structure régulière, vous avez séparé le back-end et le front-end, ce qui pour moi est une meilleure structure que celle que vous proposez.
Andy

10
Donc, personne ne manque de gens pour me dire qu'un contrôleur est de la vaisselle, alors il va dans le placard à vaisselle. Les vues sont des lunettes alors elles vont dans le placard en verre. Je sais qu’un contrôleur est de la vaisselle, mais je propose que ce soit bien d’avoir une armoire à lunch et une armoire pour le dîner, car nous parlons de choses qui ne sont utilisées que pendant le déjeuner ou le dîner.
bbsimonbb

Réponses:


38

J'aimerais dire qu'il s'agit d' une programmation culte de la cargaison , mais cette structure a des raisons techniques. Asp.Net MVC a adopté une convention concernant la configuration pour presque tout. Par défaut, le moteur de vue Razor effectue une recherche dans le Viewsrépertoire afin de déterminer la vue à retourner à partir du contrôleur. Il existe cependant quelques astuces pour obtenir une structure de projet différente et Microsoft fournit même une fonctionnalité MVC appelée Areas pour nous permettre de créer une structure de projet plus saine. Vous pouvez également implémenter votre propre moteur de vue afin de spécifier où chercher les vues.

Pourquoi est-ce que je dis que c'est de la programmation culte du fret et que vous avez raison? Oncle Bob m'a convaincu que la structure de répertoires du projet ne devrait pas me dire que c'est une application MVC. Cela devrait me dire que c'est un magasin, un système de demande de congés, ou autre chose. La structure et l'architecture de haut niveau devraient nous indiquer en quoi consiste cette chose et non comment elle a été mise en œuvre.

En bref, je pense que vous avez raison à ce sujet, mais toute autre structure de répertoires lutterait simplement contre le cadre et croyez-moi quand je dis que vous ne voulez pas essayer de faire en sorte que le cadre Asp.Net MVC fasse quelque chose qui n’était pas le cas. pas conçu pour faire. Dommage que ce ne soit pas vraiment configurable.


Pour résoudre rapidement les problèmes d’architecture, j’estime toujours que les modèles commerciaux (entreprise, pas de vue) et le DAL doivent résider dans un projet / une bibliothèque distinct (e) appelé (e) depuis votre application MVC.

C'est juste que le contrôleur est vraiment très étroitement associé à la vue et susceptible d'être modifié ensemble. Il est judicieux de garder à l'esprit la différence entre le couplage par dépendance et le couplage logique. Le fait que les dépendances du code aient été découplées ne le rend pas moins couplé logiquement.


1
Le moyen complet de contrôler où rasoir cherche des vues est ici . Je pourrais juste persévérer.
bbsimonbb

3
J'ai regardé oncle Bob, à x 1,25 comme suggéré. Cela me laisse penser que si les architectes informatiques construisaient des bâtiments, nous vivrions tous sur de petits groupes de radeaux attachés ensemble, flottant sur un lac. La vie ne serait pas nécessairement plus simple.
bbsimonbb

1
C'est un peu plus compliqué. Pour co-localiser réellement les contrôleurs et les vues, vous souhaiterez résoudre le chemin de la vue lors de l'exécution afin d'inclure l'espace de nom du contrôleur. Voici comment le faire .
bbsimonbb

1
Jetez également un coup d'œil au développement logiciel orienté fonction ( fosd.net ), qui constitue la contrepartie universitaire de ce que décrit Oncle Bob.
ngm

1
La loi de Conway au travail. Je suis sûr que cela fonctionne dans votre entreprise @Flater. La présentation standard de MVC fonctionne dans de nombreuses entreprises, mais je préfère quand même regrouper les choses par sémantique plutôt que par syntaxe. Les entreprises pour lesquelles je travaille ont été organisées autour de produits plutôt que de rôles / fonctions. Je crois que c'est la racine de ma préférence ici.
RubberDuck

9

Quelle que soit la raison, c'est une mauvaise pratique. Il est très anti-OO car les paquetages ou les dossiers (peu importe comment vous les appelez) devraient avoir des interdépendances faibles. Les classes (ou fichiers) qu’elles contiennent doivent avoir de fortes interdépendances.

En plaçant toutes les vues dans un dossier et tous les contrôleurs dans un autre dossier, vous créez deux packages avec un couplage très étroit. Cela va à l’encontre du principe de faibles dépendances inter-packages.

Une vue et un contrôleur sont deux moitiés d'un tout et devraient appartenir l'un à l'autre. Vous n'auriez pas un tirage d'armoire pour les chaussettes du côté gauche et un autre pour les chaussettes du côté droit.


6

Pour répondre à votre "Pourquoi tout le monde ...?" question: voici quelques raisons potentielles, bien que je ne sois pas tout à fait sûr de savoir quelle combinaison est une véritable cause, puisqu'il s'agit en fait d'une question subjective

  • Pour répliquer l'architecture logique (modèle, vue, contrôleur) avec un dossier et une structure d'espace de noms correspondants

  • En dehors des conventions et de la commodité, suivre le modèle de projet ASP.net MVC

  • Pour grouper par espace de noms, puisque le Controllers/dossier mènera à un .Controllersespace de noms

  • Peut activer certains scénarios dans DI / IoC où les classes de contrôleur ne sont interrogées / analysées qu'à partir d'un espace de noms contenant / ends-avec 'Contrôleurs' (cela peut être erroné)

  • Permettre aux modèles T4 d'analyser et d'échafauder des modèles et des contrôleurs afin de générer des vues

Vous pouvez toujours créer et suivre votre propre convention si cela a du sens pour votre projet, personne ne peut / ne vous arrêtera. Mais gardez à l'esprit que si vous travaillez dans un grand projet et / ou une grande équipe, la convention par défaut connue de tout le monde peut constituer un meilleur choix (mais pas nécessairement la bonne!).

Si votre convention est plus facile à suivre et n'entrave pas la productivité, alors faîtes-le! et peut-être même écrire un article de blog ou deux pour le socialiser avec la communauté des développeurs et obtenir des commentaires


2

L'une des raisons de conserver les vues et les contrôleurs dans des répertoires distincts est lorsque des développeurs front-end et back-end travaillent sur un projet. Vous pouvez empêcher les développeurs frontaux d'accéder au code final (par exemple, pour aider à la conformité PCI, restreindre l'accès aux codes sensibles).

Une autre raison est qu'il est plus facile d'avoir des "thèmes" et de supprimer tous les modèles en apportant une modification mineure au chemin de la vue.

Une troisième raison est d'avoir un modèle de répertoire simple lors de la spécification de vues dans l'infrastructure MVC. Il est plus facile de spécifier le sous-répertoire et le fichier plutôt qu'un long chemin d'accès à chaque vue.

Le seul "couplage étroit" devrait être:

  1. Variables envoyées dans la vue par le contrôleur.
  2. Champs de formulaire ou actions dans la vue, renvoyés au contrôleur.

J'utilise un contrôleur générique et j'essaie de conserver les noms de variables dans la vue générique, de sorte que plusieurs vues puissent utiliser le même contrôleur et que de nombreux contrôleurs puissent utiliser la même vue. Pour cette raison, je préfère garder les points de vue entièrement séparés. Le modèle est l'endroit où vous pouvez différencier chaque "élément" de votre application - il peut s'agir d'objets avec une liste de propriétés et de méthodes pour accéder / modifier ces propriétés.

Pour le code étroitement couplé, une approche qui pourrait fonctionner pour vous consiste à conserver tous les fichiers qui font partie d’un package ou d’un "module" ensemble dans un répertoire namespaced. Vous pouvez ensuite utiliser un script pour copier ou "compiler" vos modèles bruts dans le répertoire "vues" principal. Par exemple:


    lib/my-namespace/my-package/
        -> controllers/
        -> models/
        -> views/
            -> theme/
               -> template-name1
    app/compiled_views/theme/
        -> url/path/template-name1

Malheureusement, si vous souhaitez modifier la structure d'un thème existant, les répertoires de paquetage sont plus compliqués pour mettre à jour les vues.

Considérez que les vues ne sont qu'un moyen de formater des données, que ce soit en json, xml, csv ou html. Cela est particulièrement utile si vous souhaitez que votre application fonctionne également en tant qu'API. Essayez de découpler la vue des données en utilisant des noms de variables génériques, de sorte que vous puissiez utiliser le même modèle pour de nombreux contrôleurs ou modèles (ou utiliser includes pour minimiser la quantité de code que vous devez gérer).


1

Pas nécessairement tout le monde fait ça. Par exemple, le framework Django de python a le concept d'une application, où les sous-modules de votre application vivent dans leurs propres répertoires avec leurs propres modèles, vues et modèles (les vues sont essentiellement ce que Django appelle les contrôleurs). Je préfère cette façon de faire parce que cela signifie que je peux facilement empaqueter une "application" et la réutiliser dans des projets simplement en l'incluant dans la liste des applications dans les paramètres de mes projets. Il est également plus facile de savoir où se trouvent les différentes parties. Si je regarde le fichier urls.py et que url(r'^users/', include('my_site.users.urls'))je vois quelque chose comme , je sais que le module my_site.userscontient tout le code qui gère les utilisateurs. Je sais regarder les modules my_site.users.viewset my_site.users.modelsquand je veux voir comment les utilisateurs sont créés et authentifiés. Je sais que tous mes itinéraires sont définis dans my_site.users.url.

De plus, s'il est assez générique, je peux probablement utiliser ce module dans d'autres sites en modifiant simplement la configuration ou en le conditionnant sous forme de bibliothèque et en le publiant sous forme de logiciel libre.


1

N’oubliez pas que c’est la méthode recommandée par Microsoft pour conserver les contrôleurs et les vues dans un dossier différent, de sorte que bon nombre d’entre eux respecteraient la structure recommandée.

  1. L'une des raisons pourrait être que les contrôleurs n'ont pas toujours une relation un à un avec les vues, en particulier les vues partielles peuvent être partagées entre les contrôleurs.
  2. Une autre raison pourrait être que lorsque votre projet grandit, vous souhaiterez peut-être extraire les contrôleurs et les tests unitaires vers un autre projet, mais il est assez difficile de faire la même chose, car les vues et les vues / js / css vont ensemble car elles se réfèrent.

Cela dit, il existe de nombreux articles sur le sujet, comme celui- ci .


"c'est la méthode recommandée par Microsoft" ... Pouvez-vous préciser ce que vous entendez par là? Existe-t-il un article MS faisant autorité sur ce sujet? Ou bien s'agit-il simplement de la configuration de projet par défaut pour une application MVC? Et, si vous vous basez sur ce dernier point, n’est-il pas possible que la configuration de projet MVC par défaut soit ce qu’elle est car c’est ainsi que "tout le monde" le fait?
svidgen

1
Basé sur l'article msdn.microsoft.com/en-us/library/…, il est écrit "Contrôleurs, qui est le recommandé" et ainsi de suite pour les vues, etc.
Low Flying Pelican

0

Pour le compte rendu

Pourquoi est-ce que je dis que c'est de la programmation culte du fret et que vous avez raison? Oncle Bob m'a convaincu que la structure de répertoires du projet ne devrait pas me dire que c'est une application MVC. Cela devrait me dire que c'est un magasin, un système de demande de congés, ou autre chose. La structure et l'architecture de haut niveau devraient nous indiquer en quoi consiste cette chose et non comment elle a été mise en œuvre.

Question: Qui a accès au code?. Programmeurs. Les utilisateurs finaux se soucient-ils du code?. Et ce que fait un programmeur, code. Ou plus spécifiquement, des classes basées sur des types (contrôleurs, service, modèle, etc.). Il est donc logique et facile de déboguer un code si vous êtes en mesure de trouver un code basé sur le type de code, plutôt que sur le comportement du code. De plus, disons un projet d'équipe, l'un est responsable du contrôleur, un autre du modèle, un autre du dao et un autre de la vue. Il est facile de séparer le projet en plusieurs parties. Un bon code est un code facile à déboguer, pas un code sucre de syntaxe. Oncle Bob a encore tort.

Essayer de reproduire le comportement du projet (une devanture de magasin) est un culte du fret.


3
Quand je code, je me soucie le plus des fonctionnalités, pas des types. Lorsque je vois une fonctionnalité ne fonctionnant pas comme prévu, je sais que quelque chose ne va pas dans le code associé à cette fonctionnalité, mais je ne sais pas nécessairement de quel type de code il s'agit.
Arrêtez de blesser Monica

1
"Disons qu'un projet d'équipe, l'un est en charge du contrôleur, l'autre le modèle, l'autre le dao" Une telle équipe aura du mal à expédier quoi que ce soit et quand elle le fera, cela coûtera beaucoup plus cher en frais de communication et en bugs.
RubberDuck

Comme établi dans une chaîne de commentaires sous la réponse acceptée, vous avez un point mais seulement dans certains cas. Lorsqu'une entreprise se concentre sur des projets MVC qu'elle vend à de nombreux clients variés, il est logique de conserver une structure MVC pour la réutiliser. Lorsqu'une entreprise se concentre sur un créneau (par exemple, les boutiques en ligne) et utilise éventuellement de nombreuses technologies différentes, il est plus logique de disposer d'une structure orientée boutique en ligne. Ceci est une application pratique de la loi de Conway . Le code (et donc aussi la structure du projet) doit suivre la structure de l'entreprise.
Flater

@RubberDuck: Vous pouvez argumenter pour un coût supplémentaire dans les deux sens. Vous avez raison de dire que, lorsque différentes personnes réalisent différents composants techniques, la communication de la logique métier est accrue. Cependant, si vous avez différentes personnes qui implémentent complètement différentes fonctionnalités, vous devrez peut-être supporter des coûts supplémentaires si vous vous assurez que tout le monde est prêt à utiliser la même approche technique. Dans les deux cas, vous avez besoin de temps de communication pour vous assurer que les personnes travaillent ensemble.
Flater

Oui, les transferts coûtent toujours plus cher que d'avoir une seule paire de développeurs implémentant une fonctionnalité de bout en bout pour l'IME.
RubberDuck
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.