我有一个在 perl CGI 中运行的大型 Web 应用程序。它运行正常,写得很好,但是就像过去所做的那样,所有的 html 都是在 CGI 调用中硬编码定义的,所以你可以想象,它很难维护、改进等等。所以现在我想开始添加一些模板并与框架(催化剂或 CGI::application)集成。我的问题是:这里有人有这样的经历吗?有什么需要注意的吗?我知道使用这两个框架我都可以运行本机 CGI 脚本,所以这很好,因为我可以同时运行这两个(CGI 本机广告“框架化”代码)而不会造成任何创伤。有小费吗?
5 回答
首先编写测试(例如使用Test::WWW::Mechanize
)。然后当你改变东西时,你总是知道是否有什么东西坏了,是什么坏了。
然后将 HTML 提取到模板中,并将常用的 subs 提取到模块中。之后,切换到框架是小菜一碟。
通常,请逐步进行,以便您始终拥有一个有效的应用程序。
将 HTML 从 CGI 脚本中的处理逻辑中解脱出来。识别影响 HTML 输出的所有代码,因为这些是成为模板变量的候选者。将其分离到一个 HTML 文件中,用模板变量标记已识别的部分。最终,您将能够重构页面,以便所有处理都在代码开始时完成,而 HTML 模板只是在所有处理结束时调用。
在这种情况下,基本上从头开始重写,旧代码对于 A) 测试和 B) 设计细节很有用。理想情况下,您应该针对您想要复制的所有基本功能进行一组测试,或者至少对解析最终结果页面的测试进行测试,以便您可以看到新代码为相同的输入返回相同的信息。
代码中的设计细节可能毫无用处,这取决于框架自动处理的程度。如果您有一组好的测试,并且直接的转换效果很好,那么您就完成了。如果新的行为与旧的不匹配,您可能需要更深入地挖掘“为什么”?这可能看起来很奇怪,乍一看没有任何意义。
首先要记住要做的一件事是,找出是否有人在您使用的框架中做了类似的事情。您可以为自己节省大量时间和金钱。
这是我使用 Python 而不是 Perl 的方法,但这无关紧要:
- 将 HTML 和代码分离到不同的文件中。我为此使用了模板引擎。
- 从呈现带有一组参数的模板的代码中创建函数。
- 以合理的方式组织功能(我称之为视图,受 Django 启发)。(管理员视图、用户视图等)所有视图都遵循相同的调用约定!
- 重构了数据库和请求的东西,以便视图只包含视图特定的代码(阅读:处理 GET、POST 请求等,但没有低级!)。为此严重依赖现有的库。
我现在在这里。:-) 下一个明显的步骤当然是:
- 编写一个将URL映射到您的视图的调度程序。当然,这也将导致更好的 URL 和更好的 404 和错误处理。
框架做出的假设之一是 url 映射到代码。例如,在一个框架中,您经常会看到以下内容:
http://app.com/docs/list
http://app.com/docs/view/123
通常虽然旧的 CGI 脚本不能这样工作,但您更有可能遇到以下情况:
http://app.com/docs.cgi?action=view&id=123
要利用该框架,您可能需要更改所有 url。您是否可以做到这一点,以及如何保持旧链接正常工作,很可能构成您决定的很大一部分。
框架还提供对某种 ORM(对象关系映射器)的支持,它抽象了数据库调用并让您只处理对象。这Catalyst
通常是DBIx::Class
. 您应该评估切换到此的成本是多少。
您可能会发现您想要完全重写,以旧代码作为参考平台。这可能比您预期的要少得多。但是,从一些玩具网站开始,以了解您决定使用的任何框架/orm/模板。