11
votes

Meilleure approche du modèle, de la vue et du contrôleur séparé

Je pense à la meilleure approche de la vue et du contrôleur de modèles séparés - pour Java et en utilisant Eclipse, si cela fait toute différence.

J'ai utilisé pour séparer le MVC de chaque type à l'intérieur de son propre colis, mais je commence à penser que ce n'est pas la meilleure approche:

  • com.company.client (contrôleur)
  • com.company.client.model
  • com.company.client.view

  • com.company.Auher (contrôleur)

  • com.company.another.model
  • com.company.another.view

  • com.company.yetanaTher (contrôleur)

  • com.company.yetanother.model
  • com.company.yetanother.view

    (Supposons beaucoup de paquets différents, chacun avec sa propre vue et modèle)

    J'ai pensé à utiliser:

    • com.company.client
    • com.company.Auher
    • com.company.yetanother

    • com.company.model.client

    • com.company.model.Auother
    • com.company.model.yetanother

    • com.company.view.client

    • com.company.view.Auzer
    • com.company.view.yetanother

      J'ai même pensé à mettre le contrôleur, le modèle et la visualisation dans différents projets. Peut-être qu'il serait encore plus modulaire et je serais plus sûr que la vue n'utilise pas le contrôleur, par exemple (comme le projet de contrôleur inclurait la vue, mais pas l'inverse).

      Quelle est la meilleure approche pour séparer M, V et C?

      (envisager des applications Web et de bureau, pas seulement sur le Web)


6 Réponses :


1
votes

Êtes-vous uniquement préoccupé par la "séparation" du modèle, de la vue et du contrôleur en ce qui concerne la nommage et les colis issus? Cela semble être tout ce que vous demandez.

J'ai tendance à poser mes paquets en tant que tels:

  • com.company.app.domain - classes de modèle de domaine pour l'application, simplement java haricots (getters et setters uniquement, très peu de logique). Ceci est utilisé comme "le modèle" tout au long de l'application et utilisé par chaque couche de mon application.
  • com.company.app.service - classes de niveau de service de l'application, contenant la logique d'entreprise.
  • com.company.app.web.Controls - Classes de contrôleur pour mon webApp. D'autres classes spécifiques au Web sont placées dans divers autres sous-fonds de Web .
  • com.company.app.dao - Interfaces DAO pour accéder aux classes de modèle de domaine - c'est-à-dire pour récupérer un utilisateur de la base de données, etc.

    Dans chacun de ceux-ci, les packages sont parfois décomposés par zone de l'application ou en groupes plus petits en fonction de la fonctionnalité, tout ce qui semble approprié.


2 commentaires

J'ai mis à jour la question demandant de prendre en compte les applications de bureau. Au fait, où est la vue? Dans web.View pkg?


Dans un projet Web, la "vue" est typiquement un modèle et non un morceau de code, il est stocké dans un dossier de ressources (en dehors de l'arbre de code).



1
votes

Je pense qu'il est également important de déterminer comment vous souhaitez utiliser le fait que vous avez divisé des modules séparés dans votre base de code. C'EST À DIRE. Quel type d'utilité autre que la qualité du code de base cherchez-vous à exploiter en fonction de votre schéma d'emballage.

La plupart des applications que je travaille sur la structure d'emballage suivante: * .domain, * .service.subservice, * .dao, * .web.Controls. Cela fonctionne bien pour suivre les dépendances cycliques dans la base de code et / ou les dépendances qui circulent dans le mauvais sens (contrôleur frappant le DAO sans l'indirection d'un service). Il fournit également une structure d'emballage très simple qui est utile et non bourdonnée.

Cependant, cela se décompose lorsque vous examinez des évaluations automatisées de dépendance. J'utilise actuellement dépendancesFinder avec un peu de code personnalisé pour comparer deux fichiers JAR avant qa. DépendencyFinder tire toutes les méthodes modifiées et leurs dépendances de premier niveau associées. Le code personnalisé doit lancer pour cartographier les méthodes / classes modifiées vers des fonctions commerciales et accrocher un fichier graphique graphviz pour rendu un jeu de modifications basé sur la fonction d'entreprise, un graphique de dépendance pour QA. Nous essayons actuellement d'utiliser les résultats de l'outil de planification des tests de régression intelligente, en particulier pour les défauts de production qui se déplacent à la production sans test de régression de plusieurs semaines.

La structure de répertoire que vous proposez fera beaucoup plus facilement le second cas. Cependant, j'ai également constaté que la majeure partie de mon équipe de développement ne s'en soucie pas vraiment de dépendances du tout, l'utilité du vérificateur de dépendance automatique peut varier :)


1 commentaires

Je ne sais pas si je vous comprends bien, mais la chose que je recherche est la modularité et la simplicité, pour que le système se développe sans devenir monstre .. Des modifications soient ajoutées sans beaucoup d'impact, ni beaucoup de bienvenue nécessaires au nouveau développeur.



1
votes

Voici un exemple en utilisant une architecture architecture en couches avec trois couches ( application, domaine, UI ):

dans le modèle-View-contrôleur (MVC) Le modèle serait dans une couche inférieure, telle que com.company.myapp.domain . Toutes les autres couches peuvent accéder au modèle. Ensuite, la vue et le contrôleur seraient dans com.company.myapp.ui . Cela signifie que la classe contrôleur est toujours dans la même couche que celle . Ne confondez pas le contrôleur MVC avec d'autres classes de contrôleur qui fournissent la logique d'application et résident dans la couche d'application. Par exemple, un SalesController dans com.company.myapp.application , qui fournit des opérations système pour gérer les ventes.

Vous pouvez maintenant imaginer que le SalesController modifie certaines données de votre modèle (mise à jour d'une vente) et le modèle informe ensuite le contrôleur MVC qui met à jour la vue.

Remarque: Tous les modèles sont dans le calque domaine . Toutes les vues et contrôleurs MVC sont dans la couche ui . Les contrôleurs logiques commerciaux se trouvent dans le calque application . Vous pouvez bien sûr subdiviser ces trois couches plus loin si vous avez de nombreuses classes avec des préoccupations différentes.

J'espère que cela vous aidera.


0 commentaires

7
votes

la quête graal! Vous avez une matrice de deux dimensions avec des couches verticales (MVC) et horizontales (règles) ...


0 commentaires

3
votes

En supposant que vous devez gérer un projet non trivial, je pense que votre problème a deux aspects à prendre en compte conjointement pour la mise en place d'une architecture et d'une qualité de code:

  • nommer li>
  • Modularisation LI> ul>

    Pour nommer, j'essaie d'avoir la plus haute cohésion dans chaque espace de noms et de suivre le Fermeture commune Principe et Principe de réutilisation commune . P>

    pour la modularisation que j'essaie Pour utiliser un module pour chaque problème principal architectural du projet et nommer facilement ses paquets. p>

    MVC est un motif de module de présentation qui vise à séparer la manière dont le module de présentation contrôle le flux, quels modèles de données il est basé sur Et quelle est la logique liée à la vue. P>

    dans mon IDE Java (par exemple, Eclipse), j'utilise un projet par module, le module Web sera donc un projet et un module de bureau sera un autre projet. Dans un projet Web, par exemple, j'ai un préfixe commune, tel que: p> xxx pré>

    et, j'ai un .controlers em> (ou actions) (ou actions) (ou actions) descendant, un .models em> descendant et ainsi de suite. P>

    com.mycompany.app.domain
    com.mycompany.app.dao
    


0 commentaires

1
votes

Pensez à la façon dont vous développez. Développez-vous par contrôleur / modèle / vue? Ou développez-vous par module. Les chances sont que vous développez sur un module et non sur une couche MVC. Donc, donc je pense qu'il y a de la réponse. Essayez de garder vos noms de votre colis aussi près des modules que votre système représente (que vous faites déjà je suppose). Pas besoin de vous montrer des choix architecturaux dans vos noms de paquet.

Affichage des noms de module et des problèmes de domaine dans votre package Créez une base de code de manière maintenable et cohérente.


0 commentaires