当前位置:文档之家› 程序员编码规范

程序员编码规范

程序员编码规范
程序员编码规范

程序员编码规范

目录

一.概述 (1)

二.界面设计及控制 (1)

2.1易用性 (1)

2.2 规范性 (2)

2.3帮助设施 (3)

2.4合理性 (3)

2.5美观与协调性 (5)

2.6菜单位置 (6)

2.7 独特性 (6)

2.8 快捷方式的组合 (7)

三.通用编码规范 (8)

3.1基本要求 (8)

3.2可读性要求 (8)

3.3结构化要求 (8)

3.4正确性与容错性要求 (8)

3.5可重用性要求 (9)

3.6变量命名 (9)

3.7函数命名 (9)

3.8控件的命名: (10)

3.9注释 (10)

3.10程序 (11)

3.11性能 (11)

四.C++编码规范 (12)

4.1常量命名和宏定义 (12)

4.2其他命名规范 (12)

4.3 C++ Builder编程规范 (13)

五.Java编码规范 (18)

5.1 命名规范 (18)

5.2 Java文件样式 (18)

5.3 注意事项 (21)

六.Web应用程序编码规范 (21)

6.1 网页设计 (21)

6.2 JSP编码规范 (22)

一.概述

本标准的制订主要是为了规范程序员的编码,提高程序员的编码质量,从而从根本上提高应用系统的质量和性能。本标准分别从应用程序的界面设计及控制、代码编制规范(通用编码规范、C++编码规范、Java编码规范)、Web应用程序编码规范三大方面阐述了程序员在程序编制过程中应该注意的问题。从而使程序员养成良好的编程习惯,编制出逻辑实现正确、处理流程清晰、可读性强、性能优良的优秀代码。

二.界面设计及控制

界面是软件与用户交互的最直接的层,界面的好坏决定用户对软件的第一印象。而且设计良好的界面能够引导用户自己完成相应的操作,起到向导的作用。同时界面如同人的面孔,具有吸引用户的直接优势。设计合理的界面能给用户带来轻松愉悦的感受和成功的感觉,相反由于界面设计的失败,让用户有挫败感,再强大的功能都可能在用户的畏惧与放弃中付诸东流。因此程序员应该提高对界面的重视程度,设计出简洁、统一、实用、方便、美观的用户界面。以下所有规则都是界面设计过程中应该注意的:

2.1易用性

按钮名称应该易懂,用词准确,摒弃模棱两可的字眼,要与同一界面上的其他按钮易于区分,能望文知意最好。理想的情况是用户不用查阅帮助就能知道该界面的功能并进行相关的正确操作。

易用性细则:

1)完成相同或相近功能的按钮用Frame框起来,常用按钮要支持快捷方式。

2)完成同一功能或任务的元素放在集中位置,减少鼠标移动的距离。

3)按功能将界面划分成局域块,用Frame框括起来,并要有功能说明或标题。

4)界面要支持键盘自动浏览功能,即按Tab键的自动切换功能。

5)界面上首先应输入的、重要信息的控件在Tab顺序中应当靠前,位置也应放在窗口

上较醒目的位置。

6)同一界面上的控件数最好不要超过10个,多于10个时可以考虑使用分页界面显示。

7)同一界面上的功能数量也最好不要多于10个,过多导致使用不便。

8)分页界面要支持在页面间的快捷切换,常用组合快捷键Ctrl+Tab

9)默认按钮要支持Enter及选操作,即按Enter后自动执行默认按钮对应操作。

10)可写控件检测到非法输入后应给出说明并能自动获得焦点。

11)Tab键的顺序与控件排列顺序要一致,目前流行:总体从上到下,同时行间从左到

右的方式。

12)复选框(CheckBox)和选项框(RadioButton)中的内容尽量按选择几率的高低而

先后排列。

13)复选框(CheckBox)和选项框(RadioButton)通常要有默认选项。

14)界面空间较小时使用下拉框(ComboBox)而不用选项框。

15)选项数较少时使用选项框,相反使用下拉列表框。

16)专业性强的软件要使用相关的专业术语,通用性界面则提倡使用通用性词眼。

2.2 规范性

通常界面设计都按Windows界面的规范来设计,即包含“菜单条、工具栏、工具箱、状态栏、滚动条、右键快捷菜单”的标准格式,可以说:界面遵循规范化的程度越高,则易用性相应的就越好。小型软件一般不提供工具箱。

