Closed. This question needs to be more
focused。它当前不接受答案。
想要改善这个问题吗?更新问题,使它仅关注
editing this post的一个问题。
3个月前关闭。
Improve this question
我一直在开发用于可视化某些数据的程序。我的程序从MySQL数据库获取特定输入,并绘制一些图形(libchart库),创建一些表等。
我的问题是,现在它在那里是一个代码 hell 。我大约有7个php文件(索引,图形页面,画廊等),它们全部带有HTML/CSS和PHP/SQL代码(其中一些只是具有php扩展名,但内部只有HTML)。我暂时没有阅读和理解该元素的问题,但是我想如果有人尝试过,他可能会头疼。另外,像这样的连续编程是不切实际的,因为将来该元素可能不容易扩展。
您对如何成功将HTML/CSS与PHP/SQL分开有任何建议吗?我不想使用框架,因为我没有做任何需要用户输入, session 处理等的工作。我只是运行一些查询并使结果可视化。我在这里主要谈论的是架构,如果适用的话,也许是一个可以帮助我的脚本(我已经读过Smarty,但不确定是否正是我所需要的)。
Do you have any suggestion on how to successfully seperate HTML/CSS from PHP/SQL?
恭喜您了解如何改善代码。这是前提,您需要进行改进,而且话题很长。因此,您的意志至关重要。
我从轻开始,然后尝试给出一些提示。当您缺少经验时,请寻找一个起点,最有可能的是下面列出的最后一个。但首先要注意的是:
为了使某些东西彼此分离,您需要具有一些分离的代码:
[HTML/CSS/PHP/SQL]
[HTML/CSS] <--> [SEPARATOR] <--> [PHP/SQL]
这里的分隔符实际上也是PHP代码,但是我想您明白了。
如您所见,只有Separator与HTML/CSS和PHP/SQL对话。
因此,HTML/CSS和PHP/SQL都需要与Separator(两者之间的界线)建立接口(interface)才能使此工作有效。
通常,在程序中,您会传递处理过的数据。数据是非常动态的,并且可能具有复杂的复杂性,尤其是如果您将数据传递给应该正确格式化的输出例程。
如何编写这样的分隔符(或多个分隔符)有多种方式。您可以对软件进行分层,也可以提供可以在其领域或领域中执行任务的组件。例如。您拥有负责与数据库交互的数据库层或数据库组件。
或者,您有一个模板引擎,负责将您的字符串和数组放入一些可读的HTML中。
简而言之,这是软件设计的面食理论:
意大利面代码-多合一,代码相互交织,最好与Bolognese或Aglio,Olio e Peperoncino结合使用。 意大利千层面代码-分层,一层与其他两个层交互(除非底部或顶部),并且始终与Béchamel酱混合。 Tortelini代码-可以完成工作的小型组件,内部装有肉类或辛辣蔬菜。 就像我们在生活中吃不同的面食一样,在编程时,我们也需要处理所有这些不同类型的代码,并且随着时间的流逝,我们会发展出自己喜欢的口味。小时候我们很饱,但是随着时间的流逝,我们开始自己做饭并改变食谱。
因此,我认为您不希望在接下来的几周内吃掉很多很棒的MVC Framework X只是一个好点,因为有人告诉您这是现在就吃的方式。在吃东西之前先品尝一下,对吗?更不用说快餐了,您知道像包装面条那样的面条-只加水。嗯
我不知道您的输出需要什么数据,输入是什么。以下是一些输出HTML/CSS并与MySQL数据库交互的应用程序的重构技巧。这不是一个完整的列表,说明只能大致概述一些想法:
将CSS移出HTML。在链接的CSS定义中有效使用选择器,并在仍有属性的情况下替换任何style
属性。这使您的CSS代码可重复使用,并且更具模块化。这将帮助您发现HTML内的缺陷,并将结构(HTML)与演示(CSS)分开。有效的HTML始于CSS的有效使用,这两者非常强大,而且通常已经可以减轻程序输出例程的负担。 将业务逻辑移出HTML。 HTML和您的代码都可以成为野兽,因此最好将它们分开。他们倾向于相互竞争,并且两者都很强大,因此在您开发应用程序时斗争会一直持续下去,这会使您分心于需要做的工作。
考虑一下您是否需要在应用程序中具有复杂的输出,或者是否可以仅传递带有子元素的数组(键是var,var可以包含字符串或数字或另一个var-array)。通常,将所有复杂数据传递到 View 或模板都需要这些。然后,您的HTML仅需要在子数组上回显一些数组成员和或foreach
。这是创建模板的非常简单的技术。您可以使用PHP,因此实际上非常灵活(只需画出属于您的 View 层的代码以及属于应用程序一部分的边界,例如为 View 提供值)。 将SQL移出代码。移走数据库交互代码。创建您自己的一个或多个对象,这些对象具有以实际处理代码中所需的方式(消耗)返回数据的方法,例如$component->getThatData()
,然后以规范化形式返回数据。然后使这些组件使用专用的数据库组件与数据库进行对话。在您的应用程序代码(业务逻辑)中,仅使用数据库组件,最好使用您创建的对象来获取数据,因此您在主代码内不再有任何SQL行。 划分并征服您的应用程序代码:将您的代码划分为Transaction Scripts。它们通常很容易从现有的意大利面条代码创建,并且很可能会成为您正在寻找的中间所说的分隔符。然后,他们将负责处理数据并将其传递(进入输出/ View )。 使用清晰的语言:如果您有未规范化的复杂格式的字符串数据,请编写自己的Parser类来为您工作,并且可以轻松地重用(如果在应用程序中是这种情况)。当您期望最大程度地减少在代码中使用纯SQL时,您也应该期待将复杂的正则表达式也移开。封装变化是关键。同样的道理也适用于长例程,以仅处理某些数据(例如,以另一种格式对数据进行排序,排序和排列),将其移至各自的组件中,并考虑如何使它们可访问和可重复使用。 使代码正常运行:了解如何在程序中调用功能的逻辑。您可以尝试将功能与调用方式分开。例如。一些调用任何事务脚本的例程。如果您直接通过浏览器请求PHP文件,则可能没有必要,因为那样的话您的事务脚本和网络服务器会小心地将通过URL发送到您的应用程序中的命令解析为事务脚本。但是随后您应该将处理传入命令及其参数所需的任何逻辑包装到可重用的组件中(例如,包含用于从HTTP请求获取URL和/或变量的标准代码的Request类)。 通过在通过浏览器调用的所有文件的最顶部包含相同文件,创建一个公共(public)入口点。然后,您可以将通用代码(例如,设置应用程序 session 状态对象和初始化数据库组件)放入其中,以及Application Controller 通过查找字面重复的代码来删除重复项。将其包装到一个函数或类中。为您自己的应用程序创建一个库文件夹,您将其包括在内。如果您遵循带有“类名”和“名称间隔”的通用模式,则可以轻松地使用自动加载器使包含变得容易。使您的库与第三方代码分开。将所有第三方代码放入其自己的库文件夹中,每个第三方组件都有一个子目录。 使用轻量级的现有组件。轻量级很重要,因为您已经拥有了自己的代码,您不想立即将其全部按下并压入框架。
现有状态很重要,因为您不想重新发明轮子。您将有足够的工作来自己重构代码。在对您的应用程序感觉更好并且仍然有能力和意志之后,就可以随时编写所有新内容。但是,无论您是一个人还是一个小团队,Existing都非常强大。
简单的库例如:
模板引擎:Mustache 数据库层:NotORM 创建应用程序状态,例如作为对象,可以在某些组件无需直接交互而需要了解应用程序状态或彼此之间使用的情况下使用。在PHP中,默认情况下,如果您没有一个,则使用全局和全局静态变量来创建状态。但是,随着代码的增长,这些变量会使您的工作更加艰难。创建应用程序状态对象时,很清楚哪些组件可以使用它,可以控制对它的访问(例如,调用方法而不是读取变量,这可以帮助调试),并且组件也可以找出是否是在应用程序流程中正确的时间开始起作用。这也是随时间重构代码的好工具。 保留正在运行的应用程序,使您的代码保持在运行状态。理想情况下,这将通过自动测试进行备份。考虑到您需要大量重写。例如,如果您开始集成数据库组件,请执行此操作。一步将所有现有代码移至其中。那么谁告诉你它仍然运行?使用git可以更好地撤消和测试内容。这比选择正确的库更重要。保留有效的应用程序始终也是关键点,因为这就是为什么要更改它,对吧?