日期:2009-01-28  浏览次数:20871 次

首先,以实际例子说明模块化对于程序编写的重要性.例子就是我们现在采用的动网论坛

1 论坛的配色是一个论坛保持活力的基础,一个好的配色意味着一个论坛成功了一半.但我认为动网论坛的配色是及其浪费资源的,同时后台操作也异常麻烦.首先,它将CSS的各个定义部分存储到数据库,在打开页面时再调用,如
--------------------------
<%
'打开数据库代码省略
dim bgcolor1
bgcolor1=rs("bgcolor1")
rs.close
set rs=nothing
%>
<table><tr><td bgcolor='<%=bgcolor1%>'></td></tr></table>
--------------------------
采用这种方法,在查询数据库内容较少时还说的过去,但一个页面的CSS定义多达几十项而且每页都要调用时,这段代码就显得尤其白痴了.试试以下这种方法:
--------------------------
<%
'1.CSS文件为页面STYLE文件,我们将其文件路径储存到数据库中
Dim style1=Rs("style")
%>
<html><head>
<link rel="stylesheet" type="text/css" href="<%=style1%>">
</head>
---------------------------
这种方法要比上面动网的方法快的多,而且大大减少了资源,这就是模块化的好处之一
可能有些朋友还不明白什么是模块化,我还是老习惯,用个实例向大家说明.该实例是写一个简单的留言本,当然事实上,留言本这么小的一个程序一般是不需要模块化的,我只是说明一下.

我们要求这个留言本必须注册了才能留言,只有管理员能够回复.按照一般的写法,我们会写一个单独的登陆页面,然后当用户没注册进入留言页面时自动跳转到登陆页面,或用iframe包含该页面.当然,我们还要写一个注册页面,一个回复页面

当使用模块化后,我们仅仅只需要2个文件就能搞定它,一个显示页面/gb.asp,一个模块页面/mod.asp
思路是这样的:
1 将 显示留言 登陆 注册 写留言 等等功能分别模块话,如登陆功能
-----------
<%
'MOD.ASP中登陆模块
Sub gb_login()
%>
<form action='gb.asp?action=login' method=post>
<input type=text name='loginname' size=12>
<input type=password name='loginpass' size=12>
<input type=submit value='登陆'>
</form>
<%
End Sub
'处理登陆的模块
Sub gb_logincheck()
Dim a1,a2
a1=Request.form("loginname")
a2=request.form("loginpass")
'打开数据库语句省略
if a2=rs("pass") then
session("name")=a1
end if
Response.Redirect "gb.asp"
End Sub
%>

然后我们可以在留言主页面这样调用
<%
Dim action
action=Request("action")
if action="login" then
gb_logincheck()
else
if session("name")="" then
gb_login()
end if
end if
%>
----------------------
当然上面的实例还很不完全,我们按照这个思路可以将所有功能定义成一个子过程统一放在一个文件里,需要用时在调用

通过上面的实例,我们应该了解了什么是模块化
模块是指程序中的一段代码,该段代码能实现程序中的某一功能并能独立或半独立运行.该语句段的非致命错误并不能导致整个程序瘫痪,只是使程序丧失部分功能.
模块能够重复调用,根据程序的特殊性,模块中能够包含其他模块,结合其他模块运行

在大型程序编写中,模块话的运用是不可避免的.还是以动网为例,大家可以看看动网的源码,它也大量运用了子过程,对于整个程序运行有很大作用.但是存在着很多错误和缺陷.
比如
1 动网论坛中从头到尾数据库的连接都是打开的,而且很多地方多次打开数据库,却找不到关闭数据库连接的代码,这就是很多用东网的朋友说论坛慢的原因所在
分析它的源码,我们可以发现他将打开数据库的代码放在一个文件里,然后将关闭数据库的代码放在一个函数里.我觉得很奇怪,为什么不把打开数据库也作为一个子过程或函数调用呢?
一个很好的方法用了一半就不用了实在可惜!!浏览很多WEB程序的源码,也大多存在这种龙头蛇尾的现象.

2 很多模块存在着无数的错误.最明显的就是在线人数,呵呵,象我们论坛经常出现在线游客几百人的情况.而事实上大家都知道来我们论坛的人绝对不会不登陆的!这个错误我不想讲太多,因为如果我写,我绝对会换个方法写.

模块化的优秀典范有很多,在论坛程序上将模块化运用的异常成功的当推PHPBB,大家可以去他的官方网站看看[http://www.phpbb.com ]

当然,我们没有必要将一个程序的所有代码都模块化,这样反而适得其反.什么代码段应该模块化呢,我认为应该具备以下条件
1 大量在多个页面或程序中重复使用的代码段
2 有待进一步开发的代码段
3 程序中的关键功能,核心内容
4 能扩展第三方插件的代码段

OK,讲到这应该告一段落了,最后总结以下模块化的定义和特点

在程序设计特别是WEB程序设计中,我们采用模块化有以下好处:
1 大大减少代码行
2 使程序的结构清晰,在查找错误时目标范围大大减小
3 当程序需要添加新的功能或修改某功能时,我们要作的仅仅是写出一个新的模块或对某一模块进行修改,而无需对整个程序进行大手术.因为这个原因,模块化也创造了良好的接口环境,便于开发第三方扩展功能

当然,模块化也存在着缺陷:
1 在设计模块时必须考虑模块间是否有冲突,有时候会发生很多意想不到的错误
2 模块中必须保持清楚的结构,有些模块间的互动性导致在编写程序中原本无序的代码必须排序

但,模块化的优点是显而易见的,对于一个想用最少代码写出最强大功能的WEB程序的程序员而言,他还有理由拒绝它吗?