SQLServer的操?/a> 外,另外q需要用于查看及分析?AS400 上获取的数据。项目中与AS400的连接已l被装成了lgQ提取不同的数据需要通过lg?AS400 L发送不同的指o字符串来实现。由于指令字W串是根据一个协议来规范Q因此合成不同的指o需要用不同的逻辑。ؓ了将q些复杂以及单独的逻辑加以q行区分Q我惌利用现有pȝ的这U结构来完成Q即每个指o的逻辑被放在一个单独的 Funtion 中,然后Ҏ 面 提交上来的参数来分别调用Q结果程序变成这?( q里使用的是CZ代码 )Q?br />
E序原框?/strong>
Dim AS400Code
AS400Code = ""
AS400Code = Request("AS400Code")
'初始?AS400q接lg"
Dim IQS
Set IQS = New IQS
'---------控制?-----------
Dim CodeString,Head
Select Case AS400Code
Case "PSCA1000"
'调用指o装逻辑
Call PSCA1000(CodeString,Head)
'调用 装AS400q接 的组?/span>
IQS.send(CodeString)
'昄q接lg持有的数据集
Call ShowRs(IQS.Rst,Head)
Case "PSCA1002"
'调用指o装逻辑
Call PSCA1002(CodeString,Head)
'调用 装AS400q接 的组?/span>
IQS.send(CodeString)
'昄q接lg持有的数据集
Call ShowRs(Head)
Case Else
Response.Write "未支持AS400E式?" & AS400Code
End Select
Set IQS = Nothing
'------------视图-------------
'昄功能帮助信息
Function ShowHelp()
Response.Write "<OL>参数AS400Code:AS400E式?"
Response.Write "<LI>PSCA1000</LI>"
Response.Write "<LI>PSCA1002</LI>"
Response.Write "</OL>"
End Function
'使用二维表以及Head来生成?lt;table> 元素
Function ShowRs(Rst,Head)
'使用Rst来生成一个?lt;table> 元素,q利用 Head 来生成表头列
End Function
'---------AS400指o处理逻辑(模型)------------
Function PSCA1000(ByRef CodeString,ByRef Head)
'Ҏ复杂的逻辑来合成CodeString以及数据报表?/span>
End Function
Function PSCA1002(ByRef CodeString,ByRef Head)
'Ҏ复杂的逻辑来合成CodeString以及数据报表?/span>
End Function q里提一下,q是将 AS400指o处理逻辑 全部攑֜一个文Ӟq在当前的页面中使用 Include 包含q来Q那么整个功能的框架也是没有什么变化的?br />
仔细看看q个框架Q不隑֏?strong>问题所?/strong>Q?随着以后所支持AS400指o的增多,框架中充当“控制器”的 Select Case 部分受C重考验?br /> 1.大量的Case分支充满其中Q重复代码过多;
2.随着指o逻辑的增多,指o逻辑不可避免的攑օ单独的文件中Q这样一旦增加一个AS400指o必L改多个ASP面Q?br /> 3.面Z用者显CZ个功能帮助信息,其中需要显C到所能支持的指o以及指o含义信息Q而这些信息又不可避免的需要在主页面中重复输入及更攏V?br />
累则思变 :-)Q想想例如JAVA/NET中的那些设计Q如果能够利用上Q把调用与实现分dOK了。仔l分析一下上面的代码不难发现Q问题出在“控制器”与“模型”的合上,l果造成两者的“同步更新”?br />
降低耦合Q最好的方法就是在两者之间加入一个层 (接口) Q这样问题即可解冟뀂由于ASP本nq不提供接口q一东东Q只能自己来实现|。下面是我的解决ҎQ?br />

E序新的框架(分离的感觉真?
'注意q里: --新增了一个 CodeDic 容器,它就是俺设计的接?/span>
Dim CodeDic
Set CodeDic = Server.CreateObject("Scripting.Dictionary")
<!--#include file="As400Code.asp"-->
'-----------
Dim AS400Code
AS400Code = ""
AS400Code = Request("AS400Code")
'初始?AS400q接lg"
Dim IQS
Set IQS = New IQS
'---------控制?-----------
Dim CodeString,Head,myFun
If CodeDic.Exists(AS400Code) Then
Set myFun = GetRef(AS400Code)
Call myFun(CodeString,Head)
IQS.send(CodeString)
Call ShowRs(Head)
Else
Response.Write "未支持AS400E式?" & AS400Code
End If
Set IQS = Nothing
'------------视图-------------
'昄功能帮助信息,看似代码增多了几?不过俺再也不用改它了
Function ShowHelp()
Dim Code
Response.Write "<OL>参数AS400Code:AS400E式?"
If CodeDic.Count < 1 Then
Response.Write "现在无指o支持"
Else
For Code In CodeDic
Response.Write "<LI>" & Code & ":" & CodeDic.Item(Code) & "</LI>"
Next
End If
Response.Write "</OL>"
End Function
'使用二维表以及Head来生成?lt;table> 元素
Function ShowRs(Rst,Head)
'使用Rst来生成一个?lt;table> 元素,q利用 Head 来生成表头列
End Function
'=========As400Code.asp=============
'---------AS400指o处理逻辑(模型)------------
'注意q里:由模型向接口注册
CodeDic.Add "PSCA1000","PSCA1000指o的说明信?/span>"
Function PSCA1000(ByRef CodeString,ByRef Head)
'Ҏ复杂的逻辑来合成CodeString以及数据报表?/span>
End Function
CodeDic.Add "PSCA1002","PSCA1002指o的说明信?/span>"
Function PSCA1002(ByRef CodeString,ByRef Head)
'Ҏ复杂的逻辑来合成CodeString以及数据报表?/span>
End Function 呵呵Q就是这么简单?br /> 中间?/strong>(接口)Q?br /> q里我用了一个容器来充当中间层,当然q里Z省事在容器的使用上ƈ没有完全实现接口的功能。我q里向容器提交的 Key 是AS400指o处理函数名; Value 是外层页面上需要的对应帮助信息。如果想完全实现接口的话Q应该这L容器Q?key--功能名;value--处理函数名;q样一旦处理逻辑发生变动Q只需更新对应?value 卛_?br /> 模型Q?br /> q里有点变动Q程序功能添加的控制权由原先的“控制器”{向“模型”,因ؓ在这里它更容易变动一些。而且让它只与充当中间层的容器打交道?br /> 视图Q?br /> 同样的,也只让它与中间层打交道?br /> 控制?/strong>Q?br /> q里变动最大,诸多不爽?Select Case 分支被拿掉,控制器仅仅与中间层打交道。利?VBScript 提供?GetRef( funName ) 获取函数指针Q来实现逻辑功能的动态调用?br />
每次需要新增AS400指o逻辑处理功能Ӟ只需向As400Code.aspd一个功能处理函敎ͼq将其注册到容器卛_实现整体功能的更新?br /> 两个框架l过Ҏ不难看出?strong>优点Q新的框架在新增功能Ӟ
1.避免了重复的调用代码Q?br /> 2.仅仅修改一处地斏V?br />

]]>