posts - 257, comments - 1336, trackbacks - 63, articles - 8
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

也谈代码规范

Posted on 2005-07-07 21:35 FantasySoft 阅读(3623) 评论(30)  编辑 收藏 网摘 所属分类: All About SoftThought Ware
        看了湘南和也写的程序编码应保持良好的规范(C#) ,我也忍不住要说上两句。这两年来,做了几个项目,技术没有长进多少,对于规范倒是有了不少的体会。
        湘南和也提到的四点规范是比较重要的,我再补充几点。
        1、常量的命名常量使用大写字母,各个单词之间通过下划线的划分。譬如BASE_SALARY;
        2、变量的命名变量的首字母小写,之后的单词的首字母大写。譬如baseSalaryLow;
        3、常量和变量的命名:两者都必须注意一个问题,就是单词的准确性。在一篇不错的代码中出现了单词拼写的错误,会让人感觉好像一锅好汤掉进了几颗老鼠屎;
        4、代码的缩进:缩进要保持一致。很多规范会建议利用tab作为缩进的占位符号。我是不建议这样做,因为不同的文本编辑器对于tab的显示都不一样,如果有些地方使用了tab,有些地方使用了相应的空格,那么就会出现在这个编辑器中看着还整整齐齐的,换到另外一个编辑器就会乱七八糟的情况。因此,我更倾向于使用空格来做为缩进的占位符号;
        5、空格的使用:空格除了作为缩进的占位符之外,还在很多地方也是必需的。譬如,在条件语句和循环语句中,关键字之后就应该使用空格。在这点上,湘南和也给出的代码并没有做到,如果这样写会更好:

if (hidbrand == ","{
    Body.txtHidBrand.Text 
= ""
;
}
 else {
    Body.txtHidBrand.Text 
=
 hidbrand;
}

        
如果大括号与条件语句的括号是同一行的话,大括号之前也要使用括号。同时,除了湘南和也提到的赋值语句中的等号前后要使用空格之外,各种运算符的前后也应该使用空格,除了自增(++)、自减(--)和逻辑非(!)运算符之外。例如:

if (i != arrHidBrand.Count - 1)
    hidbrand 
+= ","
;
       
        6、换行的使用:不管是C++、Java还是C#,你都可以将所有代码写在同一行。但是如果你真的这么做了,那么阅读你的代码简直就是噩梦。因此定好一行代码不超过多少列也是相当必要的。这可以让阅读代码者看得更舒服,因为他不需要来回拖动横向滚动条了;
        7、变量的作用域:定义变量的时候要考虑变量的作用域。譬如,在循环语句中,通常都会使用一个变量作为循环的标志,这个变量应该定义为局部变量,仅循环的区域可见。譬如:

for (int i = 0; i < list.length; i++{
    
}

i的定义就应该出现在for循环的括号中,而非for循环之外;
        8、尽量避免使用Magic Number和Magic String:这一点在我的上一篇Post已经作了详细讨论;
        9、注释的使用:代码都应该有一个注释头,包含一些版权声明,作者,修改历史记录等信息。在方法之前都应该使用多行注释来说明方法的功能和参数的含义。单行注释过长的时候,要使用多行注释。
        
        就想到这么多了,如果各位朋友有兴趣,还请继续补充,不吝赐教。最后,我还想说的一点就是,虽然在实际的开发当中都会有专门的工具来对代码进行format,也会有专门的工具来检查代码是否符合规范,但是我们还是应该将这些规范牢记在心,成为你写代码的习惯,毕竟工具不是万能的,而且工具也有失效的时候。

Feedback

#1楼    回复  引用    

2005-07-08 09:47 by gray [未注册用户]
我不认同文中的大部分意见
1.以下划线分割的大写字母命名的常量,我只有在C++/C的代码里经常见到,但在C#中我想不会有人认为 SalaryConst.BASE_SALARY 比 SalaryConst.BaseSalary看上去更舒服吧
2.局部变量的命名我赞同如此做法,还有必要区分private field和local variable的命名以避免名字冲突的情况。私有自段命名我们是这样做法:_baseSalaryLow。
3.
4.不用Tab键缩进将造成以下几个问题
每个缩进都要耗费4倍的击键,编写每行方法代码前你都要按至少12次空格(至少三层的缩进,不是吗?)
你的源代码文件将增加很大的存储容量。
*几乎所有的编辑环境都有选项可以设置Tab符的显示宽度
5.在if后面加一个空格我认为除了代码看起来更零散及耗费更多的击键,并没有带来什么好处,但我同意在运算符和变量之间使用空格

#2楼    回复  引用  查看    

2005-07-08 09:59 by birdshome      
空谈误国。

#3楼 [楼主]   回复  引用  查看    

2005-07-08 10:52 by FantasySoft      
birdshome兄,如果有说得不对的地方,烦请多多指教。 :)

#4楼 [楼主]   回复  引用  查看    

2005-07-08 11:10 by FantasySoft      
To gray: 我想对于第四点,我讲得不够清楚吧。关键在于一致,要么全部用tab,要么就全部用空格,如果两者混在一齐的话,就有可能会出现代码混乱的情况了。你提到的击键次数问题,在Eclipse中是不会那么明显的。因为它提供了自动缩进的功能,而且你可以选择缩进是tab还是相应的空格数。至于你提到的占用太多的空间之说,似乎有点牵强了,而且代码编译过程中,空格是会忽略掉的,编译之后的.class文件并不会因为空格的增多而变大。

对于第五点,你可以参考Eclipse提供的代码生成的template。

总之,代码规范是见仁见智了,只要多从代码阅读者的角度出发,我想就能做得更好。

#5楼    回复  引用    

2005-07-08 11:24 by Ninputer [未注册用户]
以下划线开头的标识符不符合CLS,强烈建议不要采用。

#6楼    回复  引用    

2005-07-08 11:26 by Ninputer [未注册用户]
哦,搂主是用Java/Eclipse的,习惯可能不太一样。VS.NET可以将Tab自动转化为空格,而且体现给用户还是Tab(就是按一下Backspace就可以清除4个空格等等)。只是VB默认采用Tab空格化,而C#默认不采用。建议C#程序员采用。

#7楼    回复  引用    

2005-07-08 11:30 by Ninputer [未注册用户]
我也强烈同一在if, for, foreach, try, catch, using, lock, while, delegate(C#2.0)等关键字的后面与圆括号之间加一空格。实践证明代码看起来更清晰。

#8楼 [楼主]   回复  引用  查看    

2005-07-08 11:43 by FantasySoft      
To Ninputer:真是感动得掉泪花呀,谢谢您的comment。

个人觉得VB虽然不分大小写,但是VB的代码看起来还是蛮整齐漂亮的。不知道VB的缩进是否也如Python一样是强制性的呢?

#9楼    回复  引用  查看    

2005-07-08 12:14 by 补丁      
个人觉得有些东西稍嫌死板
其实if for等等的,加不加空格,加几个空格,对可读性的影响没有说的那么严重,虽然我有和楼主一样的编码习惯,但是这丝毫不影响我阅读其他人的代码,偶尔哪里违背了这个规则也不会太引起我的注意,更不至于煞费苦心再去修改它
倒是逻辑上的混乱更成问题,比如一个复杂的逻辑在简短一句话里表达出来确实让我抓狂...

#10楼    回复  引用  查看    

2005-07-08 12:34 by 湘南和也      
通常对于第1,第2点会是争议最多的,这也是我为什么不强调这个的原因。从学语言开始,就可以接触很多变量命名规范,什么匈牙利命名规则等等。只要有自己清晰的命名规范就可以了

#11楼    回复  引用    

2005-07-08 12:59 by 春鱼 [未注册用户]
这种东西有什么必要在这里争论来争论去的, 只要项目成员能保持一致就行了. 你写得规范本身就不规范, 每一条都有很多细节没写到. 譬如注释, 就可以分单元注释、类注释、XML文档注释、行间注释等等。照你这么写编码规范, 等于没有规范. 把变量的作用于也扯进来,证明你混淆了编码规范与设计原则。

执行准确而完全的编码规范产生的源代码,一万个人和一个人写出来的程序是完全一样的,你只写岀了表面上的东西。

#12楼    回复  引用    

2005-07-08 13:22 by nKing [未注册用户]
无聊之人作无聊之事

#13楼    回复  引用  查看    

2005-07-08 13:38 by 蛙蛙池塘      
我晕,也不至于你们这么打击楼主吧,关于编码的问题可以参考MSDN丽的“类库开发指南”里面做的约定。另外不才整理了一些程序开发规范,设计到各种语言,下面是地址,大家有兴趣可以去看看
http://blog.csdn.net/onlytiancai/category/69385.aspx
另外推荐《asp.net web站点高级编程》里面提到的命名规则和开发规范也是很不错的

#14楼    回复  引用  查看    

2005-07-08 13:40 by 蛙蛙池塘      
转篇帖子给大家看看,这篇帖子设计到一个编码规范的问题

http://blog.csdn.net/gigix/archive/2004/05/22/2450.aspx

在CSDN看到一个很有趣的帖子(http://www.csdn.net/develop/article/28/28005.shtm),里面说同一个功能,中、日两国程序员写出的代码天差地别:

JAPAN:
Dim gridItemIndex As Integer 'comment
Dim currentPageIndex As Integer 'comment
Dim pageSize As Integer 'comment

gridItemIndex = e.Item.ItemIndex
currentPageIndex = meisaiIchiran.CurrentPageIndex
pageSize = meisaiIchiran.PageSize

Dim updateDataRowIndex As Integer 'comment
updateDataRowIndex = (currentPageIndex * pageSize) + gridItemIndex
dt.Rows(updateDataRowIndex).Item(t.BindFldName) = txt

CHINA:
dt.Rows(.CurrentPageIndex * .PageSize + e.Item.ItemIndex).Item(t.BindFldName) = txt

这段代码以前在软工版也见到过,有不少人认为两段代码折射出程序员的素质。一种看法是,日本同行写的代码更规范,可读性更强,因此显得比较有素质;另一种看法是,中国同行的代码更简练,废话更少,因此显得比较有素质。

程序员的素质,这是实实在在的东西,但不是从这两段代码中体现。也许你思维比较灵活,思路比较清晰,脑子转得比较快,对程序的感觉比较敏锐,那你也许更喜欢中国同行那段代码;也许你像我一样,脑子比较笨,想问题容易迷糊,需要多几个临时变量才能搞清楚状况,那你也许更喜欢日本同行那段代码。没关系,哪种风格都可以。我们不难猜到,这两段代码是同一个函数的两种实现方式。作为项目经理,我说,无所谓,你喜欢哪种风格就用哪种风格。只要你素质良好,用哪种风格都不妨碍你成为优秀的程序员。因为,素质并不在这两种风格之中。

那么,素质在哪里?恰好就在这两段代码之外。放这段代码的函数,你给它起了一个怎样的函数名?这个名字能够让别人一眼看懂它的作用吗?这个函数有没有单元测试?函数的功能、出错情况和边界值在单元测试里都能体现出来吗?这才是程序员的素质所在。只要你给每个函数起的名字都能一目了然地看懂,只要你的每个函数都有完备的单元测试,那你就具有程序员最基本的素质。至于这个函数里面的代码,你喜欢怎么实现都可以——或许我应该再加上“重构”这项素质?

面向对象理论说“针对接口编程”,同样的,程序员的素质也体现在接口上。如果到了别人来看你的实现代码,你作为程序员的素质就已经遭到质疑了。还是先在函数名、单元测试这些地方多下下功夫吧。

#15楼    回复  引用  查看    

2005-07-08 13:51 by 蛙蛙池塘      
类库开发人员设计指南

ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpgenref/html/cpconnetframeworkdesignguidelines.htm

命名指南
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpgenref/html/cpconnamingguidelines.htm

#16楼 [楼主]   回复  引用  查看    

2005-07-08 13:58 by FantasySoft      
To 春鱼:谢谢你的comment。 我这里只是就自己能够想到的一些编码规范作些讲述,讲得比较简单,也比较表面。 事实上,编码规范涉及的方面很多,用一本几百页的书去说明也不为过。

对于第七点,可能用作用域来说明可能会有些混淆吧。但是循环标志应该在哪里被定义是应该作为代码规范来说明的。

#17楼    回复  引用    

2005-07-08 15:00 by yun [未注册用户]
越整越没用,"脑子比较笨,想问题容易迷糊",我觉得已经不适合做程序员了,根本不用大谈什么素质不素质。

#18楼    回复  引用    

2005-07-08 15:08 by 春鱼 [未注册用户]
相比于源代码的格式, 相信标志符的命名是更重要的.
对标志符(name space, 类, 方法, property以至于私有成员, 变量)的命名可以反映出编码人员的素质. 有太多的人不知道区分动名词, 动词时态, 名词单复数; 滥用缩写形式, 大小写形式. 随意加前缀和下划线等等. 命名规范, 格式良好并且注释得当的源代码是美的.

对于下划线, 在编码中是有特殊含义的. 是由IDE使用在特定场合(服务器端控件所引发的时间处理过程名)的. 除了这些之外, 编码中应该避免出现下划线. 否则将会引起混淆.

#19楼 [楼主]   回复  引用  查看    

2005-07-08 15:23 by FantasySoft      
To 春鱼: 您说得太对了。 标志符的命名确实可以反映一个程序员的整体素养。 程序员应该明白清楚自己肩负着两重责任:一方面是要让程序可以良好的工作, 另一方面是要让合作者看明白自己的程序。

对于您提到的下划线的特殊含义,我不是很明白。 在Java中定义常量,下划线作为单词之间的分隔符是常见的stardard哦。

#20楼    回复  引用  查看    

2005-07-08 15:36 by 补丁      
看到那个日本人写源码的例子
我突然萌生一想法,虽然有点离题
是不是他公司按源码行数算钱
所以他如此残忍的折磨自己的键盘...
写的也太烦冗了吧
凡事适可而止才是好的

#21楼    回复  引用  查看    

2005-07-08 16:08 by 春鱼      
我想那个例子也只是纯粹调侃吧。行数并不代表可读性。声明过多的局部变量不不是好习惯。

#22楼    回复  引用    

2005-07-08 16:48 by bluemaple [未注册用户]
在网上也看到过不少关于代码规范的文章,不过,大多数我还是不敢苟同,同样对于作者的这几点说明,也不尽表示赞同,湘南和也的文章我是没有看过的,不过,既然此篇是作为他的一点补充说明,或许也应该是相差不多的.对于代码规范其实只要保证在看起来美观,易懂,并且易维护的前提下,每个人尽可以保留自己的风格,并没有必要列出那么多的条条框框,搞教条化主义.

#23楼 [楼主]   回复  引用  查看    

2005-07-08 16:55 by FantasySoft      
To bluemaple: 你可以看看我写的上一篇关于Magic Number和Magic String的post。 我同意你说的不能搞教条化主义,但是如果在一个Project中,大家的代码风格各异,百家齐放的话,那么维护成本将会是昂贵的。 我觉得要体现出自己代码的个性,就应该在设计上多下功夫,而不是在是否遵循代码规范上。

#24楼    回复  引用  查看    

2005-07-08 18:25 by 蛙蛙池塘      
c#不建议在变量中使用下划线,而是使用字母组合,每个字母首字母大写,如果是函数的参数的话,第一个字母的小写

#25楼    回复  引用    

2005-07-08 18:26 by 补丁 [未注册用户]
我觉得这个跟magic number还不是一码事...

#26楼    回复  引用  查看    

2005-07-09 11:59 by 木野狐      
我觉得成员变量有必要统一使用 _ 开头。比如下列代码:

class Test {
string _name;

public Test(string name) {
_name = name;
}
}

明显比

class Test {
string name;

public Test(string name) {
this.name = name;
}
}

要更清楚些。

第二种非得用 this 来引用成员的变量。当变量多了之后很容易造成混淆。

#27楼 [楼主]   回复  引用  查看    

2005-07-09 22:45 by FantasySoft      
To 木野狐: 在Java的代码规范中,经常会推荐使用第二种方式,而非使用下划线做首字母的方式。

#28楼    回复  引用  查看    

2005-07-11 15:29 by QuitGame      
偶得想法很简单

成员变量和函数参数使用 小写开头
属性和函数名称使用 大写开头

除了事件处理程序 其他情况下不使用 _

#29楼    回复  引用    

2005-08-25 14:32 by lsmwell [未注册用户]
关于编码,我想基本的大家都应该了解的落,只要别写的太凌乱就OK了~!要求也不要太苛刻了~!有一点自己的习惯也不错的~!

#30楼    回复  引用  查看    

2008-06-17 14:18 by 求知无傲      
学习。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-07-07 21:41 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: