在开始我的下一个主要项目之前,我目前正在阅读 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”,您将如何执行以下操作:
- 创建一个 CSV 导出文件,显示所有用户,按姓氏排序。例如。姓氏,名字。
- 提供重量级 GUI 和基于 Web 的界面来处理用户对象。
- 在一处显示用户名旁边的头像,但在另一处仅显示用户名。
- 提供用户的 RSS 列表。
- 用户名在一处显示为粗体,在另一处显示为斜体,在另一处显示为超链接。
- 在适当的地方显示用户的中间名缩写。
如果您考虑这些要求,它们都归结为提供一个只关心它应该关心的数据的用户对象。它不应该试图成为所有人的万能,它应该只是提供一种获取用户数据的方法。由您将创建的许多 View 中的每一个来决定如何显示用户数据。
您关于在一个地方更新代码以在多个地方更新您的 View 的想法是个好主意。这仍然是可能的,而无需在太低的水平上处理事情。您当然可以创建类似小部件的类来封装您对“东西”的各种常见 View ,并在您的 View 代码中使用它们。
关于php - 关注点分离; MVC;为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/639622/