在编写简单网站(例如通讯录)时,什么是好的(简洁的)架构?


28

当我建立一个简单的网站(例如可以在其中添加,删除和更新联系人的通讯录)时,我会创建一个index.php文件,在该文件中,如果用户未登录,则要求用户输入密码,如果用户输入正确的密码,则分配了会话,并可以与联系人进行某些操作。

我有两个文件:

  1. 第一个(contacts.php)用于显示HTML代码。在HTML代码上方,我包括第二个文件并创建类。
  2. 第二个(contacts_class.php)包含添加,删除和更新的所有方法。

我认为可以,但是在实施大型项目时,我应该怎么做?我是否必须为每个页面创建文件夹并将文件放入其中(如上面的HTML和类),我应该怎么做?什么是一个好的且整洁的体系结构,用于构建其他程序员都能完全理解的大型项目?

Answers:


67

您提出了一个非常有趣且基本的问题。有关大型项目体系结构和文件夹结构组织(该体系结构的次要问题)的问题。

今天,构建CMS框架体系结构最常用的方法是使用MVC模式。有一些关于构建自己的MVC框架的好文章,其中之一是使用PHP构建MVC框架

MVC代表模型,视图,控制器。您可以随意调用这些方法-MVC,HMVC,MVP。本质是隔离系统的各个组件。“控制器”从“模型”中检索数据,并将其发送到“视图”,后者呈现最终的HTML。您已经在中实现了“ V”,在中实现了contacts.php“ MC” contacts_class.php。因此,您已经将视图与模型和控制器隔离了。现在,您可以轻松更改“视图”,而其他部分保持不变。

我不建议您盲目遵循MVC,MVP或其他“ MV”模式。这取决于适当性,功效和味道。

通用动态网站应用程序可能包括以下组件:

  • 入口点,例如 index.php
  • 助手库/类
  • 请求路由器
  • 模块,组件或控制器
  • 模板引擎或单个视图

实际的Web应用程序可能包括任何其他组件,例如事件处理程序,事件分派器和挂钩,但实际上它们是细微差别。好吧,让我用我想要的方式介绍它:

操作程序图

通用框架的操作例程如下:

  1. 浏览器请求将直接发送到入口点可执行文件/脚本(index.php)。
  2. 入口点脚本将加载帮助程序库,类并执行我们的编程环境的一些进一步初始化。
  3. URL被传递到请求路由器实例。此步骤可以是步骤2的一部分。
  4. 请求路由器解析URL,并将操作分派到特定的组件,模块或控制器。
  5. 组件(或控制器)处理路由的请求,并将数据发送到要呈现的视图。

相应的项目文件夹结构如图所示。

我建议您调查其他框架的实施方式。首先推荐的CMS /框架是CodeIgniter,OpenCart,Joomla 1.5和Tango CMS。


3
您用什么来制作该图像?好答案!
马克汤姆林

3
感谢您对我的回答的积极评价!对此,我真的非常感激!这个答案完全是我之前为自己进行的各种开源Web应用程序框架分析的结果。对于那些对如何创建图像和使用软件感兴趣的人,可以使用Inkscape 0.48和GIMP 2.6.10创建图像。没问题。只需使用两层:一层用于带有文本的矩形,一层用于阴影(模糊的黑色矩形)。我想你明白其余的吗?

一个问题,为什么要将“联系人”控制器分成3个文件。将它们组合为一个contact.php会更清洁。您要做的就是从路由器传入一个动作参数。对于“联系人”视图也可以这样说,除非您的视图将模板和逻辑混合到每个动作的一个文件中。我在PHP中的开发工作不多(我大部分工作在Python中),但我希望并非所有框架都使用这种方法。否则+1以获得更好的写作。
Evan Plaice 2012年

2

为了大致了解要问的问题和可用的解决方案,我推荐Martin Fowler撰写的《企业应用程序体系结构模式》一书。通过阅读他的网站,您可以了解书中的内容

请注意,这本书已经很老了(在IT领域),但是许多原则仍然有效,或者您应该学习这些原则以进行学习。(这有意义吗?)

(软件)体系结构是一个非常广泛的主题,不要指望万能的药,但是总是要有更多的问题和疑问,直到时间和金钱用完为止,您必须坚持迄今为止最好的解决方案。


2

首先,看一下开发良好的项目。Wordpress是一个非常简洁的代码结构示例:易于理解,但提供了许多“插件”。因此,wordpress很容易通过“插件”来推崇。

其次,一种非常简单的检查体系结构的方法是尝试编写单元测试。例如,如果类“ Card Deck”具有“ shuffle()”方法,则您必须能够创建预定义大小的Card Deck(即5张卡1,2,3,4,5),调用shuffle并在简单的方法结果(id 1,4,2,5,3)

