中勤在线网站开发规范及流程v1.0

中勤在线网站开发规范及流程v1.0
修订历史记录
日期
版本
说明
作者
2004.7.10
1.0
建立整个文档的基本框架
heavenkiller、陈哲
 
 
 
 
 
 
 
 
 
 
 
 
 
Web 开发的分散性和交互性,决定了 Web 开发必须遵从一定的开发规范和技术约定,只有每个开发人员都按照一个共同的规范去设计、沟通、开发、测试、部署,才能保证整个开发团队协调一致的工作,从而提高开发工作效率,提升工程项目质量。
一、项目的角色划分
如果不包括前、后期的市场推广和产品销售人员,开发团队一般可以划分为项目负责人、策划和客户联络、程序员、美工四个角色。
项目负责人负责项目的人事协调、时间进度等安排,以及处理一些与项目相关的其它事宜。策划和客户联络主要负责与客户联络沟通和项目的需求分析、策划。程序员主要负责程序模型设计、代码编写、网站整合、白盒测试、部署等环节的工作。美工负责网站的界面设计、版面规划,把握网站的整体风格。如果项目比较大,可以按照四种角色把人员进行分组。在进行开发之前,请网络管理人员配置好机器,安装好相应的开发软件,架设相应的 FTP 服务器,并分配空间,帐号及密码给项目组。
 
二、开发工具的选取
数据库开发使用 Microsoft SQL Server2000 数据库建模使用 Microsoft Visio
程序开发使用 Visual Studio.Net C# 语言); 程序建模使用 Rational Rose ;程序文档书写使用 Borland Together For Visual Studio.Net
代码版本控制采用 Visual SourceSafe ;网站测试采用 Visual Studio.Net 的附带工具 Microsoft Application Center Test ,它可以进行并行、负载测试等。
美工页面开发使用 Macromedia Dreamweaver MX 2004 ,其余不作限制,推荐 Fireworks MX 2004 Flash MX 2004
其它文档的编写采用 Microsoft Word 2003
三、项目开发流程
由项目经理牵头组织,以程序员为重心,共同讨论,完成用户需求分析,产生网站的栏目规划(用树形图表示),标出哪些是静态页面,哪些是动态页面。动态页面须要程序实现。制定网站的界面框架,包括首页构图,及各页面间的钩稽关系。产生各栏目文件夹的结构图(一些公共文件夹如 images js css 等需要固定存放,共同调用)。
然后由美工根据内容表现的需要,设计静态网页和其它动态页面界面框架,该切分的图片要根据尺寸切割开来。给需要程序动态实现的页面预留页面空间。制定字体、字号、超级链接等 CSS 样式等。
在美工设计页面的同时,程序员着手开发后台程序代码,做一些必要的测试。美工界面完成后,由程序员添加程序代码,整合网站。由项目组共同联调测试,发现 bug ,完善一些具体的细节。制作帮助文档、用户操作手册。向用户交付必要的产品设计文档。
最后进行网站部署。
以上的每一步都会产生一些阶段性成果,项目经理需要及时进行审核、监督,发现问题及时纠正。为了控制项目的进度,可以实施填写 " 项目进度表 " 制度,即每天填写工作日志,记录当天的工作细目和工作量,以及需要解决的问题。
所有项目均由“质量控制中心”进行统一的质量评估和监管,在每个里程碑结束时,由项目经理提交一份“项目 XX 里程碑总结报告”并提交所有阶段性成果给。“质量控制中心”将从系统设计,页面制作,程序开发,项目运营等多个方面对项目进行评估,并根据评估结果决定项目是否继续进行下去。
 
四、文件夹命名约定
 
控件接口文件夹:
/ExportControls: 用于存放所有对外使用的用户控件
/ImportControls: 用于存放所有从外界引入的用户控件
公共文件夹:
/images    
公共图片
/css        
样式表
/js         
脚本
/ original file  原始页面文件
/doc       
网站相关素材、文档、系统分析文件,如 UML 建模图,一些较为复杂的算法的流程图,功能需求分析等。
              readme.txt   项目说明文档
              helps.htm     项目帮助文档
              mylogs.txt    项目维护记录


