web-dev-qa-db-fra.com

MVC l'exemple le plus simple

J'ai du mal à comprendre le modèle MVC. J'ai travaillé avec des frameworks MVC comme ASP.NET MVC et Django, mais la structure du projet est à peu près forcée, donc cela n'a vraiment pas aidé à comprendre comment créer mes propres applications en fonction de ce modèle. Pour clarifier les choses, j'ai décidé d'écrire l'exemple le plus simple de ma compréhension de MVC (programme console en Python) et de déterminer s'il y a quelque chose de mal.

|- program:
|—— controller.py
|—— model.py
|—— view.py
|—— db.txt #simulates database

Voici donc ma structure de base. Ce que ce programme va faire, c'est afficher toutes les personnes qui se trouvent dans db.txt. J'utilise db.txt (json) pour simuler une base de données réelle.

controller.py

from model import Person
import view

def showAll():
    #gets list of all Person objects
    people_in_db = Person.getAll()
    #calls view
    return view.showAllView(people_in_db)

def start():
    view.startView()
    input = raw_input()
    if input == 'y':
        return showAll()
    else:
        return view.endView()

if __name__ == "__main__":
    #running controller function
    start()

view.py

from model import Person


def showAllView(list):
    print 'In our db we have %i users. Here they are:' % len(list)
    for item in list:
        print item.name()
def startView():
    print 'MVC - the simplest example'
    print 'Do you want to see everyone in my db?[y/n]'

def endView():
    print 'Goodbye!'    

model.py

import json

class Person(object):

    def __init__(self, first_name = None, last_name = None):
        self.first_name = first_name
        self.last_name = last_name
    #returns Person name, ex: John Doe
    def name(self):
        return ("%s %s" % (self.first_name,self.last_name))

    @classmethod
    #returns all people inside db.txt as list of Person objects
    def getAll(self):
        database = open('db.txt', 'r')
        result = []
        json_list = json.loads(database.read())
        for item in json_list:
            item = json.loads(item)
            person = Person(item['first_name'], item['last_name'])
            result.append(person)
        return result

Voici donc le scénario où l'utilisateur veut voir toutes les personnes dans la base de données: enter image description here

Cette approche est-elle correcte?

26
Kesto

L'architecture MVC est très large et peut changer en fonction du langage de programmation et du type d'application que vous faites, donc dans ce cas, oui, votre approche peut être acceptée comme correcte.

Ce que j'ai appris des langages typés statiques, c'est que vous définissez le modèle et les vues comme des entités distinctes complètes, et le contrôleur prend une instance du modèle et des vues comme paramètres.

Ce que vous devez vous demander pour définir si votre application est MVC est le suivant:

  • Si je change quelque chose dans la vue, est-ce que je casse quelque chose dans le modèle?
  • Si je change quelque chose dans le modèle, est-ce que je casse quelque chose dans la vue?
  • Le contrôleur communique-t-il tout à la fois dans la vue et dans le modèle afin qu'ils n'aient pas à communiquer entre eux?

Si rien ne casse et que le contrôleur fait toutes les communications, alors oui, votre application est MVC.

Vous voudrez peut-être examiner les modèles de conception tels que Singleton, Factory et d'autres qui utilisent tous l'architecture MVC et définir des moyens de l'implémenter.

22
andrralv