打印

我是这样编写asp程序的

asp程序非面向对象、代码混杂、重用率低,许多asp程序员为之所累。因此在使用asp的时候更要寻找一个适合自己的标准,使程序尽可能的合理化。这是我在最近的项目中做的一点尝试,请大家提意见。
框架是这样做的:
复制内容到剪贴板
代码:
<!--#include file="../include/config.asp" -->
<!--#include file="config.asp" -->
<%
'页程序块
title_subhead="副标题"
title_page="页面标题"
title_cont=""
title_ie=title_cont&title_page&title_subhead&title
'config_Login("s")
'浏览权限:s为学生浏览 t为教师浏览 如果没有限制去掉改行
'str_info = Trim(Request.QueryString("str_info"))
'警告和提示
'action = Trim(Request.QueryString("action"))
'命令
%>
<!--#include file="../include/header.asp" -->
<!--页面内容开始 -->
<div class="str_info"><%= str_info %></div>
<!--页面内容结束 -->
<!--#include file="../include/footer.asp" -->
大概说说结构:

../include/config.asp:相当于asp.net中的web.config,全局变量、函数、过程(包括数据库连接)都放到里面

config.asp:相当于asp.net子目录下的web.config,对当前目录的设置。比如每个目录的二级菜单不同,那么就在config里面分别设置二级菜单的变量。

<%'页程序块%>:把本页的asp程序写在一起,尽量做到程序和页面内容分开。当然不可避免的要在内容中嵌入变量或者函数,就相当于asp.net的自定义控件了。

../include/header.asp:也许看不到这个页面里的东西你不会觉得妙,但是我可以形容一下,里面有html代码的定义和head、body标签,还有网页的logo、menu等信息。当然如果有登录状态或者是二级菜单的化也要放到里面。总之,在网页上面公用的部分都在这个页里。

网页内容:里面就是html代码了,每页不同的部分都在这里。

../include/footer.asp:这里主要包含copyright之类的东西。

然后举例简单说明怎么用(基本上就算掏底了):
../include/header.asp
复制内容到剪贴板
代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title><%= title_ie %></title>
<%= link_feed %>
<link href="../style/web.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="header">
<div id="state"><% config_loginState %></div>
<div id="anav"><% =config_anav %></div>
<h1><%= title %></h1>
<div id="subhead"><%= title_subhead %></div>
<div id="menu"><% =config_menu %></div>
<div id="nav"><% =config_nav %></div>
</div>
<div id="main">
<div class="left">
<h2><%= title_page %></h2>
这是header里面的全部代码,里面所有的asp部分都是变量或者函数。大多数在各级config里面设置,少数比如title在config设置后,可能还需要在每页写个脚本,追加一部分。比如config里面已经设置了title="citywill.net",在某一页的程序块中可以这样追加title="我这样编写asp - "&title

这就是本人的做法,在实践中发现这样做比较高效,但是仍需不断的改善。请大家多多指教。

[ 本帖最后由 citywill 于 2006-7-18 13:08 编辑 ]
代码混杂、重用率低是代码工人自身的能力问题。在正规的项目中,真正的程序员是不会写出这样的代码的。
正解,这样的代码,看起来也累。。。
我一直哭一直哭,哭我没鞋穿。直到有一天我看到一个人,他连脚也没有……

TOP

认证您的手机,获得手机认证图标, 更多手机认证的好处
我的理解应该是模板、类、函数、过程;表现跟代码分离。不懂后台程序的前台设计人员只要能调用模块就可以了。
交流算法思路,讨代码者滚。
楼主的这代码写得有问题么?我觉得对于中小型企业站点应当能胜任了

那么2楼和3楼可否介绍下相关的经验呢?

TOP

2,3楼,,那你们是如何写代码的呢,,他的哪里出现问题了呢

TOP

我也希望能在这里讨点经验,这对我来说是个很严重的问题,谢谢!

TOP

模块化,显示层和数据层分离!

TOP

多加注释也是有必要的!!方便维护修改!!

TOP

这是维护的自己的类库、函数库的一部分代码