/Business   存放业务逻辑层代码,即连接页面表示层和数据库的纯代码。
/database   存放数据库相关文件
/Import   存放引入其它模块接口后承继重写后的接口 , 即所有的输入接口。
/ImportUserControls  存放所有从其它模块引入的用户控件
/Export   存放本模块的输出接口。
/ExportUserControls  存放本模块能够向外界提供的用户控件
/Manage 存放本模块的后台程序。
/Index    一般只用于整个项目的根目录下,用于存放整个项目的主页相关内容。
/AllImport   在项目的根目录下建立,用于存放项目整合中所有引入模块接口。
/AllImportUserControls   在项目的根目录下建立,用于存放项目整合中所有引入的用户控件
/Index.aspx  为各模块的主页面,有此模块可以例外,如登录模块可用 Login.aspx.


   
其它栏目的命名,可以用拼音首字母简称,也可以用英文单词。全部文件夹的含义在 readme.txt 文件中说明。
 
我的心太乱...
返回顶端
 
 
heavenkiller
等级: 夕月彗星
头衔: 一般用户
威望: -3
文章: 45
积分: 1415
星座: 牧羊座
注册: 2004-9-20 14:31:50
 
 时间: 2004-10-30 12:17:08  主题: [分享]中勤在线网站开发规范及流程v1.0第1楼 

五、技术规则
 

