157 votes

La logique de tri doit-elle être placée dans le modèle, la vue ou le contrôleur?

J'ai une liste déroulante qui affiche les valeurs d'un tableau à l'utilisateur final. Je voudrais avoir ces valeurs sont triées par ordre alphabétique.

Selon bon de conception MVC, à ce que la couche de dois-je placer ma logique de tri: le modèle, la vue ou le contrôleur?

EDIT: En réponse à LarsH à la question "voulez-vous dire le code qui détermine l'ordre de tri souhaité? ou le code qui effectue le tri?", J'ai été à l'origine de la référence le code qui détermine l'ordre de tri souhaité.

62voto

Izkata Points 3634

Qui contrôle l'ordre de tri?

Simple MVC diagram (De Wikipedia)

1) l'ordre Naturel à l'intérieur de la donnée elle-même:

L'ordre est une partie du Modèle, de sorte qu'il devrait y aller. Un raw pull de "toutes les données" renvoie les données dans l'ordre de tri, et il n'y a pas d'interface pour choisir l'ordre de tri.

2) L'utilisateur doit contrôler la façon dont ils voient les données:

Le point de Vue de fournir une interface (comme dans l'ordre croissant/décroissant des flèches) qui interagissent avec le Contrôleur et le Modèle comprend des données assez bien pour faire la demande de trier les données. Cependant, une brute tirer des données ne doit pas nécessairement être triés, contrairement à (1).

Dans les deux cas,

La vision ne comprennent pas qu'il existe une sorte d'aller sur, autres que la capacité de montrer de quelle sorte de direction a été choisi. Ne mettez pas la logique là-dedans.

Petite mise en garde

La fonctionnalité de tri pourrait aller uniquement dans le cadre d'une circonstance (que je peux penser de la main gauche; il y a peut être d'autres):

Une "bête" où toutes les données sont déjà dans le point de vue et il n'a pas à utiliser n'importe quel domaine de la connaissance à faire le tri. Très simple chaîne ou un nombre de comparaison, par exemple. Ce n'est pas possible, par exemple, les résultats de recherche sur une page web lorsque les résultats sont susceptibles d'être répartis sur plusieurs pages.

49voto

KyleM Points 1934

(Remarque: cette citation et la citation est tirée de @dasblinkenlight de la réponse, mais nous sommes en désaccord sur notre interprétation de celle-ci. lire son post et de vous faire votre propre idée).

Selon MVC description,

Un contrôleur peut envoyer des commandes à ses associés vue de modifier la vue de la présentation du modèle (par exemple, en faisant défiler un document). Il peut envoyer des commandes pour le modèle pour mettre à jour le modèle de l'état (par exemple, l'édition d'un document).

Logique de tri (par exemple, le tri comparateur/algorithme de tri) appartient au modèle, car il contient des règles métier et des données d'état. Depuis modifiant la façon dont le modèle de données est triée tombe carrément dans le "changer la vue de la présentation du modèle" catégorie, le contrôleur est responsable de "faire le tri" en composant le modèle.changeSortedState() la méthode.

18voto

dasblinkenlight Points 264350

Selon MVC description,

Un contrôleur peut envoyer des commandes à ses associés vue de modifier la vue de la présentation du modèle (par exemple, en faisant défiler un document). Il peut envoyer des commandes pour le modèle pour mettre à jour le modèle de l'état (par exemple, l'édition d'un document).

D'après cette logique de tri appartient au contrôleur, parce modifiant la façon dont le modèle de données est triée tombe carrément dans le "changer la vue de la présentation du modèle" de la catégorie.

EDIT: Pour clarifier les multiples malentendus exprimé dans les commentaires, la "logique de tri" est pas le code qui effectue la sorte; c'est le code qui définit le genre. La logique de tri compare des éléments individuels les uns aux autres pour établir un ordre (e.g par une instance de IComparator<T>) ou contient la logique qui construit un objet à être utilisé pour la commande par un système externe (par exemple à travers un exemple d' IOrderedQueryable<T>). Cette logique appartient à votre contrôleur, car il a besoin de connaissances liées à la "business" sur le côté de votre application. Il est tout à fait suffisant pour effectuer le tri, mais il est distinct du code qui fait accomplit . Le code qui trie peut-être, à votre avis, dans votre modèle, ou même dans la couche de persistance que le dos de votre modèle (par exemple, votre base de données SQL).

11voto

nont Points 3684

Aucun de ceux-ci. Le tri est de la logique métier et la logique métier n'appartient pas à l'un des trois. Pas chaque morceau de code dans votre application sera un modèle, vue, contrôleur ou d'.

Ce que je fais généralement dans mes apps MVC est que j'ai une couche de service qui effectue toutes les affaires de la logique. Les méthodes de la couche de service doit avoir un propre, simple API, avec des paramètres nommés. Vous pouvez ensuite appeler ces méthodes à partir de votre contrôleur pour manipuler les données dans les modèles.

En ce sens, le tri est "le contrôleur", mais le code lui-même qui fait le tri ne doit pas être mis en œuvre dans le contrôleur, n'appelée à partir de là.

8voto

Jens Schauder Points 23468

Définitivement pas le contrôleur: Il envoie des messages de modèle et de la vue, mais devrait le faire aussi peu de travail que possible. Si l'utilisateur peut modifier l'ordre de tri que la demande est prise en charge par le contrôleur en informant le modèle ou le point de vue à ce sujet.

Peut-être que la Vue si c'est une pure Vue de la chose. Si l'Application fonctionne tout aussi bien sans tri le tri est juste une partie de la représentation et de la vue.

Si la commande est partie inhérente de la le domaine, il devrait aller dans le modèle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X