规范性细则:

1)常用菜单要有命令快捷方式。

2)完成相同或相近功能的菜单用横线隔开放在同一位置。

3)菜单前的图标能直观的代表要完成的操作。

4)菜单深度一般要求最多控制在三层以内。

5)大型软件一般工具栏要求可以根据用户的要求自己选择定制。

6)相同或相近功能的工具按钮放在一起。

7)工具栏中的每一个按钮要有及时提示信息。

8)一条工具栏的长度最长不能超出屏幕宽度。

9)工具栏太多时可以考虑使用工具箱。

10)工具箱要具有可增减性,由用户自己根据需求定制。

11)工具箱的默认总宽度不要超过屏幕宽度的1/5。

12)状态条要能显示用户切实需要的信息,常用的有:

目前的操作、系统状态、用户位置、用户信息、提示信息、错误信息等,如果某一

操作需要的时间较长,还应该显示进度条和进程提示。

13)状态条的高度以放置五号字为宜,滚动条的宽度比状态条的略窄。

14)右键快捷菜单采用与菜单相同的准则,且右键快捷菜单在对话框中不应出现。

2.3帮助设施

系统应该提供详尽而可靠的帮助文档,在用户使用产生迷惑时可以自己寻求解决方法。

帮助设施细则:

1)操作时要提供及时调用系统帮助的功能。常用F1。

2)在界面上调用帮助时应该能够及时定位到与该操作相对应的帮助位置。也就是说帮

助要有即时针对性。

3)最好提供目前流行的联机帮助格式或HTML帮助格式。

4)用户可以用关键词在帮助索引中搜索所要的帮助,当然也应该提供帮助主题词。

5)打包新系统时,对作了修改的地方在帮助文档中要做相应的修改。

6)在帮助中应该提供我们的技术支持方式,一旦用户难以自己解决可以方便的寻求专

业系统维护人员的帮助。

2.4合理性

屏幕对角线相交的位置是用户直视的地方,正上方四分之一处为易吸引用户注意力的位置,在放置窗体时要注意利用这两个位置。

合理性细则:

1)父窗体或主窗体的中心位置应该在对角线焦点附近。即采取屏幕居中。

2)子窗体位置应该在主窗体的左上角或正中。

3)多个子窗体弹出时应该依次向右下方偏移,以显示出窗体标题为宜。

4)重要的命令按钮与使用较频繁的按钮要放在界面上较注目的位置。

5)与正在进行的操作无关的按钮应该加以屏蔽(Windows中用灰色显示,没法使用该

按钮)。

6)对可能造成数据无法恢复的操作必须提供确认信息,给用户放弃选择的机会。并且将

按钮的缺省焦点置在“取消”按钮上。

7)非法的输入或操作应有足够的提示说明。

8)对运行过程中出现问题而引起错误的地方要有提示,让用户明白错误出处,避免形

成无限期的等待。

9)提示、警告、或错误说明应该清楚、明了、恰当。

10)对于需要执行长时间的操作,必须使用进度条,让用户了解进展情况,避免使用户

误解为死机。

11)对于下拉框(ComboBox),如果不允许用户输入,则应将该控件的Style属性设为

csDropDownList,使用户只能选择。

12)当下拉框(ComboBox)允许用户不选择任何选项时,不应显示一个空的选项,应

使用文字描述,如“请选择…”等。

13)对于文本框(TextBox)一般需要根据其对应的数据库字段的类型以及长度来限制

用户允许输入的字符和长度。

14)对于ListV iew以Report形式(V iewStyle属性=vsReport)显示数据,一般要求实现

列排序,如果由于特殊原因不实现列排序,需要将ListView的ColumnClick属性设为false,屏蔽列点击的效果。

15)对于数据录入界面,重点考虑如何提高用户的录入速度。例如界面中有“身份证号”

和“出生日期”,当用户输入了一个合法的身份证号后,系统应该自动根据身份证号将出生日期提取出来并填入“出生日期”控件中。

16)系统的提示框样式应统一,即使用标准的Windows提示框,其中包括标题、图标、

提示语和功能按钮。图标使用要规范,要根据提示信息的性质选择不同的图标,而且除非严重的错误,一般不使用“X”图标,以免使用户产生畏惧心理。

17)如果系统中需要经常录入一些重复数据,应考虑将其提取出来,让用户进行一次配