2、程序代码规范
2-1 :程序块要采用缩进风格编写。
2-3 :较长的语句( >80 字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
示例:
if(ChBox.Checked==true)
                            {     
          TheArticle.ID = DataGrid1.Items[i].Cells[0].Text;
          TheArticle.PassAdmin = Session["HnucAdmin"].ToString();
      
Res+="<br/> 文章
+((HyperLink)DataGrid1.Items[i].Cells[1].FindControl("ArticleLink")).text
+":"+ TheArticle.Pass();
                      }
2-4: 循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。
2-5: 若函数或过程中的参数较长,则要进行适当的划分。
2-6: if for do while case switch default 等语句自占一行,且 if for do while 等语句的执行语句部分无论多少都要加括号 {}
2-7: 一行程序以小于 80 字符为宜,不要写得过长。
2-8: 源程序中关系较为紧密的代码应尽可能相邻。
说明:便于程序阅读和查找。
示例:以下代码布局不太合理。
rect.length = 10;
char_poi = str;
rect.width = 5;
 
若按如下形式书写,可能更清晰一些。
rect.length = 10;
rect.width = 5; // 矩形的长与宽关系较密切,放在一起。
char_poi = str;
 
2-9: 数据库设计必须先统一采用数据库建模,然后对建模进行正向工程导出代码,再在此代码上进行修改。
数据库设计完成后,要提交的工件包括建模图,所有代码,包括数据库创建代码,测试数据输入代码和数据库清除代码, 以及相应的说明文档,包括数据库的总体设计,每个表的详细说明,每个存储过程,触发器的说明。
2-10: 在每一个 ASP.NET 页面的 Page_Load 方法中都要是否是响应客户端回发而加载。
例如:
private void Page_Load(object sender, System.EventArgs e)
              {
                     // 在此处放置用户代码以初始化页面
                     if( !Page.IsPostBack )
                    
              }
2-11:  在每一个要求权限控制的页面上都要加上权限审查的的语句,如果没有权限则转到相应的页面。
2-12 对于异常,在项目开发初期,能不处理的尽量不处理,让异常充分暴露,在项目后期再对其进行统一规划处理。
 
3. 注解
3-1: 一般情况下,源程序有效注释量必须在 20 %以上。
3-2: 函数头部应进行注释,列出:函数的目的 / 功能、输入参数、输出参数、返回值、调用关系(函数、表)等。
C# 编程中注释的具体使用请参考 MSDN 中:
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/csref/html/vclrfTagsForDocumentationComments.htm
例子:
/// <summary>
              /// 在设置了连接字的基础上输入一个 SQL 语句,返回一个表
              /// </summary>
              /// <param name="SQL">SQL 语句 </param>
              /// <returns> </returns>
              /// <remarks> 静态方法 </remarks>
              public static DataTable GetDataTable(string SQL)
              {
                     // 此方法通过传递 SQL 返回 DataTable
                     SqlConnection Conn = new SqlConnection( ConnStr );
                     SqlDataAdapter myCmd = new SqlDataAdapter(SQL,Conn);
                     DataSet ds = new DataSet();                  
                     myCmd.Fill(ds,"dsTable");
                     DataTable dt = ds.Tables[0];                   
                     Conn.Close();
                     return dt;
              }
3-3: 边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
3-4: 注释的内容要清楚、明了,含义准确,防止注释二义性。
3-5: 避免在注释中使用缩写,特别是非常用缩写。
3-6: 注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
3-7: 对于所有有物理含义的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其物理含义。变量、常量的注释应放在其上方相邻位置或右方。
3-8: 注释与所描述内容进行同样的缩排。
示例:如下例子,排版不整齐,阅读稍感不方便。
void example_fun( void )
{
/* code one comments */
    CodeBlock One
 
        /* code two comments */
    CodeBlock Two
}
 
应改为如下布局。
void example_fun( void )
{
    /* code one comments */
    CodeBlock One
 
    /* code two comments */
    CodeBlock Two
}
3-9: 将注释与其上面的代码用空行隔开。
示例:如下例子,显得代码过于紧凑。
/* code one comments */
program code one
/* code two comments */
program code two
 
应如下书写
/* code one comments */
program code one
 
/* code two comments */
program code two
3-10: 对除了很易懂的变量的定义和分支语句(条件分支、循环语句等)必须编写注释。
说明:这些语句往往是程序实现某一特定功能的关键,对于维护人员来说,良好的注释帮助更好的理解程序,有时甚至优于看设计文档。
       3-11: 避免在一行代码或表达式的中间插入注释。
       3-12: 通过对函数或过程、变量、结构等正确的命名以及合理地组织代码的结构,使代码成为自注释的。
       说明:清晰准确的函数、变量等的命名,可增加代码可读性,并减少不必要的注释。
       3-13 :在代码的功能、意图层次上进行注释,提供有用、额外的信息。
       说明:注释的目的是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没必要的重复注释信息。
示例:如下注释意义不大。
/* if receive_flag is TRUE */
if (receive_flag)
 
而如下的注释则给出了额外有用的信息。
/* if mtp receive a message from links */
if (receive_flag)
       3-14: 在程序块的结束行右方加注释标记,以表明某程序块的结束。
说明:当代码段较长,特别是多重嵌套时,这样做可以使代码更清晰,更便于阅读。
示例:参见如下例子。
if (...)
{
    // program code
 
    while (index < MAX_INDEX)
 
我的心太乱...
返回顶端
 
 
heavenkiller
等级: 夕月彗星
头衔: 一般用户
威望: -3
文章: 45
积分: 1415
星座: 牧羊座
注册: 2004-9-20 14:31:50
 
 时间: 2004-10-30 12:18:06  主题: [分享]中勤在线网站开发规范及流程v1.0第2楼 

5.  声明
6.  表达式和语句
6-1: 不要使用难懂的技巧性很高的语句,除非很有必要时。
说明:高技巧语句不等于高效率的程序,实际上程序的效率关键在于算法。
示例:如下表达式,考虑不周就可能出问题,也较难理解。
* stat_poi ++ += 1;
 
* ++ stat_poi += 1;
 
应分别改为如下。
*stat_poi += 1;
stat_poi++;     // 此二语句功能相当于“ * stat_poi ++ += 1;
 
++ stat_poi;
*stat_poi += 1; // 此二语句功能相当于“ * ++ stat_poi += 1;
6-2: 明确函数功能,精确(而不是近似)地实现函数设计。
6-3: 一个函数仅完成一件功能。
6-4: 为简单功能编写函数。
6-5: 不要设计多用途面面俱到的函数。
6-6: 避免设计多参数函数,不使用的参数从接口中去掉。
说明:目的减少函数间接口的复杂度。
 6-7: 非调度函数应减少或防止控制参数,尽量只使用数据参数。
说明:本建议目的是防止函数间的控制耦合。调度函数是指根据输入的消息类型或控制命令,来启动相应的功能实体(即函数或过程),而本身并不完成具体功能。控制参数是指改变函数功能行为的参数,即函数要根据此参数来决定具体怎样工作。非调度函数的控制参数增加了函数间的控制耦合,很可能使函数间的耦合度增大,并使函数的功能不唯一。
示例:如下函数构造不太合理。
int add_sub( int a, int b, unsigned char add_sub_flg )
{
    if (add_sub_flg == INTEGER_ADD)
    {
        return (a + b);
    }
    else
    {
        return (a  b);
    }
}
 
不如分为如下两个函数清晰。
int add( int a, int b )
{
    return (a + b);
}
 
int sub( int a, int b )
{
    return (a  b);
}
       6-8: 检查函数所有参数输入的有效性。
       6-9: 在调用函数填写参数时,应尽量减少没有必要的默认数据类型转换或强制数据类型转换。
       6-10: 避免函数中不必要语句,防止程序中的垃圾代码。
       6-11: 如果多段代码重复做同一件事情,那么在函数的划分上可能存在问题。
       6-11: 功能不明确较小的函数,特别是仅有一个上级函数调用它时,应考虑把它合并到上级函数中,而不必单独存在。
       6-12: 改进模块中函数的结构,降低函数间的耦合度,并提高函数的独立性以及代码可读性、效率和可维护性。优化函数结构时,要遵守以下原则:
       6-13: 避免使用 BOOL 参数。
       说明:原因有二,其一是 BOOL 参数值无意义, TURE/FALSE 的含义是非常模糊的,在调用时很难知道该参数到底传达的是什么意思;其二是 BOOL 参数值不利于扩充。还有 NULL 也是一个无意义的单词。
       6-14: 编程时,要防止差 1 错误。
       说明:此类错误一般是由于把“ <= ”误写成“ < ”或“ >= ”误写成“ > ”等造成的,由此引起的后果,很多情况下是很严重的,所以编程时,一定要在这些地方小心。当编完程序后,应对这些操作符进行彻底检查 .
       6-15: 要时刻注意易混淆的操作符。当编完程序后,应从头至尾检查一遍这些操作符,以防止拼写错误。
       说明:形式相近的操作符最容易引起误用,如 C/C++ 中的“ = ”与“ == ”、“ | ”与“ || ”、“ & ”与“ && ”等,若拼写错了,编译器不一定能够检查出来。
示例:如把“ & ”写成“ && ”,或反之。
ret_flg = (pmsg->ret_flg & RETURN_MASK); 
被写为:
ret_flg = (pmsg->ret_flg && RETURN_MASK);
 
rpt_flg = (VALID_TASK_NO( taskno ) && DATA_NOT_ZERO( stat_data ));
被写为:
rpt_flg = (VALID_TASK_NO( taskno ) & DATA_NOT_ZERO( stat_data ));
       6-16: 有可能的话, if 语句尽量加上 else 分支,对没有 else 分支的语句要小心对待; switch 语句必须有 default 分支。
       6-17: 对一些具有危险性的操作代码(如写硬盘、删数据等)要仔细考虑,防止对数据、硬件等的安全构成危害,以提高系统的安全性。
       6-18: 使用第三方提供的软件开发工具包或控件时,要注意以下几点:
       1 )充分了解应用接口、使用环境及使用时注意事项。
2 )不能过分相信其正确性。
3 )除非必要,不要使用不熟悉的第三方工具包与控件。
说明:使用工具包与控件,可加快程序开发速度,节省时间,但使用之前一定对它有较充分的了解,同时第三方工具包与控件也有可能存在问题。
 
 
所有字符串型字段均用 nvarchar,
所有文本型字段均用 ntext
所有字型字段均用 nchar
 
 
 
