3

我一直很难理解 MVC、MVP、MVVM 等的完整概念。我什至不确定我是否遵循这些模型中的任何一个,所以我希望你们中的一些人能有所了解。我的应用程序使用 PHP、JS、HTML、CSS、AJAX、MySQL 作为其核心。

看法

我知道 HTML/CSS 显然是 View,但有时,我让 PHP 生成 HTML 元素。另外,有时我让 JS 操作 HTML 元素来修改它的 CSS。我的意思是,PHP 在技术上是一种服务器端语言,对吧?那么 PHP 可以生成“视图”元素这一事实是否改变了它在编程模式中的角色?

处理 AJAX 请求的专用文件

我有一个 PHP 文件来处理从 JS 发送的所有 AJAX 请求。我传递了一个唯一的 POST 或 GET 参数来区分 AJAX 请求的用途,并且 PHP 文件有一堆 If 语句来处理这些。

$req = $_REQUEST['type'];
if($req == 'get_users'){
// do stuff
}

大多数功能是数据库写入和读取。我是否正确地认为这是控制器?

模型

我假设模型是我定期调用的一组函数和类?

概括

我的主要问题是,一种编程模式是否可以应用于不止一种编程语言,即使一种是客户端,另一种是服务器端。我什至遵循编程模式吗?如果我不是或有点接近一个,如果我没有完全遵循一个模式,这有关系吗?我认为这就是阻碍我的原因,希望大家能帮助我理解。

4

3 回答 3

3

我知道 HTML/CSS 显然是 View,但有时,我让 PHP 生成 HTML 元素。

视图实际上应该是包含表示逻辑的实例。他们从模型层获取信息,并根据这些信息决定向用户发送什么响应。响应可以只是一个 HTTP 标头,也可以是一个 HTML 文档,该视图由多个模板组合而成。

那么 PHP 可以生成“视图”元素这一事实是否改变了它在编程模式中的角色?

这有点涉及到您不能实现经典 MVC(为 smalltalk定义)的主题,因为视图应该观察模型的变化。这对于网络来说是非常难以实现的,非常不切实际并且根本无法扩展。而对于 web,我们倾向于使用 Model 2 MVC、MVP 和 MVVM 模式,这些模式是受原始 MVC 启发的。还有 HMVC 模式,它实际上与 MVC 无关,但试图解决相同的问题。

所有这些受 MVC 启发的模式在实现表示层的方式上有所不同,这也是视图。在 Model2 MVC 模式中,您有一个活动视图,它从模型层请求信息。在 MVP 和 MVVM 中,视图是被动的,通过类似控制器的结构接收数据。

大多数功能是数据库写入和读取。我是否正确地认为这是控制器?

如果我明白你的意思,那么:不,不是。

在所有受 MVC 启发的模式中,控制器或类似控制器的结构主要负责更改模型层和视图的状态。在 MVP 和 MVVM 中,它还从模型层请求数据,在 MVVM 中它甚至可以操作它。

但是与存储(可能是也可能不是 SQL 数据库)的交互深埋在模型层中。有一个更长的帖子,我写的关于这个主题。

我假设模型是我定期调用的一组函数和类?

不完全正确。请参阅上面的链接。

我什至遵循编程模式吗?

没有代码很难说,但我很有信心,你没有严格遵循任何受 MVC 启发的设计模式。您正在做的是实现某种形式的SoC,这是 MVC 的核心原则。我会说您正处于 PHP 开发人员真正开始研究 OOP 原则和模式以进一步改进的阶段。

于 2012-08-31T14:54:01.167 回答
2

大多数功能是数据库写入和读取。我是否正确地认为这是控制器?

如果是:

  1. 根据 URL 决定如何处理请求,然后它就完成了控制器的角色
  2. 与数据库交互,应用业务逻辑并返回一些数据,然后它就完成了模型的角色
  3. 使用该数据生成 HTML / JSON / XML / 发送给客户端的任何其他内容,然后它正在履行视图的角色