置,然后系统自动根据配置完成该信息的录入。例如:系统有登记企业信息的功能,其中企业信息包括该企业所在的省、市、区,由于该系统安装到某个市级单位后,所登记企业的所在省、市都是确定的,让用户每次登记时都重复选择省、市将给用户带来很大的不便。应该由用户在系统初始化时设置好缺省的省、市,在企业登记

时只要选择该企业所在的区即可,这样就提高了用户的登记效率。

18)对于输入型控件禁止为其指定输入法,因为用户机器很有可能没有安装指定的输入

法。由于安装Office XP等软件后,C++ Builder会自动为输入型控件指定输入法,所以一定要注意并确定输入型控件没有指定输入法。

19)窗体显示后,缺省的焦点应该设在最合理的控件上,方便用户操作。

20)在判断输入框的值是否为空或存储输入值时,应利用Trim()方法去掉输入值两端的

空格,然后再判断。这样可以避免产生数据存储值(SQL Server会自动将结尾的空格删除)和用户输入值不相同的情况。

21)界面在设计上要体现易用性和引导性,尽量让用户可以独立、顺利的完成指定的操

作,必要时要提供文字信息说明该界面的操作方式以及注意事项。

2.5美观与协调性

界面大小应该适合美学观点,感觉协调舒适,能在有效的范围内吸引用户的注意力。

美观与协调性细则:

1)长宽接近黄金点比例(宽高比为4:3),切忌长宽比例失调。

2)布局要合理,不宜过于密集,也不能过于空旷,合理的利用空间。

3)按钮大小基本相近,忌用太长的名称,免得占用过多的界面位置,要与界面的大小

和空间协调。

4)避免空旷的界面上放置很大的按钮。

5)放置完控件后界面不应有很大的空缺位置。

6)字体的大小要与界面的大小比例协调, 通常使用的字体中,宋体9-12较为美观,

很少使用超过12号的字体。建议使用宋体9号字。

7)前景与背景色搭配合理协调,反差不宜太大,最好少用深色,如大红、大绿等。常

用色考虑使用Windows界面色调。

8)如果使用其他颜色,主色要柔和,具有亲和力与磁力,坚决杜绝刺目的颜色。

9)大型系统常用的主色有"#E1E1E1"、"#EFEFEF"、"#C0C0C0"等。

10)界面风格要保持一致,字的大小、颜色、字体要相同,除非是需要艺术处理或有特

殊要求的地方。

11)如果窗体支持最小化和最大化或放大时,窗体上的控件也要随着窗体而缩放;切忌

只放大窗体而忽略控件的缩放。对于窗体中包含ListView、TreeView、DBGrid、

StringGrid等控件,必须支持最大化,使用户能够尽量多的获得信息。

12)如果能给用户提供自定义界面风格则更好,由用户自己选择颜色、字体等。

2.6菜单位置

菜单是界面上最重要的元素,菜单位置按照按功能来组织。

菜单设测试细则:

1)菜单通常采用“常用--主要--次要--工具--帮助”的位置排列,符合流行的Windows风

格。

2)常用的有“文件”、“编辑”,“查看”等,几乎每个系统都有这些选项,当然要根据不

同的系统有所取舍。

3)下拉菜单要根据菜单选项的含义进行分组,并且按照一定的规则进行排列,用横线

隔开。

4)一组菜单的使用有先后要求或有向导作用时,应该按先后次序排列。

5)没有顺序要求的菜单项按使用频率和重要性排列,常用的放在开头,不常用的靠

后放置;重要的放在开头,次要的放在后边。

6)如果菜单选项较多,应该采用加长菜单的长度而减少深度的原则排列。

7)对常用的菜单要有快捷命令方式,组合原则见2.8。

8)对与进行的操作无关的菜单要用屏蔽的方式(Enabled=false)加以处理,如果采用

动态加载方式(即只有需要的菜单才显示)最好。

9)菜单前的图标不宜太大,与字高保持一致最好。

10)主菜单的宽度要接近,字数不应多于四个,每个菜单的字数能相同最好。

11)主菜单数目不应太多,最好为单排布置。

2.7 独特性

如果一味的遵循业界的界面标准,则会丧失自己的个性.在框架符合以上规范的情况下,设计具有自己独特风格的界面尤为重要。尤其在商业软件流通中有着很好的潜移默化的广告效用。

1)安装界面上应有单位介绍或产品介绍,并有自己的图标。