接口及整合规范
 
 
QGZXOL.Integration  命名空间存放了所有全站的接口,通过合理的调用这些接口,能够使各模块间的耦合度达到最小,同时又保持了全站的统一。
 
主要接口如下 :
 
QGZXOL.Integration. ASPNETModule 类:
 
 
          ///<summary>
         /// 通行证用户登陆
         ///</summary>
         ///<param name="_username"> 用户名 </param>
         ///<param name="_password"> 密码 </param>
         ///<returns></returns>
         public virtual bool UserLogin(string _username,string _password,HttpSessionState _session)
        
 
         ///<summary>
         /// 通行证用户注销
         ///</summary>
         ///<param name="_username"></param>
         public virtual void UserLogout(string _username,HttpSessionState _session)
        
 
       
 
我的心太乱...
返回顶端
 
 
heavenkiller
等级: 夕月彗星
头衔: 一般用户
威望: -3
文章: 45
积分: 1415
星座: 牧羊座
注册: 2004-9-20 14:31:50
 
 时间: 2004-10-30 12:19:13  主题: [分享]中勤在线网站开发规范及流程v1.0第3楼 

         ///<summary>
         /// 管理员登陆
         ///</summary>
         ///<param name="_username"> 用户名 </param>
         ///<param name="_password"> 密码 </param>
         ///<returns></returns>
         public virtual bool AdminLogin(string _username,string _password,HttpSessionState _session)
        
 
         ///<summary>
         /// 中勤币改变
         ///</summary>
         ///<param name="_username"> 用户名 </param>
         ///<param name="_moneynum"> 中勤币改变数量,正为加,负为减 </param>
         ///<returns></returns>
         public virtual bool MoneyChange(string _username,int _moneynum)
        
 
         ///<summary>
         /// 对后台管理员的权限进行检查
         ///</summary>
         ///<param name="_username"> 用户名 </param>
         ///<param name="_powername"> 权限名 </param>
         ///<returns></returns>
         public virtual bool CheckPower(string _username,string _powername)
        
 
 
         // 权限检查
         protected virtual bool CheckPower(string _username,string _channelname,string _powername)
        
 
         ///<summary>
         /// 抛出异常
         ///</summary>
         ///<param name="_e"></param>
         public virtual void ThrowException(Exception _e)
        
 
 
         ///<summary>
         /// 抛出异常,自己定义异常级别
         ///</summary>
         ///<param name="_e"></param>
         ///<param name="_level"></param>
         public virtual void ThrowException(Exception _e,int _level)
        
 
 
 
         ///<summary>
         /// 日志记录
         ///</summary>
         ///<param name="_logname"> 日志名 </param>
         ///<param name="_description"> 日志描述 </param>
         ///
         public virtual void Log(string _logname,string _description,string _operator)
        
 
 
         ///<summary>
         /// 日志记录,没有任何描述
         ///</summary>
         ///<param name="_logname"> 日志名 </param>
         ///<param name="_operator"> 操作员 </param>
         public virtual void Log(string _logname,string _operator)
        
 
 
 
         // 论坛
         ///<summary>
         /// 得到论坛某个板块的文章列表
         ///</summary>
         ///<param name="BoardName"> 板块名称 </param>
         ///<param name="number"> 文章条数 </param>
         ///<returns></returns>
         public virtual DataTable Forum_GetArticleList(string _bordname,int _num)
        
 
 
         ///<summary>
         /// 得到论坛最近的文章
         ///</summary>
         ///<param name="number"> 文章的条数 </param>
         ///<returns></returns>
         public virtual DataTable Forum_GetLatestArticleList(int _num)
        
 
 
 
 
         // 文章
 
         ///<summary>
         /// 根据栏目名称及提取数量提取最新文章列表
         ///</summary>
         ///<param name="TopX"></param>
         ///<param name="TypeName"></param>
         ///<returns></returns>
         public static DataView GetListTopXByTypeName(string TopX, string TypeName)
    
 
 
 