作为程序员,相信每个人都有自己的函数库及类库。在做项目时,从库里面提取想要的函数及类。这样可以提高开发效率。

CJJ专用ASP类库中的某个class
复制内容到剪贴板
代码:
  '----******************** TConnString *****************************----
  '数据库连接字符串结构体
  Class TConnString
      Public DBName,DBPath,DBServer,DBUser,DBPass,DBType
  End Class
  '----******************** TConnString *****************************----
  '----********************* TDBOperate *****************************----
  '通用数据库操作类
  Class TDBOperate
      Private cls_oConn,cls_oRS '类私有Connection对象、RecordSet对象
      Private cls_sErrInfo,cls_sConn,cls_sSQL,cls_sURL,cls_sFormAction
      Private cls_iPageSize '分页数
      Private cls_lTotalPage,cls_lTotalRecord,cls_lPageNo
      '类初始化
      Private Sub Class_Initialize()
      End Sub
      '*****************************************
      ' 类型:    属性
      ' 目的:    根据获取的Connection String,创建数据库连接
      ' 输入:    a_sConn:数据类型字符串
      ' 返回:    无
      '*****************************************
      Public Property Let SetConn(a_sConn)
          Dim sObjType
          sObjType = LCase(TypeName(a_sConn))
          If sObjType <> "string" Then
              cls_sErrInfo = cls_sErrInfo & "<li>SetConn:非法的字符串参数</li>" & Chr(10)
              Exit Property
          End If
          Set cls_oConn = CreateObject("Adodb.Connection")
          On Error Resume Next
          cls_oConn.Open a_sConn
           If Err Then
              Err.Clear
              Set cls_oConn = Nothing
              On error goto 0
              cls_sErrInfo = cls_sErrInfo & "<li>数据库连接出错</li>" & Chr(10)
          End If
          On Error Goto 0
      End Property
      
      '*****************************************
      ' 类型:    属性
      ' 目的:    根据获取的Connection对象,创建数据库连接
      ' 输入:    a_oConn:数据类型字符串
      ' 返回:    无
      '*****************************************
      Public Property Set SetConn(a_oConn)
          Dim sObjType,sConn
          Dim oConnStr
      
          sObjType = LCase(TypeName(a_oConn))
   
          Select Case sObjType
          Case "connection"
              '设置Connection对象
              Set cls_oConn = a_oConn
          Case "tconnstring"
             sConn = ""
             Set oConnStr = a_oConn
             Select Case (oConnStr.DBType)
             Case gbl_iDB_Access
                  sConn = "Provider = micorsoft.jet.oledb.4.0; User ID = " & oConnStr.DBUser & "; Password = " & Replace(oConnStr.DBPass, Chr(0), "") & ";Initial Catalog = " & oConnStr.DBName & "; Data Source = " & SqlLocalName & ";"
              Case gbl_iDB_MsSQL
                  sConn = "Provider = Sqloledb; User ID = " & oConnStr.DBUser & "; Password = " & Replace(oConnStr.DBPass, Chr(0), "") & ";Initial Catalog = " & oConnStr.DBName & "; Data Source = " & oConnStr.DBServer & ";"
              End Select
   
              If sConn = "" Then
                  cls_sErrInfo = cls_sErrInfo & "<li>数据库连接对象出错,无法创建Connection对象</li>" & Chr(10)
                  Exit Property
              End If
             '设置Connection连接串值,供ConnStr属性返回
              cls_sConn = sConn
      
              Set cls_oConn = CreateObject("Adodb.Connection")
              On Error Resume Next
              cls_oConn.Open sConn
               If Err Then
                  Err.Clear
                  Set cls_oConn = Nothing
                  cls_sErrInfo = cls_sErrInfo & "<li>数据库连接出错</li>" & Chr(10)
              End If
              On Error Goto 0
          Case Else
              cls_sErrInfo = cls_sErrInfo & "<li>SetConn:非法的对象参数</li>" & Chr(10)
              Exit Property
          End Select
      End Property
      '*****************************************
      ' 类型:    属性
      ' 目的:    设置RecordSet对象
      ' 输入:    a_sSQL:   SQL语句。
      ' 返回:    无。
      '*****************************************
      Public Property Let SetRS(a_sSQL)
          If LCase(TypeName(cls_oConn)) <> "connection" Then
              cls_sErrInfo = cls_sErrInfo & "<li>非法的Connection对象,无法创建RecordSet对象</li>" & Chr(10)
              Exit Property
          End If
  
          cls_sSQL = a_sSQL
          '创建RecordSet对象
          Set cls_oRS = CreateObject("Adodb.RecordSet")
