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