我的心太乱...
返回顶端
 
 
heavenkiller
等级: 夕月彗星
头衔: 一般用户
威望: -3
文章: 45
积分: 1415
星座: 牧羊座
注册: 2004-9-20 14:31:50
 
 时间: 2004-10-30 12:20:20  主题: [分享]中勤在线网站开发规范及流程v1.0第4楼 

         ///<summary>
         /// 根据栏目名称及提取数量提取最新有图片的文章列表
         ///</summary>
         ///<param name="TopX"></param>
         ///<param name="TypeName"></param>
         ///<returns></returns>
         public virtual DataView Article_GetListTopXByTypeNameForPicNews(string TopX, string TypeName)
        
 
 
         // 通行证
 
         ///<summary>
         /// 根据用户名得到用户的基本信息
         ///</summary>
         ///<param name="_username"></param>
         ///<returns></returns>
         public virtual DataRow Passport_GetUserInfo(string _username)
        
 
 
 
         ///<summary>
         /// 获得权限管理系统中所有角色列表
         ///</summary>
         ///<returns></returns>
         public virtual DataTable Power_GetAllRole()
        
 
 
 
 
QGZXOL.Integration. DefaultConfig 类:
 
/// <summary>
         /// 用户ID的Session名称,默认取 "UserID"
         ///</summary>
 