'          On Error Resume Next
          cls_oRS.Open cls_sSQL,cls_oConn,1,1
'          On Error Goto 0
      End Property
      '*****************************************
      ' 类型:    属性
      ' 目的:    设置RecordSet对象
      ' 输入:    a_oRS:   RecordSet对象
      ' 返回:    无。
      '*****************************************
      Public Property Set SetRS(a_oRS)
          If LCase(TypeName(a_oRS))<>"recordset" Then
              cls_sErrInfo = cls_sErrInfo & "<li>非法的RecordSet对象</li>" & Chr(10)
              Exit Property
          End If
          '设置RecordSet对象
          Set cls_oRS = a_oRS
      End Property
      '*****************************************
      ' 类型:    属性
      ' 目的:    设置RecordSet对象
      ' 输入:    a_oRS:   RecordSet对象
      ' 返回:   返回一RecordSet对象
      '*****************************************
      Public Property Get GetRS()
          Set GetRS = cls_oRS
      End Property
      '获取Connection对象
      Public Property Get GetConn()
          If cls_sErrInfo <> "" Then
              Call ShowError()
          End If
   
          If LCase(TypeName(cls_oConn))<>"connection" Then
              cls_sErrInfo = cls_sErrInfo & "<li>Connection对象获取失败</li>"
