6

最近有人强调(在我之前的问题中)我设计 Web 应用程序的方式并不理想。

考虑以下。我正在一个多用户网站上工作,其中包含许多不同的部分,包括个人资料和论坛以及支持票。结构如下:

包含所有其他页面的主页或 *required_once* 我们将其称为home.php。

home.php中,首先加载的东西之一是router.php,它处理用户可能产生的每一个 $_GET 和 $_POST,并且每个表单和进程都通过一个名为 $data_process 的主变量进行排序。Router.php 本质上只是 $data_process 的一个巨大的switch()语句。这会解析所有数据并给出结果。

接下来是header.php,它不仅会处理将要加载的页面的必要变量,还会设置标题并准确决定将在那里显示的内容,例如菜单、用户信息和有关页面的信息当前查看(即主页 > 支持 > 查看工单)。

然后根据 $page 变量加载页面。一个简单的包含。

然后footer.php,然后关闭。

这样就创建了动态网站。一位名叫@HorusKol 的用户告诉我这是不好的做法。我对这个网站非常满意,因为它是我用过的最精简、最容易编写的网站。如果这仍然是糟糕的代码设计?什么是完美的代码设计?

PS - 任何人都可以为我推荐任何解释 PHP、MySQL 和设计结构的好书吗?

4

2 回答 2

1
  • 这是一个糟糕的设计,因为您处理了很多可能在其余过程中不需要的数据。路由器应该只处理 url,post 数据的处理在其他地方处理。只包括你需要的东西,包括一切都会让事情变慢。
  • 更好的方法是在不同的部分更多地构建您的应用程序。处理 url 的路由器,基于路由请求运行操作的控制器,处理所有 html 和页面的视图,访问数据的模型。MVC 是我想到的。
  • 没有完美的代码设计。
于 2012-10-12T09:10:27.883 回答
1

“好的设计”没有规范的定义——你能希望的最好的就是你的设计以最佳方式平衡项目上的各种力量,你的项目上的力量可能是可维护性、性能、可伸缩性、可扩展性——经典的非功能性要求 - 还包括搜索引擎优化、标准合规性和可访问性(尤其适用于 Web 项目)。

如果您所有的 URL 都是“www.mysite.com/home.php?action=getDetails&productID=123”的形式,那么您的搜索引擎友好度很低。最好有语义 URL - “www.mysite.com/products/DesktopPc/details.php”。您可以通过在当前设计中使用狡猾的 .htaccess 技巧来实现这一点。

从可维护性的角度来看,您的设计存在一些问题。如果我理解正确的话,向站点添加一个新页面需要你修改几个不同源文件中的代码——router.php(你的巨大 switch 语句)、页面本身,可能还有 header.php。这表明代码是紧耦合的. 修改巨大的 switch 语句听起来可能是有趣的错误的来源,路由器和标题的组合、操作变量以及实际页面本身似乎有点脆弱。如果您是该项目的唯一工作人员,这没关系,并且您将长期存在;如果不是这种情况,最好使用现成的框架(MVC 是当前最受欢迎的;Zend、Symphony 和 Cake 在 PHP 中都做得很好),因为您可以将新开发人员指向文档并期望他们获得加快速度。

可维护性的最大敌人之一是复杂性——复杂的代码更难处理,并且包含更多的错误。有一个复杂性的正式指标,我很确定您的 switch 语句在该指标上得分非常高 - 本身不一定是一个大问题,但绝对值得关注。许多 MVC 框架通过将路由定义为数据而不是代码(即在配置文件中具有路由)和/或通过使用约定优于配置(即如果请求是针对页面“productDetails”,则包含该文件来避免这种情况“/inc/productDetails.inc”)。

可扩展性可能是另一个问题——想象一下必须将您的网站内容公开为 JSON 或 XML 以及 HTML;在您当前的设计中,这将需要进行大量更改,因为页面处理管道中的每个项目都关心并且需要知道。home.php 需要知道不发送 HTML,页眉和页脚需要知道,路由器需要了解如何处理额外的数据类型,几乎可以肯定会使 switch 语句更大。这又可能没什么大不了的。

能够对代码进行单元测试有助于提高可扩展性和可维护性。测试驱动开发本身将其变成了一个完整的例程;我猜测试你的应用程序很难——但这只是一个猜测;它更多地取决于您如何考虑单个代码块而不是您上面描述的内容。然而,MVC 的另一个好处是它可以很容易地为系统的关键部分编写单元测试。

因此,如果您的项目中的力量不包括对可维护性或可扩展性的强调,并且您可以处理 SEO 方面,我认为您的设计不一定是“坏的”;即使您确实关心这些事情,您也可以做其他事情来适应这些力量 - 编写文档,雇用许多廉价的编码人员。

了解这些设计主题的最佳方法不是关于 PHP 或 MySQL 的书籍;而是 我推荐 Martin Fowler 的“重构”和“企业应用程序架构的模式”,Gamma 等人的“设计模式”。和 McConnell 的 Code Complete(虽然现在有点过时了)。

于 2012-10-12T11:13:02.063 回答