|
登录后查才能浏览下载更多咨询,有问题联系QQ:3283999
您需要 登录 才可以下载或查看,没有账号?入住遨海湾
×
按:编程规范是程序员在实践中,为维护代码,便于集体开发,制定的一种约定,也是程序开发经验总结。你可以参考、制定自己的规范,但不可拘泥。; a' b" |0 U4 ]' v+ m2 I! M
. F. G9 J6 ~: d( T, }- P7 k
在开发中保持良好的编码规范是十分重要的。我所采用的新的VB.net编码规范,是一种被证明能明显改善代码可读性,并有助于代码管理、分类的编码规范。采用这种编码规范,能避免如匈牙利命名法带来的繁长前缀,便于记忆变量的用途。下面的介绍这种编码规范。
2 b4 R& z( z3 w8 l: p% O
, f$ \9 ^6 F, Y一、类型级单位的命名' u. ]' r/ I ^
& z U }: W( B Z. A2 F6 B% ~1、类。
/ f) ~& D6 B b6 k# s
. b8 @0 g% Y" e4 l! j% X, t8 L以Class声明的类,都必须以名词或名词短语命名,体现类的作用。如: h/ X& g& f1 ]
Class Indicator
4 `4 z! X$ D& }6 N8 Y
7 W8 o; h2 o( ~+ D' |当类是一个特性(Attribute)时,以Attribute结尾,当类是一个异常(Exception)时,以Exception结尾: , o/ |1 a. Q9 C; a) `+ X" G2 T6 C
Class ColorSetException & }9 O* g6 h" Q. v3 Q, o0 m2 G1 {
Class CauseExceptionAttribute
% J! t$ H( k3 H) L+ y
+ O: l- r7 f2 S$ |0 n当类只需有一个对象实例(全局对象,比如Application等),必须以Class结尾,如 5 A. U, |! V" n) _3 W
Class ScreenClass 3 k. ~) x/ U8 ^: h7 W4 o
Class SystemClass
9 M/ k, z( [, h7 [7 i& @+ u& H/ K
2 M4 b, y: T( o* `1 h当类只用于作为其他类的基类,根据情况,以Base结尾: c: z+ K' u* ?" Q
MustInherit Class IndicatorBase ) G! }2 N: v. I$ S
3 h/ o7 J8 L0 S0 Z5 k5 y: X
如果定义的类是一个窗体,那么名字的后面必须加后缀Form,如果是Web窗体,必须加后缀Page: * x K0 H# T- t- B" W5 q; d
Class PrintForm : Inherits Form ‘* Windows窗体
/ }! p- s# \ g5 n5 k5 DClass StartPage : Inherits Page ‘* Web窗体 " U3 y& ~" b& K4 ^( X
/ R8 M+ n. G. H2、枚举和结构 $ v& H; @7 F5 |' | i
: c; G9 Q; x3 ]9 C: Y+ q同样必须以名词或名词短语命名。最好体现枚举或结构的特点,如: 6 F+ t4 H9 J8 O% p
Enum ColorButtons ‘以复数结尾,表明这是一个枚举 % j5 y; I, x Y9 j6 x
Structure CustomerInfoRecord ‘以Record结尾,表明这是一个结构体
; a+ V2 F) o: C- {# n2 v: A' L1 f) M$ q+ C
3、委派类型 8 H: i: `* b' V$ ?6 S) d
普通的委派类型以描述动作的名词命名,以体现委派类型实例的功能:
" }( z; Q% P& J# N, R: b" jDelegate Sub DataSeeker (ByVal SeekString As String)
3 F) F; t. l3 z3 w2 P用于事件处理的委派类型,必须以EventHandler结尾,如: " w; q6 p$ m5 _8 Z- g3 R. g
Delegate Sub DataChangedEventHandler (ByVal Sender As Object, ByVal e As DataChangedEventArgs) ) {, K! S3 Q5 k1 Z
$ o9 M. O% n- S
4、接口 7 C/ ~; b3 \( \2 C
与其他类型不同,接口必须要由I作为前缀,并用形容词命名,突出表现实现接口的类将具有什么能力:
7 _9 R3 f3 G' r0 f5 bInterface ISortable : H. ~9 K2 F' u6 X: u6 m' X
7 C$ `" t, N7 @% e6 J# b b- q8 [/ @
5、模块 ; a8 W+ |. U- g( N
模块不是类型,他的名称除了必须以名词命名外,必须加以后缀Module:
t5 v1 [: B0 oModule SharedFunctionsModule
, c( u, [. [7 V. l P9 X* f$ G上述所有规则的共同特点是,每个组成名称的词语都必须是大写开头,禁止完全大写或小写的名称。 7 Q5 v" p6 [, R: w/ [
9 e" m$ `8 Q0 T3 P$ x# ~
二、方法和属性的命名
+ M7 s# i0 w1 _$ x% k1 m
' t3 ?! A+ b* `' i( y1、方法
3 s9 X. J3 x& F/ ^+ A0 b8 v- A无论是函数还是子程序,方法都必须以动词或动词短语命名。无需区分函数和子程序,也无需指明返回类型。 - Y1 q0 \, l: c9 r' {( m
Sub Open(ByVal CommandString As String) + n2 a C: f( M( C6 b- `
Function SetCopyNumber(ByVal CopyNumber As Integer)
: t6 ?6 w' h( ]9 Q1 ]# B3 b, C( q参数需要指明ByVal还是ByRef,这一点写起来会让程序边长,但非常必要。如果没有特别情况,都使用ByVal。参数的命名方法,参考后面“变量的命名方法”。需要重载的方法,一般不写Overloads,根据需要编写重载的方法。 2 v) e: b: O7 [5 \
! o9 q6 f q6 M2、属性 " u: l8 w6 U$ U" d9 i2 e; X
原则上,字段(Field)是不能公开的,要访问字段的值,一般使用属性。属性以简洁清晰的名词命名:
5 \1 e8 k1 z. v8 q/ O5 d* oProperty Concentration As Single
. V+ c9 T+ I) m# J& X [/ qProperty Customer As CustomerTypes ( z5 O8 `& k$ {. C3 n. D& w4 p
0 U2 J& d% z% y" M4 h; F3、事件 2 ]% v& s4 z% F2 z# b( T
事件是特殊的属性,只能在事件处理上下文中使用。命名的原则一般是动词或动词的分词,通过时态表明事件发生的时间:
* e. c2 E F; s. {" O7 R/ V# ?Event Click As ClickEventHandler $ \. |6 \- \$ Y$ ~
Event ColorChanged As ColorChangedEventHangler8 y8 i2 ?: d; K6 U
. C, h% \ |% V9 V" ~三、变量和常数 $ Q* p3 a/ K$ W' K5 o$ n8 `# O
p: \! j/ ~1 i
常数以表明常数意义的名词命名,一般不区分常数的类型: : m3 ^7 F {* C. v
Const DefaultConcentration As Single = 0.01 4 x/ y4 c# d2 _3 H6 [. B
在严格要求的代码中,常数以c_开头,如c_DefaultConcentration,但最好不要用它,它会带来输入困难。
+ j% ?% p0 v8 z' ~: E) x2 y普通类型的变量,只要用有意义的名字命名即可,不可使用简称和无意义的名称诸如A,x1等,下面给出了良好的例子:
6 i$ i2 z0 U+ `" i9 K: [. K6 U0 lDim Index As Integer
+ o8 ^2 l; a. X% ]% V3 E$ xDim NextMonthExpenditure As Decimal
2 S* l2 D# `0 h+ p9 iDim CustomerName As String
8 N, ]+ z* B6 r7 B" J+ h( A不能起太长的名字,应该尽量简洁,如下面的例子:
2 x) Q! Q" l+ p+ \( S1 b4 UDim VariableUsedToStoreSystemInformation As String ‘* 错误,太复杂了 1 b* @. {( d9 n; A
Dim SystemInformation As String ‘* 正确,简单明了
5 p3 f: T- V, _# ^4 |* i$ W) b: pDim sysInfo As String ‘* 错误,过于简单
7 _! |9 h# Y3 n6 _) T/ K) t特殊情况可以考虑一个字母的变量:
' y+ N; g! T* l: L& KDim g As Graphic
; i& s0 `! b# `( G- }9 m对于控件,应该指明控件的类型,方法是直接在变量后面加以类名:
1 y& r- ?) x, u* pFriend WithEvents NextPageButton As Button ‘* 按钮
1 k( E) n% Y; E- sFriend WithEvents ColorChoicerPanel As Panel ‘* 面版
6 n, H3 w5 p' U+ c' i y0 ~$ MFriend WithEvents CardFileOpenDialog As FileOpenDialog ‘* 文件打开对话框 : R4 U( V3 t m% o b) j
等等,无需规定某种类型的变量的前缀,只需把类型写在后面就行了,试对比下列代码:
# N1 \* E) m- ^* f' pbtnCancel.Text = "&Cancel"
3 r' p* ^$ u* g+ Q0 W% {: HCancelButton.Text = "&Cancel"
) `- ?$ a* ~" ]/ y显然后者更能使阅读者明白变量的类型是一个按钮。* q& m3 _/ T, }# V6 a# ~( y& q
+ F$ p6 c$ s: a$ l5 I0 f四、标签 / h2 d4 {/ ~2 l- D9 W/ ^ f
8 V/ X( @( N3 o' C5 w( g标签就是用于Goto跳转的代码标识,由于Goto并不推荐使用,所以标签的使用也比较苛刻。标签必须全部大写,中间的空格用下划线_代替,而且应该以_开头,比如: " e( H' b3 n: E; Y/ z1 j( X
_A_LABEL_EXAMPLE: 9 g0 ?: D9 R- {" ~- ?; T8 n5 s
如此定义标签是为了与其他代码元素充分区别。
3 q( q8 S! h" S& l0 K7 B5 O0 M3 l) I9 ~
五、名字空间
; F7 A/ i! E# J6 x
0 f4 d( Y3 F1 ?, L: S/ F通常,一个工程使用一个名字空间,通常不需要用Namespace语句,而是在工程选项的“Root Namespace”中指定,使用根名字空间可以使代码更加整齐,容易修改,这一点是VB十足的优点。名字空间的语法是:
5 \/ m! D* W6 T+ u5 k! w公司名.产品名[.组件名的复数]
# \* T8 }0 P* S" g4 z% f如: 3 T) s# z h5 y4 F$ |9 C- [! |
Namespace Ninputer.VirtualScreen 5 b$ `7 X$ x' J1 c* O Z, K5 H
Namespace Ninputer.CardEditor.CustomeControls
2 h K. v! l$ j8 O; U3 I2 I% y随便起一个名字空间的名字绝对不是一个好主意,一定要遵守上述规定。
9 L( A( I8 L! ~) H: o
) Z/ \+ L6 j4 t9 m六、注释 9 a& F) q2 B# G0 `
, {4 W9 @ @% c: z" s# H9 @6 {
注释的规则繁多,这里仅提到其中一点:正常的注释以‘*开头,单独的‘只用来注释暂时不用的代码 7 q$ g0 f/ i# `% W$ V0 M8 y$ V
‘* 这是普通的注释 $ k6 _7 z' H( P0 r. t9 l9 K
‘* 这段代码在调试正确后加入 2 c; ^% T; S0 x. x
‘If UseHighSpeed(g) = True Then ....
8 K! {$ h* r+ w, W) K! m9 I这样能够方便的采用代码注释工具控制代码的使用。 W# o9 F5 b I
以上已经简单的介绍了我使用的VB.net代码规范,这个代码规范也适用于C#。仅供大家参考。 |
|