'              Exit Property              
          End If
   
          Set GetConn = cls_oConn
      End Property
      '返回数据库连接字符串
      Public Property Get ConnStr
          ConnStr = cls_sConn
      End Property
  
      '设置第个页面显示的数据数
      Public Property Let PageSize(a_iPageSize)
          If Not IsNumeric(a_iPageSize) Then
              cls_sErrInfo = cls_sErrInfo & "<li>无效的分页记录数参数</li>" & Chr(10)
              Exit Property
          End If
  
          cls_iPageSize = a_iPageSize
      End Property
      
      '设置SQL语句,用于建立RecordSet对象
      Public Property Let SQL(a_sSQL)
           If IsNone(a_sSQL) Then
              cls_sErrInfo = cls_sErrInfo & "<li>没有设置SQL,无法创建RecordSet对象</li>" & Chr(10)
              Exit Property
          End If
          cls_sSQL = Trim(a_sSQL)
      End Property
      '执行数据操作
      Public Sub Execute()
          If cls_sErrInfo <> "" Then
              ShowError("<ul>" & Chr(10) & cls_sErrInfo & "</ul>" & Chr(10))
              Exit Sub
          End If
          If LCase(TypeName(cls_oConn))="connection" Then
              If IsNumeric(cls_iPageSize) Then
                  Set cls_oRS =  CreateObject("Adodb.RecordSet")
                  cls_oRS.Open cls_sSQL,cls_oConn,1,1
              Else
              End If
          Else
              cls_sErrInfo = cls_sErrInfo & "<li>非法的Connection对象</li>" & Chr(10)
          End If
      End Sub
      '*****************************************
      ' 类型:    属性
      ' 目的:    设定或显示URL。
      ' 输入:    a_sURL:   需要分页的文件地址。
      ' 返回:    无
      '*****************************************
      Public Property Let URL(ByVal a_sURL)
          cls_sURL = a_sURL
      End Property
      '*****************************************
      ' 类型:    过程
      ' 目的:    统计总记录数、计算总页数
      ' 输入:    无
      ' 返回:    无
      '*****************************************
      Private Sub Pagination(ByVal a_sStr)
          Dim iPosition,cls_sErrInfo,i,oRS_Temp,lTotalRecord
          If cls_sErrInfo <> "" Then
             Call ShowErrors()
             Exit Sub
          End If
          If cls_oRS.Eof And cls_oRS.Bof Then
             cls_sErrInfo = cls_sErrInfo & "<li>库中无任何记录</li>"
          End If
          '计算总计录数
          Select Case LCase(TypeName(a_sStr))
          Case "string"
               Set oRS_Temp = cls_oConn.Execute(a_sStr)
               lTotalRecord = CLng(oRS_Temp(0).Value)
          Case "integer"
              Select Case (Int(Trim(a_sStr)))
              Case gbl_iPagination_UseRcdCount '使的RecordCount方法进行分页
                  lTotalRecord = cls_oRS.RecordCount
              Case gbl_iPagination_UsePgCount  '使用PageCount方法进行分页
                  lTotalRecord = cls_oRS.PageCount * cls_iPageSize
              End Select
          End Select
  
          cls_lTotalRecord = lTotalRecord
          If (cls_lTotalRecord<=2147483647 AND cls_lTotalRecord>=-2147483648) Then
              cls_lTotalRecord = CLng(cls_lTotalRecord)
          Else
              cls_lTotalRecord = 2147483647
          End If

          If cls_lTotalRecord <0 Then
              cls_lTotalRecord = 0
          End If
          '计算总页数
          If cls_lTotalRecord Mod cls_iPageSize = 0 Then
              cls_lTotalPage = CLng(cls_lTotalRecord \ cls_iPageSize * -1)*-1
          Else
              cls_lTotalPage = CLng(cls_lTotalRecord \ cls_iPageSize * -1)*-1 + 1
          End If
          '获取当前页参数
          cls_lPageNo = Trim(Request.QueryString("Page"))
          If cls_lPageNo = "" Then
              cls_lPageNo = Trim(Request.Form("Page"))
                 If cls_lPageNo = "" Then
                 cls_lPageNo = 1
              End If
          End If
   
          '如果没有选择第几页,则默认显示第一页
          If cls_lPageNo <> "" And IsNumeric(cls_lPageNo) Then
              If (cls_lPageNo <= 2147483647 And cls_lPageNo>=-2147483648) Then
                  cls_lPageNo = CLng(cls_lPageNo)
              Else
                  cls_lPageNo = 2147483647
                End If
              If (cls_lPageNo<=0) Then
                  cls_lPageNo = 1
              End If
          Else '当前页参数为空或者非数字,默认将转到第1页
              cls_lPageNo=1
          End If
          If (cls_lPageNo > cls_lTotalPage AND cls_lTotalPage<>0) Then
              cls_lPageNo = cls_lTotalPage
          End If
          cls_oRS.PageSize     = cls_iPageSize
          cls_oRS.AbsolutePage = cls_lPageNo
          iPosition = InstrRev(cls_sURL,"?")
          cls_sFormAction = cls_sURL
          If iPosition > 0 Then
              cls_sURL = cls_sURL & "&Page="
          Else
              cls_sURL = cls_sURL & "?Page="
          End If
     End Sub
      
      '*****************************************
      ' 类型:    过程
      ' 目的:    显示分页信息
      ' 输入:    无
      ' 返回:    无
      '*****************************************
      Public Sub Pages(ByVal a_sStr)
          Dim strPages,k,intTemp,intTemp1
          Dim sResult
          If Not IsNone(cls_sErrInfo) Then
              Call ShowErrors()
          End If
        
          '计算总页数及总记录数
          Call Pagination(a_sStr)
          If cls_lTotalPage = 1 Then Exit Sub
          sResult = sResult & "<table class=""clsShowPage"">" & Chr(10)
          sResult = sResult & "  <tr>" & Chr(10) & "    <td>" & Chr(10)
          sResult = sResult & "      <table width=""100%"">" & Chr(10)
          sResult = sResult & "         <tr>" & Chr(10) & "           <td class=""PageText"">" & Chr(10)
          If cls_lTotalPage >= 1 Then
                  If cls_lPageNo <= 1 Then
                      sResult = sResult & "首页 前页 <a href=""" & cls_sURL & cls_lPageNo+1 & """>后页</a> <a href=""" & cls_sURL & cls_lTotalPage & """>末页</a>" & Chr(10)
                  Else
                      If cls_lPageNo >= cls_lTotalPage Then
                          sResult = sResult & "<a href=""" & cls_sURL & "1"">首页</a>  <a href=""" & cls_sURL  & cls_lPageNo -1 & """>前页</a>  " & "后页  末页" & Chr(10)
                      Else
                          sResult = sResult & "<a href=""" & cls_sURL & "1"">首页</a> <a href=""" & cls_sURL  & cls_lPageNo -1 & """>前页</a> " & "<a href=""" & cls_sURL  & cls_lPageNo+1 & """>后页</a> <a href=""" & cls_sURL  & cls_lTotalPage & """>末页</a>" & Chr(10)
                      End If
                  End If
                  sResult = sResult & " 页次:<strong>" & cls_lPageNo & "</strong>/" & cls_lTotalPage & "页 共<strong>" & cls_lTotalRecord & "</strong>条记录 <strong>" & cls_iPageSize & "</strong>条/页</td>" & Chr(10)
                  sResult = sResult & "      <form name=""gopage"" action=""" & cls_sFormAction & """ method=""post"">" & Chr(10)
                  sResult = sResult & "      <td> 第"
                  sResult = sResult & "    <input type=""text"" name=""pageno"" class=""InputPage"" title=""请输入页号,然后回车"">页 " & Chr(10)
                  sResult = sResult & "<input type=""submit"" class=""GotoPage"" value=""GO""></td></form></tr>" & Chr(10)
          End If
          sResult = sResult & "      </table>" & Chr(10) & "    </td>" & Chr(10) & "  </tr>" & Chr(10) & "</table>" & Chr(10)
          '输出分页信息
          Response.Write("result:" & sResult)
      End Sub

      '类销毁
      Private Sub Class_Terminate()     
          If LCase(TypeName(cls_oConn))<>"nothing" Then
              cls_oConn.Close
              Set cls_oConn = Nothing
          End If
  
          If LCase(TypeName(cls_oRS))<>"nothing" Then
       '       cls_oRS.Close
              Set cls_oRS = Nothing
          End If
      End Sub
      '*****************************************
      ' 类型:    过程
      ' 目的:    显示分页类中出现的错误信息
      ' 输入:    无
      ' 返回:    无
      '*****************************************
      Private Sub ShowErrors()
          If cls_cls_sErrInfo <> "" Then
              cls_cls_sErrInfo = "<ul>" & Chr(10) & cls_sErrInfo & "</ul>" & Chr(10)
              Response.Write(cls_cls_sErrInfo)
              Response.End
          End If
      End Sub
  End Class
  '----********************* TDBOperate *****************************----
我自己的函数库中的某两个函数的代码
复制内容到剪贴板
代码:
  '**********************************************
  ' 类型:函数
  ' 目的:判断E-MAIL地址是否正确
  ' 参数:a_sEmail,待检测的E-Mail地址
  ' 返回: ture或false
  ' 作者:cjj
  ' 时间:2006-6-14
  ' 版本:v1.0
  ' 备注:(记录过程或函数的修改说明)
  '**********************************************
  Function isEmail(ByVal a_sEmail)
      Dim sEmail
      Dim iPos,i
      ' 函数默认返回值
      isEmail = false
      sEmail = Trim(a_sEmail)
  
      If Instr(sEmail,"@") <1 Or Instr(sEmail,".") <1 Then
          Exit Function
      End If

      iPos = Instr(sEmail,"@")

      If iPos>=Instr(iPos+1,sEmail,".") Then
          Exit Function
      End If
       '函数返回值
       isEmail=true
  End Function
  '**********************************************
  ' 类型:函数
  ' 目的:显示服务器端信息
  ' 参数:无
  ' 返回:往客户端输出服务器端信息table
  ' 作者:cjj
  ' 时间:2006-6-14
  ' 版本:v1.0
  ' 备注:(记录过程或函数的修改说明)
  '**********************************************
  Sub ViewServerInfo()
      Dim sName,sHtml
  
      sHtml = "<Table border=1 bordercolor=lightblue CELLSPACING=0>" & Chr(10)

      For Each sName In Request.ServerVariables
          sHtml = sHtml & "  <tr>" & Chr(10)
          sHtml = sHtml & "    <td>" & sName & "</td>" & Chr(10)
          sHtml = sHtml & "    <td>" & Request.ServerVariables(sName) & "</td>" & Chr(10)
          sHtml = sHtml & "  </tr>" & Chr(10)
      Next

      sHtml = sHtml & "</table>" & Chr(10)
      '往客户端输出信息
      Response.Write(sHtml)
  End Sub

TOP

稍提一个编码风格

个人觉得代码混排是个鸡肋,混排的可读性差,所以我一般都只是少量混排,尽量将代码和HTML分离。
复制内容到剪贴板
代码:
<!--#include file="pubdb.asp"-->
<%  
  '*****************************************
  '类型:函数
  '目的:报错
  '参数:
  'a_num:报错信息参数
  '*****************************************
  Private Function ShowError(a_Num)
      Dim sErrInfo
      sErrInfo = ""
      Response.Write("<p>Error Number:era_" & a_Num & "</p>")
      Select Case a_Num
      Case "1000"
          sErrInfo = "参数类型不正确,请检查"
      Case "1100"
          sErrInfo = "无法打开数据库连接"
      Case Else
          sErrInfo = "发现未知错误,请与管理员联系"
      End Select
      sErrInfo = "<p>Error Description:" & sErrInfo & "</p>"
      Response.Write(sErrInfo)
      Response.End
  End Function
  Dim oRS,sHtml
  Call OpenDB()
  Set oRS = oConn.OpenSchema(20)
  sHtml=""
  oRS.MoveFirst
  '循环读取数据库中的表名
  Do While Not oRS.EOF
      If UCase(oRS(3))="TABLE" Then
          sTemp = Trim(oRS(2))
          If sTBName = sTemp Then
              sHtml= sHtml & Space(2) & "<option value=""" & sTemp & """ selected=""selected"">" & sTemp & "</option>" & Chr(10)
          Else
              sHtml= sHtml & Space(2) & "<option value=""" & sTemp & """>" & sTemp & "</option>" & Chr(10)
          End If
      End If
      oRS.MoveNext
  Loop
  Call CloseDB()
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>数据库名</title>
<script type="text/javascript">
<!--
    var sDstID="";
    function serverResult(a_sUrl,a_sSrcID,a_sDstID) {
       var sValue = document.getElementById(a_sSrcID).value;
       sDstID=a_sDstID;
       if ((sValue == null) || (sValue == "")) return;
   
       var sUrl = a_sUrl+sValue;
       oXml.open("GET", sUrl,true);
       oXml.onreadystatechange = updateData;
       oXml.send(null);  
    }
    function updateData() {
        var aElmnts = sDstID.split(',');
        var oElmnt = null;
        var aTags=null;
        var oXmlData=null;
        if ((oXml.readyState == 4) && (oXml.status == 200)) {
            aTags = oXml.responseXML.documentElement.getElementsByTagName("cjjitem");
            if (aTags.length!=aElmnts.length) {
                alert('获取的服务器端的数据错误!');
                return null;
            }
   
            for (var i=0;i<aElmnts.length ;i++ ) {
                oElmnt = document.getElementById(aElmnts[i]);
                oElmnt.innerHTML=aTags[i].firstChild.data;
            }
        }
        return true;
    }
    var oXml = false;
    if (window.ActiveXObject) {
        oXml = new ActiveXObject("Microsoft.XMLHTTP");
    } else if (window.XMLHttpRequest) {
        oXml=new XMLHttpRequest();
    }
//-->
</script>
</head>
<body>
<form method="POST" name="form1" action="addFormData.asp">
    <p> </p>
    <p>数据库名:<input type="text" name="txtDBName" size="7" value="work"> 数据库用户名:<input type="text" name="DBUserName" size="8" value="sa">数据库密码:<input type="password" name="DBUserPassWord" size="10" value=""> 数据库服务器路径:<input type="text" name="DBServerPath" size="20" value="127.0.0.1"></p>
    <p>数据表名:<select size="1" id="sltTBName" name="sltTBName" onchange="serverResult('getFieldList.asp?n=','sltTBName','fieldcount,tblFields');">
    <option selected="selected">请选择一个表</option>
    <%=sHtml%>
    </select></p>
<div id="fieldcount">表字段个数:<input type="text" id="txtFldCount" name="txtFldCount" value="0" /></div>
  <table id="tblFields" border="1" width="91%">
    <thead>
        <tr>
            <td align="center" width="94">字段名</td>
            <td align="center" width="113">字段类型</td>
            <td width="27" align="center">使用</td>
            <td width="18" align="center">只读</td>
            <td align="center" width="80">表单项类型</td>
            <td align="center" width="100">表单项名称</td>
            <td align="center" width="92">表单项描述</td>
            <td align="center" width="87">表单项验证</td>
            <td align="center">表单项默认值</td>
        </tr>
     </thead>
     <tbody>
     </tbody>
    </table>
    <p align="left">需要生成的动态ASP网页类型:<select size="1" name="sltAspType">
    <option value="0">数据添加</option>
    <option value="1">数据编辑</option>
    <option value="2">数据删除</option>
    <option value="3">数据管理</option>
    <option value="4">数据列表</option>
    </select> 文件名:<input type="text" name="txtFileName" size="17" value="">
    文件类型:<select size="1" name="sltFileType">
    <option value="ASP">ASP</option>
    <option value="PHP">PHP</option>
    <option value="JSP">JSP</option>
    <option value="PERL">PERL</option>
    <option value="VB.NET">VB.NET</option>
    <option value="C#">C#</option>
    </select>
    <input type="submit" value="生成文件" name="action"></p>
</form>
</body>
</html>
编程我们要明确自己要达到什么目的,分几步走,想清楚了再开始写,不然直接信手写下去,这个程序十有八、九要重构过。明确目的后,大致构思一些实现的思路,然后按造这个思路去解决。

写代码时需要注意养成一种良好的编码风格,这样写出来的代码可读性比较强。我稍微提一个变量命名风格,变量类型+变量名。我比较懒,所以我一般都通过一个小写字母来标识变量的类型,Integer型用小写i,如iCount;String型用小写s,如sStr等等。碰上一些第一个字母相同,则常用的类型用每一个字段,不常用的类型除了取每一个字母外再加紧跟的第二个字段,如Boolean和Binary,那我就用b表示布尔型用bi表示二进制,依此类推。如果是全局型变量我就给它加gbl前缀,如果是class级给它加上cls前缀。如:iTemp,cls_iTemp(class级变量),gbl_iTemp(全局变量)。变量名一定要表达清楚意思,哪种名称比较常,这样不会给其它阅读的人造成困扰,不需要花太多时间去研究你的代码。
变量名中第一位小写字母简写说明
   a  : Array
   b  : Boolean
   bi : Binary
   by : Byte
   c  : Const
   ch : Char
   d  : DateTime
   i  : Integer
   l  : Long
   o  : Object
   s  : String
   v  : Variant
变量名前缀说明
   a   : 函数或过程中的参数,如 a_sName
   cls : CLASS级变量,如 cls_sUser
   gbl : 全局变量,如 gbl_sSiteName

[ 本帖最后由 cjj 于 2006-7-18 11:26 编辑 ]

TOP

1:楼主的代码习惯还是初级水平的。按照您提到的习惯,如使用php等中的模板就解决你的问题了,其实,不然,真正高效 的程序是在处理业务的流程上,就是先经过大脑深思熟虑过,加上代码经验,写出来的代码没有差的。别被表面的一下东西迷惑,只有写了n多的项目以后你才能体会到的。

2:cjj提供的那个函数不错,copy下来先。



----》编辑

cjjer--》cjj,我写惯了,就把用户名些错了,31别介意,呵呵。

[ 本帖最后由 5do8 于 2006-7-18 13:42 编辑 ]
23555455(WEB中高程Q群) 我的播客,去代码片断平台

TOP

asp这东西没办法,不混排的话,看着好香模块化了,但是你要是改界面就麻烦了……东一块西一块的。

TOP

感谢朋友们的回复,看后得到了很多启发。特别感谢cjjer,很荣幸能够抛砖引玉。而且发现,我和cjjer在分页的处理上十分的相似。

但是要说明下:

1.我所展示的代码,实际是系统的“前台”,我所考虑的也只是如何高效的衔接前后台(也就是静态和动态分离)。类和函数我当然也要用,都在<!--#include file="../include/config.asp" -->里面。

2.关于前后台的衔接,asp.net和php环境都有很好的用模板解决的方案,但是asp没有(可以说asp匮乏的可怜)。大家也都知道用include,我只是提供了一个用include的技巧而已。

3.如果你是一个纯粹的程序员,从来不用考虑前台的话,那么模块化也就没有什么意义了,大可以把工作重心放在类和函数上(可是asp又不面向对象)。

4.asp是个古老的语言了,但是看样子还没到消失的时候;)。

[ 本帖最后由 citywill 于 2006-7-18 13:41 编辑 ]

TOP

小雨说的界面问题,不仅仅是ASP,PHP也同样存在。关于模版PHP中有个SMARTY,ASP中也完全可以照样写一个。界面交给CSS就行了。改界面的话,只要改CSS文件,不涉及到程序,楼主的代码中也是这样做的。

ASP中用ADODB.STREAM,可以实现按需INCLUDE。

ASP中可以用python或javascript实现面向对象的编程。所以说ASP不支持面向对象是错误的说法。

[ 本帖最后由 cjj 于 2006-7-18 14:43 编辑 ]

TOP

楼主,抓紧时间学习ASP.NET,不要再在研究ASP上浪费时间了。

TOP

9494,asp先天不足很难在开发模式上取得突破,不过小型的站点建议还是用asp来的简单,嘿嘿,不要听别人说asp怎么样怎么样,他既然还存在就有他存在的理由
。。。

TOP

学习学习。

现在准备学习.net   自学 所以中间有些东西不是很清楚。
半壺水 響叮噹

涓涓細流 長流不息

TOP

很不错啊,我支持,我也喜欢ASP,我通常把可以重复使用的称为模块,然后尽量减少重复写代码的辛苦,同时结构也更清晰!
寻找属于我的答案!

TOP

个人感觉还是Java的MVC三层架构做的好,代码跟HTML都分离开了,在辅用
一些Struts等等什么的框架,这样就更好了
不足的一点就是现在很多编辑器对Struts的编辑视图不怎么支持,看不到效果
曾经沧海难为水,除却巫山不是云.

TOP

唉~~~

有钱了,什么都一样。程序员又怎样呢?一样是“民工”。
http://www.fo128.com/blog/

TOP

市场的今天,不是往日了

TOP

呵呵,越扯越远了。
我也正在学习.net。
php .net java 毋庸置疑要比asp强大易用。但是这里讨论的是在asp的框架下,如何能做到最接近.net。或者说让代码工人获得更大的解放。

TOP

写代码到了最后就是一个构架的问题,思想没跟上,再好的语言也没用,严重支持这样的介绍经验的帖子!

TOP

同意楼上的话,写代码到最后讲究的是设计了,一个项目设计得好的话,开发方便,日后的维护简单,省时省力。语言不重要了,到一定的能力,花个把小时就可以上手新的语言了。

TOP

似乎用JS来写那写常用函数更好一些..比如把prototype.js放到SERVER端都可以用...也更面向对象一些...
桃花运啊桃花劫...

TOP