|
登录后查才能浏览下载更多咨询,有问题联系QQ:3283999
您需要 登录 才可以下载或查看,没有账号?入住遨海湾
×
按:编程规范是程序员在实践中,为维护代码,便于集体开发,制定的一种约定,也是程序开发经验总结。你可以参考、制定自己的规范,但不可拘泥。* s { Q1 j" l/ n5 s
4 l8 Y% V b/ x+ f. O$ w在开发中保持良好的编码规范是十分重要的。我所采用的新的VB.net编码规范,是一种被证明能明显改善代码可读性,并有助于代码管理、分类的编码规范。采用这种编码规范,能避免如匈牙利命名法带来的繁长前缀,便于记忆变量的用途。下面的介绍这种编码规范。
1 p) [; G% j7 j _
/ i8 b7 d/ p# {一、类型级单位的命名
; }; ]. Z& m% ?. @. S* h& {8 R/ M
6 z' @! h% ^3 G1、类。
, Z/ L9 b) ~, O3 ^
' B7 v5 N$ F* A& \2 M( ~8 A6 [以Class声明的类,都必须以名词或名词短语命名,体现类的作用。如:
" X8 ]/ H X6 ^% P7 h0 aClass Indicator 7 i2 F7 V2 r# Q, J5 ?% x7 D
2 P8 A3 M* q" G# E6 J; a8 ]; c当类是一个特性(Attribute)时,以Attribute结尾,当类是一个异常(Exception)时,以Exception结尾:
- I9 `, s: z9 Y0 ]0 S7 gClass ColorSetException {& J7 ]3 {. }1 ~
Class CauseExceptionAttribute
9 u8 E$ R1 i4 ?! a5 d4 O8 ]. h* r, @/ `% r' C
当类只需有一个对象实例(全局对象,比如Application等),必须以Class结尾,如 ( u* u8 W" i2 B6 ^/ I
Class ScreenClass 7 t1 W2 g" ?' W; U9 }
Class SystemClass Q* ]6 k: C( ?8 I0 z' ?. d6 H
$ n, R4 d! u. |9 q当类只用于作为其他类的基类,根据情况,以Base结尾:
8 @2 U F: j9 D% }' j/ f3 p- K4 ~MustInherit Class IndicatorBase : x# C3 P7 Y( q- \* c
% \* x5 _: L/ y, L0 e3 R
如果定义的类是一个窗体,那么名字的后面必须加后缀Form,如果是Web窗体,必须加后缀Page: 2 v$ Q q: E- f& ]$ F4 p) J: o
Class PrintForm : Inherits Form ‘* Windows窗体 $ `( A% `2 `2 ~( a) t
Class StartPage : Inherits Page ‘* Web窗体
7 `' L/ C+ O" n7 H
5 ?6 u& n5 J: V& b" E" M2、枚举和结构 7 U+ \2 }- ] V: g7 }+ v
8 B6 N& D7 P" ^" K* n) A同样必须以名词或名词短语命名。最好体现枚举或结构的特点,如:
# W) `" L- g# S/ F" J+ WEnum ColorButtons ‘以复数结尾,表明这是一个枚举
* U# C0 s( W. _* |+ t7 C, @) C5 AStructure CustomerInfoRecord ‘以Record结尾,表明这是一个结构体 8 N/ u( q3 j7 M# K8 ]4 o
% w, P1 Q0 m: V- ~
3、委派类型 % ?! M3 {* _1 \6 n& z2 u
普通的委派类型以描述动作的名词命名,以体现委派类型实例的功能:
: F/ N: V% N! [8 @! R4 GDelegate Sub DataSeeker (ByVal SeekString As String)
7 F9 Q4 V4 B9 w/ N4 v0 a用于事件处理的委派类型,必须以EventHandler结尾,如: 2 E1 M$ q# g- X5 l% `: H/ G
Delegate Sub DataChangedEventHandler (ByVal Sender As Object, ByVal e As DataChangedEventArgs) - F0 X4 C$ M2 M( i7 ^* Z- r3 Z
# w: Y4 B. ~. x- c6 \
4、接口
* h5 d) l5 E% ?7 |% J- F与其他类型不同,接口必须要由I作为前缀,并用形容词命名,突出表现实现接口的类将具有什么能力:
' J4 P; p! }5 OInterface ISortable . k' ^, @ k/ y$ x) Z
0 q$ B* }' a/ X2 O5、模块
" X- z5 v- _/ R. e2 }模块不是类型,他的名称除了必须以名词命名外,必须加以后缀Module:
- Q/ b! C% a# L1 {9 l0 ?, XModule SharedFunctionsModule
+ v; ?9 L3 c$ ^. i+ v! |: C2 m上述所有规则的共同特点是,每个组成名称的词语都必须是大写开头,禁止完全大写或小写的名称。
: l7 h' u; T3 R% H
- Y3 d p* f2 S/ e+ v% e( A/ r" m+ I二、方法和属性的命名 4 {9 q! f2 f: T1 }
( y- |, b) M4 D. P- r: p, m1、方法 - H2 i9 ^/ V' y$ O7 v. z5 j# w
无论是函数还是子程序,方法都必须以动词或动词短语命名。无需区分函数和子程序,也无需指明返回类型。 2 r% i$ C9 P7 I
Sub Open(ByVal CommandString As String)
- Z4 I' y: Y: H5 s9 r j3 a+ T0 D1 iFunction SetCopyNumber(ByVal CopyNumber As Integer) : F* @/ x2 X {/ Y
参数需要指明ByVal还是ByRef,这一点写起来会让程序边长,但非常必要。如果没有特别情况,都使用ByVal。参数的命名方法,参考后面“变量的命名方法”。需要重载的方法,一般不写Overloads,根据需要编写重载的方法。 3 j" i$ \3 O: r- C+ N2 S1 W3 Z
* D# A$ f6 [! H3 l
2、属性
; Y" f1 O. L- N0 Y原则上,字段(Field)是不能公开的,要访问字段的值,一般使用属性。属性以简洁清晰的名词命名:
% h4 c: G- P% D- UProperty Concentration As Single $ {+ s+ b) |2 `* t
Property Customer As CustomerTypes ' t$ N5 n: ]. F) n
) T9 n& w& u B- r: |) q$ V l
3、事件
# A$ o! m% H* M4 L+ y事件是特殊的属性,只能在事件处理上下文中使用。命名的原则一般是动词或动词的分词,通过时态表明事件发生的时间: & P1 l! u1 G T/ [8 H, B: v) E9 c9 Y
Event Click As ClickEventHandler 7 ^6 y3 p7 B& g6 y. A" a, C
Event ColorChanged As ColorChangedEventHangler% A6 H7 O8 t/ g5 `& G9 p
* d) ^; }2 J* P* L5 L5 w8 I* p) Y0 P三、变量和常数
# B W( {" |7 l! J$ s z/ ?/ z$ [3 u: A, K6 Y$ E
常数以表明常数意义的名词命名,一般不区分常数的类型: / s+ ^" V/ N. r3 A* x5 f8 B" L! k
Const DefaultConcentration As Single = 0.01
* ~. S" I; _" Q在严格要求的代码中,常数以c_开头,如c_DefaultConcentration,但最好不要用它,它会带来输入困难。
4 Y, j2 g, T5 H" k5 T6 g; q普通类型的变量,只要用有意义的名字命名即可,不可使用简称和无意义的名称诸如A,x1等,下面给出了良好的例子: 8 @5 t+ F) T% o3 u; b9 z
Dim Index As Integer
. I8 [% h8 P5 x4 V, {Dim NextMonthExpenditure As Decimal
2 k8 _! f4 ]6 q8 Q, zDim CustomerName As String / @( L, E* [" i: M1 u* l
不能起太长的名字,应该尽量简洁,如下面的例子:
" m" {3 O) t# ?; ^Dim VariableUsedToStoreSystemInformation As String ‘* 错误,太复杂了 ) G0 p& j7 }: t/ P0 u" H
Dim SystemInformation As String ‘* 正确,简单明了
! `; h5 k: R2 ]( j* k: c0 ?% O4 JDim sysInfo As String ‘* 错误,过于简单
% Y2 \. L5 j* ^$ s! c8 |- X) L特殊情况可以考虑一个字母的变量:
. }$ o* {* U: v9 D% oDim g As Graphic
- K6 d c5 n' d) k6 k对于控件,应该指明控件的类型,方法是直接在变量后面加以类名:
- o% J; a$ Y- C4 XFriend WithEvents NextPageButton As Button ‘* 按钮
- [! w$ D+ V6 e$ |6 h& ~7 K$ RFriend WithEvents ColorChoicerPanel As Panel ‘* 面版 " W U4 n4 {; a, S2 c9 H9 }, U
Friend WithEvents CardFileOpenDialog As FileOpenDialog ‘* 文件打开对话框 3 o4 o6 |/ H5 U0 E6 R/ Z1 O1 V( f
等等,无需规定某种类型的变量的前缀,只需把类型写在后面就行了,试对比下列代码: " b" L: P E1 g/ c# U1 B4 s
btnCancel.Text = "&Cancel" S+ a5 U, T! K0 ]- P/ \* g7 h! a9 y
CancelButton.Text = "&Cancel"
+ W: V" u) m# d9 J B显然后者更能使阅读者明白变量的类型是一个按钮。0 C, u% O) I6 t* `8 C1 ?0 ]
! {# U. D5 s' q四、标签 ! |( H7 R1 ]( z2 P
! E7 ~# `! g8 d7 T5 T5 e8 `6 Y. L. z标签就是用于Goto跳转的代码标识,由于Goto并不推荐使用,所以标签的使用也比较苛刻。标签必须全部大写,中间的空格用下划线_代替,而且应该以_开头,比如:
, w$ _- M- c' y G, ^3 Y_A_LABEL_EXAMPLE:
" O* U6 g! z* N如此定义标签是为了与其他代码元素充分区别。
6 }& X! ?# h8 w0 c; N5 i
3 }4 Y# [2 ]% L0 T v9 c) D: Z& Y% Z五、名字空间
! x2 D7 C4 h5 l8 t5 A0 i+ d6 A* [! m. u" t6 a3 q3 v+ [( W' {
通常,一个工程使用一个名字空间,通常不需要用Namespace语句,而是在工程选项的“Root Namespace”中指定,使用根名字空间可以使代码更加整齐,容易修改,这一点是VB十足的优点。名字空间的语法是: 9 l7 h2 c$ o% \. M9 R$ g
公司名.产品名[.组件名的复数]
3 D2 d; u6 t* D& T. l! Z+ n如:
: }; L( {& }1 h+ b* uNamespace Ninputer.VirtualScreen 0 [, z; t0 N/ N" _$ h2 a
Namespace Ninputer.CardEditor.CustomeControls
$ _2 \- F" M' L随便起一个名字空间的名字绝对不是一个好主意,一定要遵守上述规定。
4 ~, T( ?' w4 ]! [: z" \2 Y
& `% Z( J& s4 a6 q% q2 H2 D N六、注释 9 v" i9 i5 i* G* J- r
8 m$ v! w) O' \+ ~% e0 Z: C" A; h t
注释的规则繁多,这里仅提到其中一点:正常的注释以‘*开头,单独的‘只用来注释暂时不用的代码
- L1 {7 U1 w' b# X‘* 这是普通的注释
0 k5 F ?8 a5 h) |: Z6 c‘* 这段代码在调试正确后加入
' T/ T; `2 ]# ]. ?‘If UseHighSpeed(g) = True Then .... t/ N/ B1 u+ c4 L# d$ t
这样能够方便的采用代码注释工具控制代码的使用。 , r$ Y) ~* G# l; a
以上已经简单的介绍了我使用的VB.net代码规范,这个代码规范也适用于C#。仅供大家参考。 |
|