62

我想学习 MVC“架构模式”,但我还不想跳入像 Rails 或 Django 这样的框架。我想先了解一下这个概念,然后在我目前熟悉的环境中写一些简单的代码,这个环境恰好是 PHP/HTML/CSS/MySQL。我不一定需要基于 PHP 的教程,因为我确实了解很多不同的语言。而且我不想安装任何框架、API 或库。我只想学习如何在 MVC 中思考并将其应用到我的项目中。有什么建议么?

4

5 回答 5

28

几乎每个框架都以不同的方式执行 MVC,因此您最终可能会变得更加困惑。MVC 的一般原则非常简单:“模型即状态;视图对模型作出反应;控制器对视图作出反应;控制器改变模型”。模型、视图和控制器是概念——它们是你认为的任何东西。类、类群、带有 XML 配置文件的类的实例,应有尽有。

我实际上认为这涵盖了基本原则。没有框架,你就不会走得更远。重要的是特定框架如何定义模型、视图和控制器及其交互。

于 2008-09-30T07:40:09.513 回答
20

MVC 基本上只是将您的代码拆分为一个处理数据的模型、一个显示数据的视图和一个将数据从模型传递到视图的控制器。

这不是您需要 API 或框架的任何东西,它只是一种拆分代码的方式。许多框架使用它的原因是因为它是一个非常简单的概念,它适用于许多事情(它非常适合网页),并且相当灵活(例如,使用 Rails,您可以在视图中做所有事情,或者模型/控制器,如果你愿意的话..)

Python 中的一个快速示例,一个示例 MVC 结构化 Python 脚本。不一定是“最佳实践”,但它有效,而且相当简单:

class Model:
    def get_post(self, id):
        # Would query database, perhaps
        return {"title": "A test", "body": "An example.."}

class Controller:
    def __init__(self):
        self.model = Model()
        self.view = View()

    def main(self):
        post = self.model.get_post(1)
        self.view.display(post)

class View:
    def display(self, item):
        print "<h1>%(title)s</h1>\n%(body)s" % item

c = Controller()
c.main()
于 2009-03-01T04:40:17.703 回答
7

除了 Sander 的回复,我想说大多数框架都混淆了前端控制器MVC。它们实际上是两个完全独立的概念,但它们通常都存在于框架中。所以要注意这一点。

于 2008-09-30T10:38:25.153 回答
1

MVC 的主要优点是关注点分离。当您编写代码时,如果您不小心,它可能会变得一团糟。因此,从长远来看,知道如何将模型、视图和控制器放在不同的“孤岛”中可以节省您的时间。任何策略都是好的。

所以这是我的:

  • 模型是在项目树的 /lib 下找到的文件
  • 视图是项目树中以 .html 结尾的文件
  • 控制器是 <form> 动作属性中的 url
于 2008-10-01T00:08:02.400 回答
1

知道已经很晚了,但我相信人们稍后会提出同样的问题。

我认为上面非常好的代码示例最好这样写,但是 YMMV:

#!/usr/bin/python
class Model:
  def get_post(self):
    return {"title":"A test","body":"An example.."}

class View:
  def display(self,items):
    print 'Title:',items['title'],'\n'+'Body:',items['body']

class Controller:
  def __init__(self):
    self.model=Model()
    self.view=View()

  def main(self):
    post=self.model.get_post()
    self.view.display(post)

mvc=Controller()
mvc.main()

这是另一个使用继承的示例,它在 python/php 中非常有用.....

#!/usr/bin/python3
class Control:
  def find(self,user):
    return self._look(user)

  def _look(self,user):
    if user in self.users:
      return self.users[user]
    else:
      return 'The data class ({}) has no {}'.format(self.userName(),user)

  def userName(self):
    return self.__class__.__name__.lower()

class Model(Control):
  users=dict(one='Bob',two='Michael',three='Dave')

class View():
  def user(self,users):
    print(users.find('two'))

def main():
  users=Model()
  find=View()
  print('--> The user two\'s "real name" is:\n')
  find.user(users)

if __name__=="__main__":
  main()

如果这是有道理的,现在就去 django 你准备好了。如果这有意义,请阅读免费书籍,您将快速阅读它。您的权利,尽管您必须能够在使用 django 之前了解 OOP 和 MVC 范例,因为它是通过这些范例构建和使用的。

如您所见,它并不复杂,它只是保持代码有序的众多方法之一。

这解释了 django 中的 MVC

于 2011-02-06T14:30:03.833 回答