2)主界面(最好是大多数界面)上要有公司图标,但要根据产品性质和要求而定。

3)登录界面(程序启动前的Logo)上要有本产品的标志,同时包含公司图标。

4)帮助菜单的“关于”中应有版权和产品信息。

5)公司的系列产品要保持一致的界面风格,如背景色、字体、菜单排列方式、图标、

安装过程、按钮用语等应该大体一致。

2.8 快捷方式的组合

在菜单及按钮中使用快捷键可以让喜欢使用键盘的用户操作得更快一些,在西文Windows及其应用软件中快捷键的使用大多是一致的。

菜单中:

1)面向事务的组合有:

2)编辑:

3)文件操作:

4)系统菜单

5)MS Windows保留键:

6)按钮中:(可以根据系统需要而调节,以下只是常用的组合。)

这些快捷键也可以作为开发中文应用软件的标准,但亦可使用汉语拼音的开头字母。三.通用编码规范

无论用何种编程语言,都应该养成良好的编码习惯,好的编码习惯可以大大提高程序代码的可读性、帮助程序员理清编程思路、提高程序的执行效率。从而从根本上提高系统质量。

3.1基本要求

●程序结构清晰,简单易懂,单个函数的行数尽量不超过100行。

●尽量使用标准库函数和公共函数,从而使代码精简,避免垃圾程序。

●禁止随意定义全局变量,尽量使用局部变量。

●使用括号以避免二义性。

3.2可读性要求

●尽量作到可读性第一,书写效率第二。

●代码要有整齐的缩进,可以用Tab或空格,一般为2个或4个空格。

●每个源程序文件及函数,都有相应的说明,说明规范见3.9中的说明。

●主要变量(结构、类或对象)定义应有注释说明,注释能反映其含义。

●常量定义(DEFINE)有相应说明。

●处理过程的每个阶段都有相关注释说明。

●在典型算法前都有注释。

●循环、分支层次不能超过五层。

3.3结构化要求

●禁止出现两条等价的支路。

●少用或不用GOTO语句。

●用CASE 实现多路分支。

●避免不必要的分支。

3.4正确性与容错性要求

●所有变量在调用前必须被初始化。

●修改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响。

●对所有的用户输入,必须进行合法性检查。

●为避免不可靠,不要比较浮点数的相等,如:10.0 * 0.1 = = 1.0

●程序与环境或硬件发生联系时,必须主动去处理发生的意外事件,如文件能否逻辑

锁定、打印机是否联机等。

●用Insert语句向数据库中增加记录时,要遵循如下格式:insert into 表名(字段名

列表) values (字段对应值列表),不要省略“字段名列表”,这样如果日后该表增加

了可以为空的字段,程序不用修改就可以适应该变化。

●单元测试也是编程的一部分,提交联调测试的程序必须首先通过单元测试。

3.5可重用性要求

●重复使用的完成相对独立功能的算法或代码应抽象为公共控件、函数或类。

●公共控件或类应考虑OO(面向对象)思想,减少外界联系,考虑独立性或封装性。

●公共控件或类应建立使用模板。

3.6变量命名

命名必须具有一定的实际意义,形式为xAbcFgh。其中,x由变量类型确定(常用的x 取值参见下表),Abc、Fgh表示连续意义字符串,如果连续意义字符串仅两个,可都大写,如OK。

局部变量中可采用如下几个通用变量:xTemp,xResult,i、j(一般用于循环变量),x、y(一般表示坐标)。

3.7函数命名

第一个字母必须使用大写字母,要求用大小写字母组合的方式来规范函数命名,必要时可用下划线间隔,示例如下:

void ImportantPoint (void); //Module Name :r01/sdw.c

void ShowChar (int , int , chtype); //Local Module

void ScrollUp_V (int , int); //Local Module

3.8控件的命名:

可以用小写前缀表示类别,如下所示。但由于有些开发工具提供的控件较多(如C++Builder、Delphi等),要定义和识别前缀比较困难,因此也可以使用其缺省的名称。

frm 窗口

cmd 按钮

cmb combo,下拉式列表框

txt 文本输入框

lab labal,标签

img image,图象

pic picture

grd Grid,网格

scr 滚动条

lst 列表框

3.9注释

●原则上注释要求使用中文;有困难时可以使用英文。

●文件开始的注释内容包括:公司名称、版权、作者名称、时间、模块用途、背景介

