2008-09-24 6 views
1

Pardonnez le titre vague, je ne savais pas comment le décrire.MVC modèle/héritage modèle

Si vous avez un modèle générique "Archive", comment afficher des vues/formulaires différents en fonction d'un 'type' sélectionné par l'utilisateur? Par exemple, l'utilisateur crée une nouvelle "archive", puis obtient le choix de la vidéo, du livre, de l'audio, etc. De là, ils obtiennent différentes formes en fonction du type d'archive.

Ou serait-il préférable de les diviser en différents modèles - Vidéo, Livre, Audio?

Ou les modèles peuvent-ils hériter (comme Video extends Archive). Je suppose que ce sont des OOP/classes de base, mais je n'ai aucune idée de comment l'appliquer ici.

Les exemples de n'importe quel cadre MVC sont les bienvenus!

Répondre

3

Apparemment, vous ne voulez pas que le type hérite d'Archive. "Toujours favoriser l'encapsulation/le confinement par rapport à l'héritage". Pourquoi ne pas créer une classe appelée Archive et lui donner une propriété de type. Le type peut utiliser l'héritage pour se spécialiser dans l'audio, la vidéo, etc.

Il semblerait que vous spécialisiez Archive en fonction d'autres critères. "FileSystemArchivce", "XMLArchive", "SQLArchive" et le type ne changera pas. Mais l'agiliste en moi dit que cela peut ne pas être nécessaire au début, et vous pouvez toujours refactoriser le design plus tard ...

En termes de contrôleur, vous obtenez probablement le plus gros pour l'argent en encapsulant les différences de présentation pour chaque type dans la vue. Donc, seule la vue change en fonction du type. Probablement la sémantique et les règles pour chacun sont les mêmes et vous n'auriez pas besoin d'avoir des contrôleurs séparés pour chaque type. Les vues seront différentes pour chaque type car elles auront des attributs différents.

3

Vos modèles Video, Book et Audio peuvent hériter de Archive.

Et chaque modèle aura un contrôleur.

http://yourserver/Books/Edit/11

Vous devez obtenir votre utilisateur de choisir le type d'archive qu'ils veulent avant de créer le modèle correspondant.

EDIT (en réponse à un commentaire)

Dans ASP.NET MVC votre modèle sera une classe.

public class Video : Archive 
{ 
    public int Id {get;set} 
    public string Name {get;set;}  
    ... 
} 

Vous aurez également un contrôleur

public class VideoController : Controller 
{ 
    public object Edit(int id) 
    { 
     Video myVideo = GetVideo(id); 
     return View("Edit", myVideo); 
    } 
    ... 
} 

Et vous aurez une vue dans le répertoire Vues par exemple, la page qui contient

public class Edit : View<Video> 
{ 
    ... 
} 

Alors vous pouvez appeler cela si vous aviez une URL qui était

http://localhost/Video/Edit/11

Tout cela a été effectué à partir de la mémoire, il peut donc y avoir quelques erreurs, mais le message à retenir est que vous spécifiez l'héritage au modèle. Le modèle est juste une classe. Dans votre cas, vous souhaitez hériter de Archive. Une fois que vous avez fait cela, le modèle est transmis comme d'habitude.

+0

Merci. Pourriez-vous donner un exemple de comment spécifier l'héritage du modèle? – meleyal

0

Il me semble qu'un point solide en faveur de MVC est que vous n'avez pas besoin de personnaliser le modèle (ou le contrôleur - dont vous voulez un seul) si tous les besoins de l'utilisateur est une vue différente. Plusieurs modèles n'apparaîtraient que si l'architecture de stockage (persistance) en imposait le besoin. Certaines fonctionnalités, telles que les objets d'accès aux données (DAO), pourraient apparaître comme un autre niveau, entre le contrôleur et le modèle, si vous avez besoin de plusieurs modèles.

Jetez un coup d'œil au projet Apache Struts pour des exemples. Comme indiqué dans Struts for Newbies, «Pour bien utiliser Struts, il est important d'avoir une bonne compréhension des principes fondamentaux.Remarquez en commençant par le Key Technologies primer et en étudiant les sujets qui ne vous sont pas familiers."

Pour une autre ressource, consultez Web-Tier Application Framework Design (Sun J2EE Blueprints)

3

Pour afficher en réalité un point de vue différent devrait être facile dans un framework MVC. Par exemple, dans Microsoft ASP.NET MVC vous pas simplement retourner une vue d'un contrôleur comme suit:

return View(); 

mais indiquerait en fait le nom de la vue comme paramètre:

return View("VideoArchive"); 

qui serait puis affichez la vue à partir de Views/Archive/VideoArchive.aspx

0

Le Single Responsibility Principle (PDF) indique que:

IL NE DOIT JAMAIS ÊTRE PLUS D'UNE RAISON POUR UNE CLASSE AU CHANGEMENT.

Votre classe Archive viole ce principe en gérant plusieurs types d'archives différents. Par exemple, si vous avez besoin de mettre à jour l'archive vidéo, vous modifiez également la classe qui gère les archives audio et livre.

La façon appropriée de gérer cela est de créer des classes séparées pour chaque type d'archive. Ces types devraient implémenter une interface commune (ou hériter d'une classe de base commune) afin qu'ils puissent être traités de manière interchangeable (polymorphiquement) par du code qui ne se soucie que des archives, pas des types d'archives spécifiques. Une fois la hiérarchie de classe en place, vous n'avez besoin que d'un seul contrôleur et d'une seule vue pour chaque classe de modèle. Pour les points bonus, le principe de responsabilité unique peut même justifier l'utilisation d'une méthode d'usine ou d'une fabrique abstraite pour créer vos objets modèle, vue et contrôleur (plutôt que de les ajouter en ligne). Après tout, la création d'un objet et l'utilisation de cet objet sont des responsabilités différentes, qui peuvent devoir être modifiées pour différentes raisons.