如果它正在执行上述多个操作,那么它就是不同角色的大杂烩,您应该考虑将您的关注点分开。

我假设模型是我定期调用的一组函数和类?

模型是与您的数据交互并执行业务逻辑的代码。

我的主要问题是,一种编程模式是否可以应用于不止一种编程语言,即使一种是客户端,另一种是服务器端。

是的。

您可以让客户端 JavaScript 编辑 DOM(视图),根据用户输入(控制器)决定做什么,并使用 XMLHttpRequest 从服务器(模型)获取数据。

然后,您可以让 PHP 为该 JS(视图)生成 JSON,根据来自 JS(控制器)的请求中的数据来决定要做什么,并与数据库交互以获取响应的数据(模型)。

我什至遵循编程模式吗?

听起来您可能正在遵循上帝的反模式,但您只是简要概述了您在做什么。

于 2012-08-31T13:34:12.273 回答
0

I mean, PHP is technically a server-side language right?

是的,没错。(虽然它可以在本地使用,但它甚至可以编译生成桌面应用程序二进制文件等。)

So does the fact that PHP can generate "View" elements change its role in the programming pattern?

不,核心“视图”概念是它与应用程序其他部分的分离。理想情况下,“视图”层中不会有任何业务逻辑、数据库查询等。例如:首先,你做所有的计算和操作。作为最后一步,您将结果转换为“视图”以供输出(如 HTML、XML 或 JSON...) 您没有将“echo”语句与 SQL 查询混合在一起。

Do I have it right that this is the controller?

在您的描述中,我们有两个不同的东西:一个可以称为“路由器” - 您可以在其中根据 HTTP 请求确定要调用的函数/方法。

在这种情况下,“控制器”就是那些函数,它们依次调用数据库读/写函数和视图构建函数。控制器与模型交互,并传递输出。它是应该与数据库交互的模型。

I am assuming that the model is the set of functions and classes I call periodically?

模型通常是读取和写入数据库的一组函数。这是主要的现实世界用法。但这不是“模型”的定义——它只是最常见的形式。

例如:如果您有一家销售产品的虚拟商店。然后,您将拥有一个“产品”模型,即处理将新产品插入数据库、更新产品信息、计算其价格以及您可能想要在“产品”中执行的所有其他操作的类”。这些方法必须在任何控制器、任何路由、任何视图中工作——这是模式分离/责任组织的一个目标。您应该能够使用相同的商店模型创建一个全新的前端网站。

whether or not a programming pattern can apply to more than one programming language even though one is client-side and another is server-side.

是的。我们在一个应用程序中使用许多不同的语言:HTML、JavaScript、PHP、SQL 等等。整个应用程序可以遵循一组模式。每种语言都可用于在模式中执行一个或多个角色。

Am I even following a programming pattern? If I am not or am somewhat close to one, does it matter if I am not following a pattern exactly?

的,你是。我认为,即使你没有它的名字,即使你遵循“你自己的模式”,你肯定会遵循一些模式,否则你将无法构建你的应用程序。这种模式可以是 MVC、ABC、XYZ、CSM 或其他。当然,如果您学习了这些概念,您就可以使用这些概念与其他开发人员讨论您的应用程序代码。学习当然是一件好事,但是...

,如果您没有完全遵循模式,那“没关系”。您最终可能会创建一个新的、增强的、更好的模式!有时担心适应某种模式可能会破坏你的创造力。不要过度担心它。

说了这么多,我认为你做对了,想知道、理解甚至掌握这些模式及其概念。MVC 是程序员理解的重要内容。一位好老师可以提供帮助。阅读好书和文章。SO的问题和答案。一些谷歌研究......而且,最重要的是,编码经验。如果你有一个实际的目标要达到,一个可以编写代码的应用程序,并在实践中应用你学到的东西,你就会逐渐理解它们。

于 2012-08-31T13:51:24.337 回答