绍等,复杂的算法需要加上流程说明;

●函数注释包括:输入、输出、函数描述、流程处理、全局变量、调用样例等,复杂

的函数需要加上变量用途说明;

●程序中的注释包括:修改时间和作者、方便理解的注释等;

引用一: 文件开头的注释模板

/******************************************************************

** 文件名:

** Copyright (c) 1998-1999 *********公司技术开发部

** 创建人:

** 日期:

** 修改人:

** 日期:

** 描述:

**

** 版本:

**-------------------------------------------------------------------------------------------------

******************************************************************/

引用二: 函数开头的注释模板

/*****************************************************************

** 函数名:

** 输入: a,b,c

** a---

** b---

** c---

** 输出: x---

** x 为1, 表示...

** x 为0, 表示...

** 功能描述:

** 全局变量:

** 调用模块:

** 作者:

** 日期:

** 修改:

** 日期:

** 版本

****************************************************************/

引用三: 程序中的注释模板

/*----------------------------------------------------------*/

/* 注释内容 */

/*----------------------------------------------------------*/

3.10程序

●程序编码力求简洁,结构清晰,避免太多的分支结构及太过于技巧性的程序,尽量

不采用递归模式。

●编写程序时,亦必须想好测试的方法,换句话说,”单元测试” 的测试方案应在程

序编写时一并拟好。注释一定要与程序一致。

●版本封存以后的修改一定要将旧语句用/* */ 封闭,不允许自行删除或修改,并要

在文件及函数的修改记录中加以记录。

●程序中每个block 的”{}” 必须对齐,嵌套的block 每进一层,缩进一个TAB,TAB

为2或4个空格,对于比较大的函数,每个block 和特殊的函数调用,都必须注

明其功能。

●在SQL语句中对字段的赋值采用“参数”的方式,这样可以避免产生一些意外的

错误。

●保证程序申请的内存空间在程序结束时可以被明确的释放。并且尽量少的动态创建

和释放内存,对于经常要创建的内存可以用全局变量定义和创建。

●保证程序中对任何可能产生的异常进行捕获和处理,对重要的错误信息最好生成错

误日志,以备日后维护。

3.11性能

在写代码的时候,从头至尾都应该考虑性能问题。这不是说时间都应该浪费在优化代码上,而是我们时刻应该提醒自己要注意代码的效率。如果没有时间来实现一个高效

的算法,那么我们应该在文档中记录下来,以便在以后有空的时候再来实现她。经常要考虑的性能问题包括:

●尽量减少数据库操作的次数。

●对从数据库查询并显示大量数据时,一定用分页的方式实现。

●查询数据时不要用“select *”,需要哪些字段就列出哪些字段。

●对于复杂的、在一个事务中进行多步数据库操作的,应该使用存储过程。

●对于要判断数据表中是否存在符合条件的数据时,不要用“select 字段名from 表

名where 条件”,而是要用“select top 1字段名from 表名where 条件”。

●从数据库中查询数据时,SQL语句中尽量包含主键或索引字段,这样会提高查询

速度。

●线程中一定要在每次循环结束后休眠一定的时间,避免CPU负荷过重。

●如果用C++ Builder或Delphi编程,对于ComboBox、ListView、TreeV iew等控件,

在填充数据时,如果在后面的程序中需要取出每个数据项对应的唯一标识(通常为

数据表中的主键字段的值),则要用AddObject方法填充数据或用Data属性存储唯

一标识。这样就避免了再次查询数据库来得到唯一标识,由于“描述”有可能重复,所以通过“描述”查“标识”完全不可取。

●窗体的初始化工作在Create事件中进行,界面的调整在Show事件中进行。若Create

事件耗时很长,建议显示动画等待窗口,变量的初始化工作在窗体的构造函数或

Create事件中进行。

四.C++编码规范

在编写C++程序时,除了要遵守“通用编码规范”中的所有条目外,还需要注意下述几个方面。

4.1常量命名和宏定义

常量和宏定义必须具有一定的实际意义;常量和宏定义在#include和函数定义之间。

常量和宏定义必须全部以大写字母来撰写,中间可根据意义的连续性用下划线连接,每一条定义的右侧必须有一简单的注释,说明其作用。

4.2其他命名规范

●类的命名

规则:T+类的名称(类名称的第一个字母大写),如:

class TOper

{

};

●结构的命名

规则:S+结构的名称(结构名称的第一个字母大写),如:

