php - 关注点分离; MVC;为什么?

标签 php model-view-controller user-interface oop

在开始我的下一个主要项目之前,我目前正在阅读 OO。为了给您一些快速的背景知识,我是一名 PHP 开发人员,从事 Web 应用程序的工作。

我特别感兴趣的一个领域是用户界面;具体如何构建它并将其连接到我的面向对象“模型”。

我一直在阅读这方面的内容。我的最爱之一是: Building user interfaces for object-oriented systems

"All objects must provide their own UI"

考虑 我的 问题,我可以看到它运作良好。例如,我构建我的“用户”对象来代表已经登录到我的网站的人。我的一种方法是“display_yourself”或类似的。我可以在我的代码中使用它。也许从这开始只是他们的名字。稍后,如果我需要调整以显示他们的名字+小头像,我可以更新这个方法,嘿-presto,我的应用程序更新了。或者,如果我需要将他们的名字作为他们个人资料的链接,我可以从一个地方轻松地再次更新。

就OO系统而言;我认为这种方法效果很好。查看其他 StackOverflow 线程,我在“关注点分离”下找到了这个: Soc

"In computer science, separation of concerns (SoC) is the process of breaking a computer program into distinct features that overlap in functionality as little as possible. A concern is any piece of interest or focus in a program. Typically, concerns are synonymous with features or behaviors. Progress towards SoC is traditionally achieved through modularity and encapsulation, with the help of information hiding."

在我看来,我已经做到了。我的用户对象隐藏了它的所有信息。在显示之前,我的代码中没有任何地方可以说 $user->get_user_name()。

但是,这似乎与其他人认为的“最佳实践”背道而驰。

引用同一问题的“选定”(绿色)答案:

"The separation of concerns is keeping the code for each of these concerns separate. Changing the interface should not require changing the business logic code, and vice versa. Model-View-Controller (MVC) design pattern is an excellent example of separating these concerns for better software maintainability."

为什么这会提高软件的可维护性?当然,使用 MVC,我的 View 必须对模型非常了解?有关这一点的详细讨论,请阅读 JavaWorld 文章: Building user interfaces for object-oriented systems

不管怎样……终于到了真正的重点!

1. 谁能推荐任何详细讨论此问题的书籍?我不想要一本 MVC 书;我没有在 MVC 上出售。我想要一本讨论 OO/UI、潜在问题、潜在解决方案等的书。(可能包括 MVC) 亚瑟瑞尔的 Object-Oriented Design Heuristics

涉及到它(也是一本很棒的书!),但我想要更详细的东西。

2. 谁能提出一个像 Allen Holub 的 JavaWorld 文章解释为什么 MVC 是一个好主意一样得到充分解释的论点?

非常感谢任何可以帮助我就此得出结论的人。

最佳答案

这是 OOP 的常见教学方式的失败,使用完全没有意义的 rectangle.draw() 和 dinosaur.show() 之类的示例。

当您谈论拥有显示自身的用户类时,您几乎是在回答自己的问题。

“稍后,如果我需要调整以显示他们的名字+小头像,我可以只更新这个方法,嘿,很快,我的应用程序更新了。”

暂时想想那个小片段。现在看看 Stack Overflow 并注意您的用户名出现的所有地方。每种情况看起来都一样吗?不,在顶部,您的用户名旁边只有一个信封,后面是您的声誉和徽章。在问题线程中,您的头像后面是您的用户名,下面是您的声誉和徽章。你认为有一个用户对象有像 getUserNameWithAvatarInFrontOfItAndReputationAndBadgesUnderneath() 这样的方法吗?不。

对象与它所代表的数据以及作用于该数据的方法有关。您的用户对象可能有 firstName 和 lastName 成员,以及检索这些部分所必需的 getter。它也可能有一个像 toString()(在 Java 术语中)这样的便捷方法,它会以通用格式返回用户的姓名,比如名字后跟一个空格,然后是姓氏。除此之外,用户对象不应该做太多其他事情。由客户端决定要对对象做什么。

以您为我们提供的用户对象为例,然后考虑如果您在其中构建“UI”,您将如何执行以下操作:

  1. 创建一个 CSV 导出文件,显示所有用户,按姓氏排序。例如。姓氏,名字。
  2. 提供重量级 GUI 和基于 Web 的界面来处理用户对象。
  3. 在一处显示用户名旁边的头像,但在另一处仅显示用户名。
  4. 提供用户的 RSS 列表。
  5. 用户名在一处显示为粗体,在另一处显示为斜体,在另一处显示为超链接。
  6. 在适当的地方显示用户的中间名缩写。

如果您考虑这些要求,它们都归结为提供一个只关心它应该关心的数据的用户对象。它不应该试图成为所有人的万能,它应该只是提供一种获取用户数据的方法。由您将创建的许多 View 中的每一个来决定如何显示用户数据。

您关于在一个地方更新代码以在多个地方更新您的 View 的想法是个好主意。这仍然是可能的,而无需在太低的水平上处理事情。您当然可以创建类似小部件的类来封装您对“东西”的各种常见 View ,并在您的 View 代码中使用它们。

关于php - 关注点分离; MVC;为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/639622/

相关文章:

php - 如果值不存在,如何在左连接字段上返回 null

php - 松散耦合的 MVC 的替代方案?

java - Java swing MVC 与 Android 设计模式的比较

javascript - 如何实现 gmail 风格的标签选择器?

Android 4.2.1 错误字符kerning(间距)

php - 如何向 PHP 下拉查询添加空白选择?

TDD 的 PHP 框架

ios - 我的 appdelegate 可以用作 UIView Controller (MVC) 的 Controller 吗

python - 给定起始颜色和中间颜色,如何获得剩余颜色? (Python)

javascript - JS 不响应更新的 txt 文件