您必须能够在不实例化整个项目类的情况下做到这一点,并且测试必须非常清晰易读。

如果无法做到这一点,则必须在类之间添加层,对其进行重组,直到获得一种简便的方法为止。

然后针对您项目的所有核心类重新设置此步骤。

最后但并非最不重要的一点:在不太核心的课程上,好的架构可能是“懒惰的”(这是经济问题:设计精美的东西在现实世界中花费太多)。


1

MVC(模型视图控制器)是大型项目的良好架构:http : //zh.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

但是,其他程序员是否会完全理解则完全不同。MVC可能变得复杂,对于小型项目而言有时显得过于矫kill过正。它的好处之一是易于扩展。


那是一种模式,而不是架构。
Halfdan

我认为在这种情况下它们是同一个人。您如何区分两者?另外,请阅读我发布的Wikipedia页面的第一行。
克里斯·拉普兰特

1
根据我的经验,MVC并不复杂,在小型项目中也非常有用。但是,我同意这是一种模式,而不是整个体系结构。
Danny Varod 2011年

MVC是一种模式,而不是体系结构本身,但是可以将其视为体系结构的一部分。毕竟这并不复杂。

1

如果我正确理解了您的问题,那么您在谈论的是项目文件夹结构,而不是本质上的体系结构。如果我的理解是正确的,请继续阅读;否则,请编辑您的问题或发表评论,我将相应地编辑我的答案。

在设计应用程序时,在回答一些基本问题(例如什么?对谁?)之后,我们需要识别组件并根据功能\职责对其进行分类。我知道两种主要方法。您可以根据组件处理的用例(例如登录,搜索等)对组件进行分类,也可以根据资源(Objects ..)进行分类。第一种方法称为面向活动,第二种方法称为面向资源。传统上,大多数应用程序基于活动对组件进行分类(因为设计人员发现了组件,因此从问题域转移到解决方案域很容易)。

一旦确定了组件分类,我们就需要基于层来确定分类。典型的Web应用程序将具有视图层,模型层和控制器层(MVC)。当然也可以有更复杂的应用程序。(大多数现实世界中的应用程序比这简单得多)。

识别这两个分类法之后,我将创建识别每个层的顶级文件夹。(UI,控制器,服务,实用程序等)。在每个高级文件夹下,我将基于功能或资源(项目-/ EditProject-/ SearchProject等)创建子文件夹。理想情况下,功能分类将是多层的。


我还没有深入研究面向资源的设计和面向活动的设计之间的区别。除了题外话,我不太确定这个问题。但是就个人而言,在设计的清晰度(新开发人员能够轻松理解底层组件和设计)方面,面向资源的体系结构会更好。通过查看文件夹层次结构,开发人员可以了解整个参与资源和子资源,并且对每个资源的操作也很统一。

1

有好的架构和坏的架构,但是没有灵丹妙药。体系结构必须适合当前以及未来极有可能的需求。

一个好的指导方针是,确保可以更改应用程序的每个部分,而对其他部分的影响最小,并且每个部分都具有自动的全覆盖单元和集成测试。


1

架构是要确保您可以长期继续开发。对于大型应用程序,这包括在使事情独立(使多个人可以同时工作)与避免重复(DRY)之间进行权衡,以使项目保持敏捷。PHP项目倾向于专注于使事情独立,并具有大量重复项。

为了让自己在另一个极端位置上感觉良好,请看一下海边


1

如果您不知道如何构造一个大型项目,则应使用几种优秀的PHP框架之一来借鉴其他项目的设计/体系结构。我会推荐CakePHP,CodeIgniter或Symfony。所有这些都实现了模型,视图,控制器,MVC模式,这些模式在Web开发中效果很好,它们都很轻巧并且易于学习。

一旦您了解了这些框架之一,就可以为自己的特定项目设计自己的结构,但是如果您刚起步,我会坚持别人的工作而不是重新发明轮子。


0

MVC是最常用的体系结构,已被证明可以解决大多数问题。一个好的架构将具有以下功能(当然还有更多功能)

  1. 可以进行单元测试
  2. 关注点分离
  3. 多个民族将能够在没有任何冲突的情况下进行工作。
  4. 可以扩展而没有太大问题
  5. 它可以扩展。当涉及到大型项目时,可伸缩性将是一个主要问题。Checkout Kohana框架,写得很好并且可以很好地扩展

0

在您编写任何生产代码之前,请花2周(晚上:)并阅读本书。它将在很长一段时间内改变您对编程体系结构,实用性和打包的想法。

敏捷原则,模式和实践C#by Prentice Hall

例子在C#中,但是它们很容易阅读,这与如何编写正确的代码语法无关,而与程序员的思维方式有关。

我保证您会将其保存在PC上最可访问的位置,并且您会对在不知道的情况下进行编程感到惊讶。它将改变您的想法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.