struct SOper

{

};

●指针的命名

规则:p+指针名称(指针名称第一个字母大写),如:

TMemoryStream * pStream;

4.3 C++ Builder编程规范

由于C++ Builder集成开发环境中提供了许多控件,因此对控件的使用应该有一定的规范,下面简单说明常用控件的使用规范。

●TDatabase控件控制与数据库的连接.

使用时需要配置的几个参数

DA TABASE NAME:数据库名称.

SERVER NAME:服务器名称.

USER NAME:用户名.

PASSWORD:密码.

Login prompt:当程序连接数据库时需不需要进行登陆.通常不选中.

Keep inactive Connection:没有数据集打开是否保持与数据库的连接.通常选中.

●TQuery控件执行SQL语句.

当SQL语句执行Insert,Update,Delete操作时,使用ExecSQL函数执行;

当SQL语句执行Select操作时,使用Open函数执行.

例如:

<1>返回结果集合

Query->Close();

Query->SQL->Clear();

Query->SQL->Add("select opernum from operinfo");

try

{

Query->Open();

while ( !Query->Eof )

{

读取结果集中的数据…

Query->Next();

}

Query->Close();

}

catch(…)

{

数据读取出错处理

}

<2>返回结果集合

Query->Close();

Query->SQL->Clear();

Query->SQL->Add("delete operinfo where opernum=:opernum");

try

{

Query->ParamByName(“opernum”)->AsInteger = 1;

Query->ExecSQL();

}

catch(…)

{

数据读取出错处理…

}

强烈建议:在SQL语句中对字段的赋值采用“参数”的方式,这样可以避免产生一些意外的错误。例如某个字段类型为字符型,SQL语句中有”where fieldname=’”+sFieldV alue+”’”的语句,如果sFieldV alue的值中包含“’”,如aa’bb,则最终提交给SQL服务器的SQL语句为:where fieldname=’aa’bb’,执行SQL语句时将会产生异常。

TStoredProc控件

a) 指定存储过程名:StoredProc->StoredProcName = "systemlogin";

b) 创建参数:

//输入参数是整型

StoredProc->Params->CreateParam( ftInteger, "@cscno", ptInput );

//输入参数是字符型

StoredProc->Params->CreateParam( ftString, "@cscname1", ptInput );

//输入参数是浮点型

StoredProc->Params->CreateParam( ftFloat, "@money", ptInput );

//输出参数是整型

StoredProc->Params->CreateParam( ftInteger, "@csnum", ptOutput );

//存储过程固定的结果参数

StoredProc->Params->CreateParam( ftInteger, "Result", ptResult );

c) 执行:

当存储过程返回结果集合时,用Open执行

当存储过程返回输出参数时,用ExecProc执行

d) 注意:

.创建参数时参数顺序必须与存储过程中的参数顺序一致.

.当输入参数有默认值时,可以不给此参数赋值,否则必须赋值.

例如:

StoredProc->Close();

StoredProc->Params->Clear();

StoredProc->StoredProcName = "systemlogin";

StoredProc->Params->CreateParam( ftInteger, "@cscno", ptInput );

StoredProc->Params->CreateParam( ftInteger, "@csnum", ptInput );

StoredProc->Params->CreateParam( ftInteger, "@faxno", ptOutput );

StoredProc->Params->CreateParam( ftInteger, "Result", ptResult );

StoredProc->ParamByName( "@cscno" )->AsInteger = iCscNo;

StoredProc->ParamByName( "@csnum" )->AsInteger = iCsnum;

try

{

StoredProc->ExecProc();

int result = StoredProc->ParamByName( "Result" )->AsInteger;

根据result参数的不同,作不同处理…

}

catch(...)

{

出错处理…

}

●服务端控件TServerSocket

<1>常用的参数

Port:侦听端口号.

Active:确定套接字是否打开,其它计算机是否可与之连接.

<2>常用的事件

OnAccept事件:当一个客户端的连接被接受时产生该事件.void __fastcall TCPS::ServerAccept(TObject *Sender,

TCustomWinSocket *Socket)

{

int SocketHandle = Socket->SocketHandle;//得到Socket句柄

...//进行一些相关处理

}

OnClientDisconnect事件:当用户连接关闭时产生该事件.

void __fastcall TCPS::ServerClientDisconnect(TObject *Sender,

TCustomWinSocket *Socket)

