|
登录后查才能浏览下载更多咨询,有问题联系QQ:3283999
您需要 登录 才可以下载或查看,没有账号?入住遨海湾
×
按:编程规范是程序员在实践中,为维护代码,便于集体开发,制定的一种约定,也是程序开发经验总结。你可以参考、制定自己的规范,但不可拘泥。+ X4 g, c% @: H" ~
: K4 k/ x- |0 ~/ r8 F" p7 S; ^在开发中保持良好的编码规范是十分重要的。我所采用的新的VB.net编码规范,是一种被证明能明显改善代码可读性,并有助于代码管理、分类的编码规范。采用这种编码规范,能避免如匈牙利命名法带来的繁长前缀,便于记忆变量的用途。下面的介绍这种编码规范。8 c. M8 m9 T9 @! y" p- i
* f: g" J& a$ j0 | h# Y+ x! _一、类型级单位的命名% {& O) V( @5 X( ]. h
6 t7 [9 D2 t6 `
1、类。: q( I$ u+ c; U3 F2 Y! O9 x
/ b P% u6 `8 c' K
以Class声明的类,都必须以名词或名词短语命名,体现类的作用。如: $ n, y1 n3 w0 _9 |
Class Indicator
* u/ h6 d* ]0 e1 W2 }& o, i9 Z$ q1 y4 r- A* ?
当类是一个特性(Attribute)时,以Attribute结尾,当类是一个异常(Exception)时,以Exception结尾: F( ~' ?3 L6 g" U/ M
Class ColorSetException
- {, S' L: |- X2 }, K/ iClass CauseExceptionAttribute 6 \. ]7 i6 v, r8 Q; `/ p5 g2 X# c
4 W( J0 T% H# T5 I% y2 s2 b% {当类只需有一个对象实例(全局对象,比如Application等),必须以Class结尾,如
7 x( ?+ A g; A& ~3 fClass ScreenClass
/ Y( H( U: x+ f+ N. t0 B$ WClass SystemClass
0 h- E6 j! S+ j, T1 k' t% C
# [) o/ }" x/ i9 g, z5 r当类只用于作为其他类的基类,根据情况,以Base结尾: 7 _$ [$ X7 j1 d$ W6 d& E) T
MustInherit Class IndicatorBase
9 M' U! V: `0 R$ o' W1 |- G. q3 k/ [( M. W' U0 N W- W. T
如果定义的类是一个窗体,那么名字的后面必须加后缀Form,如果是Web窗体,必须加后缀Page: - f9 k: M s. @' q4 n" ^0 ~8 o
Class PrintForm : Inherits Form ‘* Windows窗体
- u" B/ Y% I5 n7 x" c) AClass StartPage : Inherits Page ‘* Web窗体 3 L; `% n2 @8 `" I8 }
+ Z4 p8 `% w! W7 p" H4 X2、枚举和结构 9 W8 a; U# @) V" T: l
. l1 C Y8 g+ j, n同样必须以名词或名词短语命名。最好体现枚举或结构的特点,如: 9 Z) f/ P L8 y; |2 ]( o
Enum ColorButtons ‘以复数结尾,表明这是一个枚举 1 p3 e8 ?+ c' _ I, q }
Structure CustomerInfoRecord ‘以Record结尾,表明这是一个结构体 & E \! g; G& r
" u; G3 d4 o1 x! W5 \9 V1 L$ D
3、委派类型
" Z1 ~& y- D/ \: Y普通的委派类型以描述动作的名词命名,以体现委派类型实例的功能:
8 g$ {( b4 E# S( Q: UDelegate Sub DataSeeker (ByVal SeekString As String)
V" I* e) Z% _3 ?4 l1 U( l- v/ H用于事件处理的委派类型,必须以EventHandler结尾,如:
" p9 T2 ]( C7 WDelegate Sub DataChangedEventHandler (ByVal Sender As Object, ByVal e As DataChangedEventArgs)
1 h' Q: `# ]* Y" m6 K2 X
, Z. j% k8 b( g4、接口 9 R: m) g% V/ ~: u4 t% `& w( j/ o
与其他类型不同,接口必须要由I作为前缀,并用形容词命名,突出表现实现接口的类将具有什么能力: 1 D2 q4 p' x$ B1 Y! w5 ?4 n
Interface ISortable
5 {1 r8 [8 k. K0 R* M
' D* b0 |) f3 C3 F6 G5 \5、模块 7 m( _& n1 n7 {' D
模块不是类型,他的名称除了必须以名词命名外,必须加以后缀Module: ( q# o+ l7 E6 d' {. L" ~# a
Module SharedFunctionsModule
# [6 o8 l1 p. y3 s3 E+ a上述所有规则的共同特点是,每个组成名称的词语都必须是大写开头,禁止完全大写或小写的名称。
: V- p1 r& r0 s0 @ K! [8 h8 S3 \
' u; S5 y6 v7 N* u6 d二、方法和属性的命名 / w& P/ |5 [3 R8 W7 O
) m* y) E) E) x% \
1、方法 + s# T3 ~+ ~8 Y6 e" a
无论是函数还是子程序,方法都必须以动词或动词短语命名。无需区分函数和子程序,也无需指明返回类型。 - }6 b% Q: a; [6 l
Sub Open(ByVal CommandString As String)
, d' ?4 A& ^) x; E* A c% NFunction SetCopyNumber(ByVal CopyNumber As Integer) Z9 V) i* k& F- {3 x; S. P4 N
参数需要指明ByVal还是ByRef,这一点写起来会让程序边长,但非常必要。如果没有特别情况,都使用ByVal。参数的命名方法,参考后面“变量的命名方法”。需要重载的方法,一般不写Overloads,根据需要编写重载的方法。 ; _4 \7 v. f( V) h- c- ~0 w
& t+ Y2 C; a/ O) U2 n( ~2、属性 5 v2 m' u1 e% y4 y; q0 |
原则上,字段(Field)是不能公开的,要访问字段的值,一般使用属性。属性以简洁清晰的名词命名: & u B4 ?7 J3 i9 ~+ Q/ U
Property Concentration As Single
" f0 S/ ?# s# W1 u$ n0 m' NProperty Customer As CustomerTypes 4 e6 {/ O1 y% X
2 }4 f1 ~) S) y& @3、事件 ' y6 P% ^2 N$ |+ B* H9 d
事件是特殊的属性,只能在事件处理上下文中使用。命名的原则一般是动词或动词的分词,通过时态表明事件发生的时间:
4 k/ H; @5 X8 F2 X2 l) K* |. TEvent Click As ClickEventHandler $ A$ @; l( i2 E+ u# N# x
Event ColorChanged As ColorChangedEventHangler
2 |! Y3 z/ ~1 U, Y* }" N
% |( ?6 z$ C7 M: }# {三、变量和常数
3 ~ ?! {" [: p$ U9 P1 f& q* F1 m4 }$ v. v
常数以表明常数意义的名词命名,一般不区分常数的类型: % L( Z+ m, ?5 F
Const DefaultConcentration As Single = 0.01
/ S H5 _. Q/ g% p1 z p. L在严格要求的代码中,常数以c_开头,如c_DefaultConcentration,但最好不要用它,它会带来输入困难。 1 K/ H! W, V {3 c K6 A6 W
普通类型的变量,只要用有意义的名字命名即可,不可使用简称和无意义的名称诸如A,x1等,下面给出了良好的例子:
^2 |2 E8 p# b# L+ ^Dim Index As Integer 6 `$ c) C7 Q2 z8 V
Dim NextMonthExpenditure As Decimal " n' R0 Y( z/ K% e
Dim CustomerName As String & O8 O4 b2 L* C, C( [1 g
不能起太长的名字,应该尽量简洁,如下面的例子:
5 z& ?+ X; F7 a; `" g5 l! xDim VariableUsedToStoreSystemInformation As String ‘* 错误,太复杂了 5 K- A$ v b9 n% ^
Dim SystemInformation As String ‘* 正确,简单明了
/ Q1 U8 p: ?# {$ iDim sysInfo As String ‘* 错误,过于简单
& J3 i8 S3 E2 s; T4 K+ A特殊情况可以考虑一个字母的变量: & [4 Q. f; p. g& ~6 V
Dim g As Graphic
* `0 p; \; {' {, \对于控件,应该指明控件的类型,方法是直接在变量后面加以类名: $ ]) Y% i5 ^8 x# I9 v
Friend WithEvents NextPageButton As Button ‘* 按钮 - Y! L3 ]& |/ T' s( t6 e
Friend WithEvents ColorChoicerPanel As Panel ‘* 面版
- k+ |+ Z+ G1 `' G$ nFriend WithEvents CardFileOpenDialog As FileOpenDialog ‘* 文件打开对话框
- w4 a4 F% o! \等等,无需规定某种类型的变量的前缀,只需把类型写在后面就行了,试对比下列代码:
9 c( ]! s: U1 Y) sbtnCancel.Text = "&Cancel" " ^2 ~5 s% |0 T
CancelButton.Text = "&Cancel"
. c) h+ x% Y1 h1 @; x, M5 H显然后者更能使阅读者明白变量的类型是一个按钮。
# M. W) Y- U* s# ]. e. l* o7 p j$ x+ I& }$ I' u8 N( M; w
四、标签 ! i) a2 @% r: l4 y$ j6 {% }6 T. R" n- l
8 p& ]5 t8 Z* }# U8 c" R4 c
标签就是用于Goto跳转的代码标识,由于Goto并不推荐使用,所以标签的使用也比较苛刻。标签必须全部大写,中间的空格用下划线_代替,而且应该以_开头,比如: ) `) @; m# L0 p0 l7 k
_A_LABEL_EXAMPLE:
6 P. T! k1 N$ P1 k" U7 a8 b8 k( e( d如此定义标签是为了与其他代码元素充分区别。
( x% c. F1 _; H# l+ }+ I# ]7 k5 }0 t" y1 v; H. p( q
五、名字空间 % h! z# u8 B0 D8 f8 S" R
1 S9 A* ?" w3 l" I9 V: g0 q' D通常,一个工程使用一个名字空间,通常不需要用Namespace语句,而是在工程选项的“Root Namespace”中指定,使用根名字空间可以使代码更加整齐,容易修改,这一点是VB十足的优点。名字空间的语法是: 1 m& K K# s" {" v2 Z0 d' I* z
公司名.产品名[.组件名的复数]
8 L, }6 X: `% {" s+ G2 B如: 9 S4 Y. I4 k9 ]! Y5 Q
Namespace Ninputer.VirtualScreen
) ~: j f. L3 M0 FNamespace Ninputer.CardEditor.CustomeControls
- {( N$ f4 j- ^% L随便起一个名字空间的名字绝对不是一个好主意,一定要遵守上述规定。; K" l% z( M7 m
9 }! [, w3 u: z! K4 U2 y4 ^
六、注释
J7 ^. }* r# H" h# L2 |( D3 r$ V- {
注释的规则繁多,这里仅提到其中一点:正常的注释以‘*开头,单独的‘只用来注释暂时不用的代码 ' b; G. y7 D1 N2 Y5 V. x" a
‘* 这是普通的注释
, o O2 `3 n! \" z+ {‘* 这段代码在调试正确后加入
, I0 h9 d" g1 z' D‘If UseHighSpeed(g) = True Then ....
. {0 o! |# i3 H8 N" {这样能够方便的采用代码注释工具控制代码的使用。
; F" N! q# {( y( j. E以上已经简单的介绍了我使用的VB.net代码规范,这个代码规范也适用于C#。仅供大家参考。 |
|