| gadfly 回复于:2003-07-01 23:00:32
|
大部分都同意和遵循,33,59,是需要注意的规则。但是有两个值得商榷,
例如:
Rule 58. 除了switch语句,不得使用break.
Rule 101. 禁止指针运算(代之以数组下标运算)。
break在循环中使用的话,能是代码简洁,嵌套不至于太深。
指针运算也是,适当的应用,代码其实很清爽。
至于3元,我觉得一层还可以,多层就是卖弄技巧了,只能让后来的人看的头晕。
至于注释无用代码,我觉得如果是项目中使用版本控制工具,无用的代码完全可以去掉,当然如果是很简单的程序,可以用if 方式取消作用。
|
| 无双 回复于:2003-07-01 22:11:21
|
Rule 7. 不得使用三元操作符(? : 
Rule 10. 不得残留被注释掉的废代码。
FT
三无我喜欢用在返回值中 因为比较简单
注释掉的代码有时不能很肯定或是以后还会有参考价值的话
那么也会保留在源程序中的
但DEBUG或是ifdef 这类很少在完成后的代码中
|
| odin_free 回复于:2003-07-01 22:16:00
|
[quote:3f4f5a2e59="无双"]Rule 7. 不得使用三元操作符(? : 
Rule 10. 不得残留被注释掉的废代码。
FT
三无我喜欢用在返回值中 因为比较简单
注释掉的代码有时不能很肯定或是以后还会有参考价值的话
那么也会保留在源程序中?.........[/quote:3f4f5a2e59]
我觉得(?: )这个还好些
注释代码可以用 if(0){}以后条是可以用
在linux内核里很多这么用的
直接注释感觉太粗暴,看起来也不美观
|
| 无双 回复于:2003-07-01 22:20:21
|
我那一般直接注释
看起来是不美观
但是如果使用if(0)注释的代码太多
后面添加的代码很多的话
看起来也会很累
因为太长了
不过你的贴子还是很有价值的
加个精华
|
| odin_free 回复于:2003-07-01 22:41:54
|
对~这个帖子 我一看就收了
以前一直没有系统的好的风格选择 各种风格基本是支离破碎
这个算是一个比较完善的体系
注:第一个精华,开心
|
| 无双 回复于:2003-07-01 23:03:21
|
三层多层的话确实是难理解
另外指针现在已习惯
当然使用数数组的方法也是OK D
但这种情况下*a++
写成数组需要添加多代码
先是变量定义
然后是两个操作
效率会降低
|
| 蓝色键盘 回复于:2003-07-02 11:09:42
|
如下的规则,个人觉得不太合适。
[code:1:91a02448af]
Rule 7. 不得使用三元操作符(? : )
Rule 13. 不得使用char, int, float, double, long等基本类型,应该用自己定义的类型显示表示类型的大小,如CHAR8, UCHAR8, INT16, INT32, FLOAT32, LONG64, ULONG64等。
Rule 42. 除了循环控制语句,不得使用逗号表达式。
Rule 55. 除了switch语句,不得使用标号(label)。
Rule 56. 不得使用goto.
Rule 57. 不得使用continue。
Rule 58. 除了switch语句,不得使用break.
Rule 67. 循环计数器的值不得在循环体内修改。
Rule 70. 禁止任何直接和间接的递归函数调用。
Rule 92. 不应该使用#undef
[/code:1:91a02448af]
Rule 101. 禁止指针运算(代之以数组下标运算)。
|
| 蓝色键盘 回复于:2003-07-02 11:12:57
|
不过如下的规则非常好
[code:1:dc2bddcf89]
如果一个函数可能返回错误信息,则调用后必须加以测试。
[/code:1:dc2bddcf89]
|
| ffaatt 回复于:2003-07-02 11:18:17
|
规则总是要以牺牲效率和简洁为代价的。
再说一个程序里需要用到高效率代码的地方最多不过几行而已。
如果大家写程序都能忘记所谓的简洁、高效,那是多么理想的境界啊。
软件开发应该也有类似TCO的概念,编码时牺牲的效率会在调试、维护时得到补偿。
|
| gadfly 回复于:2003-07-02 12:27:34
|
我觉得是不能照搬。
57,58是一类。在循环中应该说是必不可少的。
70可能是指不许递归相互调用吧。
其实有的简化,也有利于维护,当然让人易于迷惑的除外。让你一目了然知道代码是在干什么。
|
| 蓝色键盘 回复于:2003-07-02 12:36:50
|
设想一下。对于while(1)或者for(;
如果break和continue和goto不用,一些逻辑很难实现的。
|
| ffaatt 回复于:2003-07-02 14:29:35
|
break和continue相当于goto,所以建议不用。
这个规范就是不让你写类似:while(1)或者for(;
|
| tinywind 回复于:2003-07-02 14:57:43
|
不准用goto如何做到函数单点退出?
|
| 无双 回复于:2003-07-02 15:04:56
|
if else啊
但这样一来程序会变得很复杂
所以我觉得还是使用的好
另外这只是他的建议
其它公司最后使用时也会变通的
没有看到vxworks上也写着才99%吗
|
| unicorns 回复于:2003-07-02 16:26:51
|
Rule 57. 不得使用continue。
Rule 58. 除了switch语句,不得使用break.
Rule 67. 循环计数器的值不得在循环体内修改。
Rule 70. 禁止任何直接和间接的递归函数调用。
Rule 82. 每个函数只能有一个推出点。
Rule 101. 禁止指针运算(代之以数组下标运算)。
这几条太狠了吧
有几个人可以做到?
|
| odin_free 回复于:2003-07-02 19:48:59
|
这个是有所得 必有所失
规矩多了 自然代码规范
但是设计的灵活就受到限制
|
| JohnBull 回复于:2003-07-02 20:12:50
|
不让用递归太过分了吧?
|
| 无双 回复于:2003-07-03 13:15:18
|
递归层数过多的话容易会堆栈溢出
但是如果肯定层数很少
那么使用没有什么问题吧
我觉得使用它做某些操作还是很简单的
如树的遍历
|
| ffaatt 回复于:2003-07-03 14:21:23
|
这个规范恐怕主要是用于底层开发的啊,汽车行业/vxwork...
这种情况下规范苛刻一些是正常的,也不会有多少机会用到递归,大家不做嵌入式系统就不需要严格照搬,否则就矫枉过正了,但是体会一下苛刻的规范还是有益的。
当年我做嵌入式开发的时候,好几次不得不把整个系统代码费掉重来,就是因为自己没有能力事先建立一套规范,当时要是先看到这个规范该多好啊,不过没有吃过苦头的人未必理解这个规范的价值。
就想楼主说的,制作规范体现实力,遵守规范更体现实力。
|
| ffaatt 回复于:2003-07-03 14:34:34
|
嵌入式开发的技术未必复杂,除了个别核心算法外。
关键是代码高度规范来保证可靠性和可移植性。一套代码要同时在几种不同的CPU、不同外设配置上测试、运行,绝大多数时间不是在编码,而是在交叉编译、在线调试、测试。根本没心情追求代码简介、漂亮,99%的代码也和执行效率无关。
真正要求高效的代码实际上是靠专业级的编译器优化得到的,因为要精确计算每条指令的CPU周期和流水线堵塞情况,程序员只是作一些微调而已。
有时候碰到CPU、存储器条件苛刻时,确实也顾不上规范,为了减少一个字节或一个指令周期,代码写的极难看。还好大多数时候不必这样,所以vxworks可以99%遵守规范。
|
| fr21cn 回复于:2003-07-03 21:01:28
|
如何付费???
|
| odin_free 回复于:2003-07-03 21:26:40
|
[quote:ded17d5f0a="无双"]递归层数过多的话容易会堆栈溢出
但是如果肯定层数很少
那么使用没有什么问题吧
我觉得使用它做某些操作还是很简单的
如树的遍历[/quote:ded17d5f0a]
递归的好处是思路简洁 代码清晰
缺点是用堆栈 浪费资源
我个人感觉可以用递归把解决思路搞通
然后用非递归实现
|
| fsb 回复于:2003-07-04 21:45:20
|
看了其它的文章有用栈消除递归的说法.
不知有没有这方面的例子
|
| 无双 回复于:2003-07-04 22:13:04
|
一般是使用循环展开的方法
理论上多数多数是可以使用其它方法代替的
除了一些特殊要求
如非波那序列
每一个值都依赖前一个值的结果
F(0) =1 F(1)=1
F(N)=F(N-1)+F(N-2)
|
| 强人 回复于:2003-07-06 16:33:00
|
意义不大
|