做ASP网站,最怕的就是代码堆成一坨。一个index.asp打开,上面是数据库连接,中间是业务逻辑,下面混着HTML,改个按钮颜色都得翻半天。我以前接手过一个老项目,单个文件两千三百多行,光数据库连接字符串就出现了十七次。后来花了三天把它拆成模块,维护效率至少翻了一倍。
模块化说白了就是把功能拆开,各管各的。ASP本身没有命名空间,也没有现代框架那套依赖注入,但靠include和Class照样能玩得转。
最基础的是公共文件分离。建一个inc目录,里面放conn.asp、config.asp、function.asp。conn.asp只负责数据库连接,用Server.CreateObject("ADODB.Connection")打开,用完记得关。config.asp放全局常量,比如网站名称、上传路径、每页条数。function.asp塞常用函数,像安全过滤、字符串截断、分页生成。这些文件在每个页面顶部用引进来。注意include是编译时包含,路径写错直接报错,所以文件位置别乱动。
模板拆分也得跟上。ASP没有模板引擎,但可以手动切。header.asp放头部导航和CSS引用,footer.asp放版权和统计代码。每个页面变成:引入header,写自己的内容,引入footer。这样改导航只需要动一个文件。我见过有人每个页面都复制一遍导航,后来加个菜单项,三十多个文件挨个改,漏了两个,线上跑了一周才发现。
业务逻辑要独立。别把SQL语句散落在页面里。建一个class目录,用VBScript的Class写数据访问层。比如User类,里面放GetUserById、UpdateUser、CheckLogin这些方法。页面只调用方法,不直接写SQL。这样以后换数据库或者加缓存,只改类文件就行。VBScript的Class虽然简陋,没有继承,但封装够用了。注意Class文件也要用include引入,而且要在使用之前。

权限控制单独成模块。建一个auth.asp,里面写CheckLogin和CheckAdmin两个函数。每个需要登录的页面顶部调用CheckLogin,不通过就跳转。别在每个页面里写If Session("user")="" Then Response.Redirect,写多了容易漏。我习惯在auth.asp里加个白名单数组,放不需要登录的页面,其他一律拦截。
文件上传、邮件发送、图片处理这些也都能拆。比如upload.asp封装上传逻辑,调用的时候传表单字段名和保存路径就行。邮件发送用JMail或者CDO,封装成SendMail函数,参数是收件人、标题、正文。这样业务页面干净很多。
模块化还有个好处是多人协作。两个人同时改一个文件容易冲突,拆成模块后各改各的。前端改header.asp,后端改User类,互不影响。版本控制也清爽,谁改了哪个模块一目了然。
不过模块化也有坑。include文件多了,页面编译时间会变长。我测过,一个页面引入十五个include文件,首次编译比单个文件慢大概百分之三十。解决办法是合并不常改的公共文件,比如把config和function合成common.asp。另外变量作用域要注意,include进来的文件共享同一个作用域,别在公共文件里定义太通用的变量名,容易冲突。我习惯加前缀,比如gConn、gConfig。
还有Session和Application的使用。Session存用户信息,Application存全局配置。模块化的时候,把Session操作集中到一个文件里,比如session.asp,提供GetUser、SetUser、ClearUser方法。这样以后要换成Cookie或者Token,只改这一个文件。
最后说下目录结构。我一般这么分:根目录放页面,inc放公共文件,class放类文件,admin放后台,upload放上传文件。每个目录权限单独设置,upload目录禁止执行脚本,防止上传木马。IIS里配一下就行。
ASP虽然老,但模块化思路跟现代框架是一样的。拆开、封装、复用,这三步做到位,老系统也能维护得舒服。别小看include和Class,用好了比一堆复制粘贴强太多。