最近(在之前的问题中)突出显示我设计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和设计结构吗?
答案 0 :(得分:1)
答案 1 :(得分:1)
没有“优秀设计”的规范定义 - 您最希望的是您的设计以最佳方式平衡项目的各种力量,项目上的力量可能是可维护性,性能,可扩展性,可扩展性 - 经典非功能性需求 - 还包括搜索引擎优化,标准合规性和可访问性(特别适用于Web项目的内容)。
如果您的所有网址都是“www.mysite.com/home.php?action=getDetails&productID=123”形式,那么您的搜索引擎友好程度相当低。拥有语义URL要好得多 - “www.mysite.com/products/DesktopPc/details.php”。您可以通过在当前设计中使用狡猾的.htaccess技巧来实现这一目标。
从可维护性的角度来看,您的设计存在一些问题。如果我理解正确的话,向网站添加一个新页面需要你修改几个不同源文件中的代码 - router.php(你的巨型switch语句),页面本身,也可能是header.php。这表明代码紧密coupled。修改巨型开关语句听起来像是娱乐性错误的可能来源,路由器和标题的组合,操纵变量以及实际页面本身似乎有点脆弱。如果你是唯一一个从事该项目的人,那么你可以长期保持这种状态,这是可以的。如果不是这样,那么最好使用现成的框架(MVC是目前最受欢迎的; Zend,Symphony和Cake都在PHP中做得很好),因为你可以指出新的开发人员在文档中并期望他们得到加快速度。
可维护性的最大敌人之一是复杂性 - 复杂的代码更难以使用,并且存在更多错误。复杂性有formal metric,我很确定你的switch语句在该指标上得分非常高 - 本身不一定是一个大问题,但绝对值得关注。许多MVC框架通过将路由定义为数据而不是代码(即在配置文件中具有路由)和/或通过使用约定优于配置(即,如果请求是针对页面“productDetails”)来避免这种情况,包括文件“/inc/productDetails.inc”)。
可扩展性可能是另一个问题 - 假设必须将您的网站内容公开为JSON或XML以及HTML;在您当前的设计中,这需要进行大量更改,因为页面处理管道中的每个项目都需要了解并且需要知道。 home.php需要知道不发送HTML,页眉和页脚需要知道,路由器需要了解如何处理附加数据类型,几乎可以肯定使switch语句更大。这可能不是什么大问题。
通过对代码进行单元测试,可以提高可扩展性和可维护性。测试驱动开发本身就把它变成了一个完整的例程;我猜测测试你的应用程序很难 - 但这只是猜测;它更多地取决于你如何考虑各个代码块而不是你上面描述的。但是,MVC的另一个好处是它可以轻松地为系统的关键部分编写单元测试。
因此,如果您项目中的力量不包括强调可维护性或可扩展性,并且您可以处理SEO方面,我认为您的设计不一定“糟糕”;即使你关心这些事情,你也可以采取其他措施来容纳这些力量 - 写文档,雇用大量廉价的程序员。
了解这些设计主题的最佳方法不是关于PHP或MySQL的书籍;我推荐Martin Fowler撰写的“重构”和“企业应用程序架构模式”,Gamma等人的“Design Patterns”。和代码完成由麦康纳尔(虽然现在已经过时了)。