public static string SessionID
        
        
         ///<summary>
         /// 用户名的Session名称,默认取 "UserName"
         ///</summary>
         public static string SessionUserName
    
         ///<summary>
         /// 管理员用户名的Session名称,默认取 中的 "AdminUser"
         ///</summary>
         public static string SessionAdminUser
    
 
         ///<summary>
         /// 统一的连接字符串,默认使用 Web.config 中的 "ConnectiongString" 字段
         ///</summary>
         public static string ConnectionString
        
 
         // 邮箱设置
         public static string SMTPServer=ConfigurationSettings.AppSettings["SMTPServer"];
         public static string SMTPUser=ConfigurationSettings.AppSettings["SMTPUser"];
         public static string SMTPPassword=ConfigurationSettings.AppSettings["SMTPPassword"];
         public static string SMTPFrom=ConfigurationSettings.AppSettings["SMTPFrom"];
 
         ///<summary>
         /// 保存所有上传文件的文件夹的虚拟目录地址,如:http://www.qgzxol.com/upload/
         ///</summary>
         public static string UploadVirtualPath=ConfigurationSettings.AppSettings["UploadVirtualPath"];
         ///<summary>
         /// 保存所有上传文件的文件夹的虚拟目录地址所对应的本机地址,如: C:/wwwroot/QGZXOL/upload/
         ///</summary>
         public static string UploadActualPath=ConfigurationSettings.AppSettings["UploadActualPath"];
 
          ///<summary>
         /// 程序运行时所在主机的域名,也可以为IP地址
         ///</summary>
         public static string ServerDomainName=ConfigurationSettings.AppSettings["ServerDomainName"];
 
 
QGZXOL.Integration.CommonInterface 类:
 
