在ASP经典项目的代码库上加快生活难度的一件事是包含文件情况有点混乱。我有时会发现我正在寻找的函数被包含在一个完全不相关的包含文件中。有没有人对如何重构这一点有任何建议,以便人们可以更容易地告诉函数在哪里需要找到它?
编辑:有一件事我忘了问:vbscript有什么机制可以防止文件被包含两次?像#ifndef那样来自C?
答案 0 :(得分:14)
在接管经典ASP应用程序时,您可以做一些基本的事情,但您可能最终会后悔这样做。
我不会这样做。换句话说Steve Yegge(我认为),“经典的ASP应用程序没有任何问题,无法通过完全重写来修复”。我对此非常认真 - 我不认为程序员在这个世界上浪费的时间比维护ASP应用程序要大得多,而且随着ASP越来越过时,问题就越来越严重。
答案 1 :(得分:10)
@ MusiGenisis项目符号列表是一个很好的建议,但我不同意 -
“我不会做任何这样的事情。用史蒂夫·叶格(Steve Yegge)的话来说,”一个经典的ASP应用程序没有任何问题,无法通过完全重写来修复。“我非常认真对待这一点 - 我认为程序员在这个世界上浪费的时间并不比维护ASP应用程序更大,而且随着ASP越来越过时问题变得越来越严重。“
一切都很好,但如果它是一个相当大的遗留应用程序,由于缺乏开发人员的时间/资源,通常无法完成重写。
我们有一个相当大的经典ASP应用程序,多年来已经成长为手臂和腿,它不是很漂亮但它确实满足了业务需求。我们没有时间在接下来的六个月里完成重写,这会很好,但是不可能。我们的方法是 -
如果需要新功能,则在ASP.NET中实现。这种情况发生在95%的时间。 5%边缘情况通常是新的应用程序代码触及旧应用程序的大量要点,要求我们进行大量经典的ASP重新工作,这可能会使应用程序更加脆弱。
如果功能发生变化,我们会评估是否可以以最小的影响重构ASP.NET。如果这是不可能的,那么我们将实现经典ASP中的更改并整理现有代码,例如我们简化包括文件嵌套,用更多跨浏览器友好代码替换javascript,这样的事情。
在回答你关于#ifndef's的问题时,我不敢相信。
答案 2 :(得分:3)
示例:
<%@ Language=VBScript %>
<% Option Explicit %>
<% Response.Buffer = true%>
<html>
<head>
<!--#include file="../general/t-head.asp"-->
<!--#include file="../bus/product.asp"-->
<title>Products page</title>
</head>
<body>
<!--#include file="../general/t-begin.asp"-->
<% 'all your code %>
<!--#include file="../general/t-end.asp"-->
</body>
</html>
答案 3 :(得分:1)
哇。令我惊讶的是,有多少人对ASP有仇恨。在体面的手中,它是设计Web应用程序的完美语言。
但是,我会承认,在ASP中管理包含文件的方式可能有点大脑 - 因为(取决于你如何使用它们)它们必须加载和解析,即使你没有使用一半其中包含的功能。
我倾向于有一个包含文件(initialise.asp
或其他一些),它本身包含指向多个函数库(lib_http.asp
,lib_mssql.asp
或类似函数库)的链接,并且所有库函数都是自我的包含所以不用担心交叉变量。任何全局变量都在主文件中声明和设置。这意味着我可以随时随地使用某个功能,而不用担心它的定义位置,它只是在那里使用。当您找到对您无法识别的函数的调用时,Visual Studio和Primalscript等IDE可以“跳转到定义”。
然后,在调用此主包含文件后,脚本中将包含任何特定于脚本的包含。
我承认这是一个需要大量内存的方法,因为所有库中的所有函数都是为每个脚本调用编译的,因此该方法需要为您开发的每个站点进行精炼 - 决定通过master包括什么来调用什么更具特定于页面。能够只加载你需要的东西会很好 - 但这是DLL的方法,并不适用于大多数现实世界的开发,而且你还要权衡编译小脚本的处理器成本vs加载组件。
简洁的目录结构是必需的并且易于开发,但是在现有站点中浏览所有代码并更改任何链接或mappath调用可能是一件苦差事。另外,请注意,某些IIS管理员不允许通过VBScript遍历目录的'..\'
方法,因此所有文件引用都必须是绝对路径。
答案 4 :(得分:0)
我认为您应该考虑将代码从ASP VBScript移动到Visual Basic COM DLL。你会因为包含太多内容而感到轻松。
答案 5 :(得分:0)
除了收到错误消息之外,我不知道防止双重包含的方法。您是否看到整个页面中放置了包含内容,这使得难以发现?
除此之外,您是否在开发服务器上使用代码和数据库的副本?根据我的经验,首先要做的是尽快将自己与实际网站分开。虽然最初很麻烦,但它可以让您自由地进行更改,而不会弄乱现场。在include和BAM中做一个微小的变化很容易!整个网站都倒塌了。
我已经完成了一些你所描述的项目并使用了以下策略:
完全重写 - 在有时间/金钱的情况下完美,但通常我会在出现问题时接听电话并尽快得到结果。
较小的项目 - 我打开IDE中的所有内容,然后开始搜索函数/ sub的所有项目文件,以便构建包含逻辑的知识。几乎每次都有,所有东西都散布在各地,所以我开始重建由业务逻辑组织的包含。我还会遇到内联代码(原始代码,而不是子代码或函数)抛出到include中,因此我通常只需将代码拉回页面进行重构。
更大的项目 - 我将使用一些代码来解析带有子/函数头的行的包含,并将这些代码转储到文本文件中以构建一个列表,列出哪些例程在哪里并引用它。当你在每个页面上获得大量内容并且无法理解代码库时,这会派上用场。