{

int SocketHandle = Socket->SocketHandle;//得到Socket句柄

...//进行一些相关处理

}

OnClientError事件:当建立,使用或断开与客户端的连接失败时产生该

事件.

void __fastcall TCPS::ServerClientError(TObject *Sender,

TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) {

ErrorCode = 0;//不产生系统的错误提示

...//进行一些相关处理

OnClientRead事件:当服务端从客户端读取信息时产生该事件.

void __fastcall TCPS::ServerClientRead(TObject *Sender,

TCustomWinSocket *Socket)

{

unsigned char buf[8200];

int len;

len = Socket->ReceiveLength();

if ( len > 8192 ) len = 8192;

Socket->ReceiveBuf( buf, len );

}

●客户端控件TClientSocket

<1>常用的参数

Active:确定套接字是否打开,是否可以进行信息传送.

Address:服务端的IP地址.

Host:服务端IP地址的别名.

Port:侦听端口号.

<2>常用的事件

OnConnect事件:连接成功产生该事件.

void __fastcall TCPS::ClientConnect(TObject *Sender,

TCustomWinSocket *Socket)

{

...//进行一些相关处理

OnDisconnect事件:在关闭一个连接前产生该事件.

void __fastcall TCPS::ClientDisconnect(TObject *Sender,

TCustomWinSocket *Socket)

{

...//进行一些相关处理

}

OnError事件:套接字在建立,使用或关闭时出错产生该事件.

void __fastcall TCPS::ClientError(TObject *Sender,

TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) {

ErrorCode = 0; //不产生系统的错误提示

...//进行一些相关处理

}

OnRead 事件:当服务端有数据到达时产生该事件.

void __fastcall TCPS::ClientRead(TObject *Sender, TCustomWinSocket *Socket) {

...//进行一些相关处理

}

● 线程使用规范

(1)建立新的线程

在File 菜单中单击New 选项,出现New Items 对话框选择Thread Object 图标,单击 OK 按钮.在提示框输入新线程的类名,就建立了一个新的线程. (2)主要属性

<1>FreeOnTerminate :是否在线程结束时自动删除.通常设为true . <2>Terminated :确定线程是否结束. (3)方法

<1>Execute :线程的执行体,将要执行的代码写在此函数中. <2>Resume :恢复线程的执行.

<3>Suspend :挂起线程的执行.

<4>Synchronize :与主窗体同步,在线程内访问VCL . (4)解决多线程间的资源冲突

<1>临界:当一个线程访问一个数据时,阻止其它线程访问这个数据.

使用方法:

定义变量:TRTLCriticalSection Sect1; //应用程序级全局变量

初始化临界量:InitializeCriticalSection(&Sect1); //在主窗体的OnCreate 事件中 临界部分:EnterCriticalSection(&Sect1); //临界部分进入活动状态

...//处理过程 LeaveCriticalSection(&Sect1); //临界部分进入休眠状态 <2>互斥量:不仅可以同步一个进程中的多个线程,还同步多个进程.

使用方法:

定义变量:HANDLE mutex1; //应用程序级全局变量

创建互斥量:互斥部分:if(WaitForSingleObject( mutex1,100 )= =W {//等待100毫秒,没有得到互斥量 return; } ...//处理过程

ReleaseMutex( mutex1); //释放互斥量

五.Java编码规范

在编写Java程序时,除了要遵守“通用编码规范”中的所有条目外,还需要注意下述几个方面。

5.1 命名规范

?Package 的命名

Package 的名字应该都是由一个小写单词组成。

?Class 的命名

Class 的名字必须由大写字母开头的单词组成

?Static Final 变量的命名

Static Final 变量的名字应该都大写,并且指出完整含义。

?参数的命名

参数的名字必须和变量的命名规范一致。

?数组的命名

数组应该统一用下面的方式来命名:byte[] buffer; 而不是:byte buffer[];

?方法的参数

使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字:

SetCounter(int size){

this.size = size;

}

5.2 Java文件样式

所有的 Java(*.java) 文件都必须遵守如下的样式规则

?版权信息

版权信息必须在java 文件的开头,比如:

/**

* Copyright ?2000 Shanghai XXX Co. Ltd.

* All right reserved.

*/

?Package/Imports

package 行要在import 行之前,import 中标准的包名要在本地的包名之前。如果import 行中包含了同一个包中的不同子目录,则应该用* 来处理。

相关主题
文本预览
相关文档 最新文档