/// <summary>
         /// 在线注册用户数量
         ///</summary>
         public static int UserNumOnLine
    
         ///<summary>
         /// 在线用户列表
         ///</summary>
         public static Hashtable UserOnLineList
        
 
         ///<summary>
         /// Global 类对象,当各模块想对HttpApplicatio对象的各种事件进行处理时
         ///</summary>
         public static HttpApplication Application
        
    
 
         ///<summary>
         /// 用于防止Global的构造函数运行两次
         ///</summary>
         public static bool GlobalMark=false;
 
         ///<summary>
         /// 以中勤在线的名义发送电子邮件
         ///</summary>
         ///<param name="_subject"></param>
         ///<param name="_body"></param>
         ///<param name="_to"></param>
         ///<returns></returns>
         public static bool SendEMail(string _subject,string _body,string _to)
 
我的心太乱...
返回顶端
 
 
heavenkiller
等级: 夕月彗星
头衔: 一般用户
威望: -3
文章: 45
积分: 1415
星座: 牧羊座
注册: 2004-9-20 14:31:50
 
 时间: 2004-10-30 12:22:37  主题: [分享]中勤在线网站开发规范及流程v1.0第5楼 

接口使用标准:
所有模块的用户名,用户ID,管理员用户名的Session名称必须和QGZXOL.Integration.DefaultConfig中的配置统一
调用文章系统,论坛系统,通行证系统,权限系统等模块时,必须从QGZXOL.Integration.ASPNETModule中调用
通行证必须要做到一处登陆,全站通行
 
 
6.质量控制标准
 
 
 
 
整合标准:
每一个系统做出来之后,如果要整合到整个中勤在线网站中,则应该达到如下标准。
 
1. 通行证 一处登陆,全站通行,各模块必需严格按照通行证的标准来书写与通行证相关的代码。
2 .权限管理 : 所有模块统一接受“权限管理系统”的管理
3 .统一的中勤币控制
4 .统一的系统日志记录
5 .调用文章和论坛的功能时统一使用 QGZXOL.Intergration 中的接口
 
 
 
其它标准 :
1. 命名规范
2. 注释规范
3. 文档规范
4. 代码规范
5. 接口规范
7.  内存管理
1 .所有资源使用完毕后必须释放。
8.  错误处理和异常事件
8-1: 对所调用函数的错误返回码要仔细、全面地处理。
9.  可移植性
模块做出来后应保证在移植时只做尽可能少的改动
10. 复用
模块做出来后应保证在移植到别的系统时只做尽可能少的改动
 
11. 模块化
尽量减少模块之间的耦合度 , 接口清晰明确。
12.编译问题
所有模块在最后投入使用时都要编译成 Release 版本
六、一些经验和教训
1
,能用静态网页表现的内容,尽量不用程序代码动态实现。
2
,设计阶段,必须和用户进行充分的交流,完全、准确的了解用户的需求。既不能歪曲用户的意思,也不能一味迎合用户的非正当需求,也不能对自己没有把握的技术甚至不可能实现的技术夸下海口。需求分析是一个沟通、交流、引导、教育、斗争、妥协的过程。需求分析结果要有文字资料存档。
3
,技术参数必须了解准确。比如用户的软件平台是 linux 系列,那你的系统就只好用 Java+Apache 开发了,这时候你的 ASP.NET 技术就用不上了。
4
,在必要的时候,让用户对已经确定的需求内容签字,盖章。
5
,任何交流最好以书面文档的形式做记录。重要的交流,必须有书面记录。对开发人员,要求必须每天写工作日志。
 
 
 
注:以上为中勤在线多年来在软件开发领域所积累的一些经验、规范,现公布出来,希望大家能够学习,交流,并提出宝贵的意见。
 
我的心太乱...
返回顶端
 
 
flash9704
等级: 星路行者
头衔: 一般用户
威望: 0
文章: 4
积分: 214
星座: 保密
注册: 2004-10-31 12:39:10
 
 时间: 2004-10-31 12:44:17  主题: [分享]中勤在线网站开发规范及流程v1.0第6楼 
非常有帮助,谢谢分享
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值