3.2. 缩进/制表符/空格 规则
· 使用制表符缩进。
· 使用三到四个空格为每层次缩进。
· 不再使用只要一有需要就缩排的方法。对于最大缩进层数,并没有一个固定的规矩,假如缩进层数大于四或者五层的时候,你可以考虑着将代码因数分解(factoring out code)。
理由
· 许多编程者支持制表符。
· 当人们使用差异太大的制表符标准的话,会使阅读代码变得很费力。
· 如此多的人愿意限定最大的缩进层数,它通常从未被看作是一件工作。我们相信程序员们会明智的选择嵌套的深度。
例如
function func()
{
if (something bad)
{
if (another thing bad)
{
while (more input)
{
}
}
}
} 中国网管联盟www.bitscn.com
3.3. 小括号、关键词和函数 规则
· 不要把小括号和关键词紧贴在一起,要用空格隔开它们。
· 不要把小括号和函数名紧贴在一起。
· 除非必要,不要在Return返回语句中使用小括号。
理由
· 关键字不是函数。如果小括号紧贴着函数名和关键字,二者很容易被看成是一体的。
例如
if (condition)
{
} feedom.net
while (condition)
{
}
中国网管联盟www_bitscn_com
strcmp($s, $s1); 网管联盟www.bitsCN.com
return 1;
中国网管论坛bbs.bitsCN.com
3.4. 别在对象架构函数中做实际的工作
中国网管联盟www.bitscn.com
别在对象架构构造函数中做实际的工作, 构造函数应该包含变量的初始化和(或)不会发生失败的操作。
理由
· 构造不能返回错误 。
例如
class Device
{
function Device() { /* initialize and other stuff */ }
function Open() { return FAIL; }
};
$dev = new Device;
if (FAIL == $dev->Open()) exit(1);
网管联盟www.bitsCN.com
3.5. If Then Else 格式
布局
这由程序员决定。不同的花括号样式会产生些微不同的样观。一个通用方式是:
if (条件1) // 注释
{
}
else if (条件2) // 注释
{
}
else // 注释
{
}
如果你有用到else if 语句的话,通常最好有一个else块以用于处理未处理到的其他情况。可以的话放一个记录信息注释在else处,即使在else没有任何的动作。
条件格式
总是将恒量放在等号/不等号的左边,例如:
if ( 6 == $errorNum ) ...
一个原因是假如你在等式中漏了一个等号,语法检查器会为你报错。第二个原因是你能立刻找到数值而不是在你的表达式的末端找到它。需要一点时间来习惯这个格式,但是它确实很有用。
3.6. switch 格式
· 当一个case块处理后,直接转到下一个case块处理,在这个case块的最后应该加上注释。
· default case总应该存在,它应该不被到达,然而如果到达了就会触发一个错误。
· 如果你要创立一个变量,那就把所有的代码放在块中。
例如
switch (...)
{
case 1:
...
// FALL THROUGH
case 2:
{
$v = get_week_number();
...
}
break;
default:
} 中国网管联盟www、bitsCN、com
3.7. continue,break 和 ? 的使用
3.7.1. Continue 和 Break
Continue 和 break 其实是变相的隐蔽的 goto方法。
Continue 和 break 像 goto 一样,它们在代码中是有魔力的,所以要节俭(尽可能少)的使用它们。使用了这一简单的魔法,由于一些未公开的原因,读者将会被定向到只有上帝才知道的地方去。
Continue有两个主要的问题:
· 它可以绕过测试条件。
· 它可以绕过等/不等表达式。
看看下面的例子,考虑一下问题都在哪儿发生:
while (TRUE)
{
...
// A lot of code
...
if (/* some condition */) {
continue;
}
...
// A lot of code
...
if ( $i++ > STOP_VALUE) break;
}
注意:"A lot of code"是必须的,这是为了让程序员们不能那么容易的找出错误。
通过以上的例子,我们可以得出更进一步的规则:continue 和 break 混合使用是引起灾难的正确方法。
3.7.2. ?:
麻烦在于人们往往试着在 ? 和 : 之间塞满了许多的代码。以下的是一些清晰的连接规则:
· 把条件放在括号内以使它和其他的代码相分离。
· 如果可能的话,动作可以用简单的函数。 feedom.net
· 把所做的动作,“?”,“:”放在不同的行,除非他们可以清楚的放在同一行。
例如
(condition) ? funct1() : func2(); 中国网管联盟www、bitsCN、com
or
中国网管论坛bbs.bitsCN.com
(condition)
? long statement
: another long statement;
3.8. 声明块的定位 54com.cn
· 声明代码块需要对齐。
理由
· 清晰。
· 变量初始化的类似代码块应该列表。
· &应靠近类型,而不是变量名。
例如
var $mDate
var& $mrDate
var& $mrName
var $mName
$mDate = 0;
$mrDate = NULL;
$mrName = 0;
$mName = NULL; 54ne.com
3.9. 每行一个语句
中国网管联盟www_bitscn_com
除非这些语句有很密切的联系,否则每行只写一个语句。 中国网管联盟www_bitscn_com
3.10. 短方法 中国网管联盟www、bitsCN、com
方法代码要限制在一页内。 中国网管联盟www_bitscn_com
3.11. 记录所有的空语句
总是记录下for或者是while的空块语句,以便清楚的知道该段代码是漏掉了,还是故意不写的。
while ($dest++ = $src++)
; // VOID 54ne.com
3.12. 不要采用缺省方法测试非零值
不要采用缺省值测试非零值,也就是使用: 网管网bitsCN.com
if (FAIL != f())
比下面的方法好: 中国网管联盟www、bitsCN、com
if (f()) 中国网管论坛bbs.bitsCN.com
即使 FAIL 可以含有 0 值 ,也就是PHP认为false的表示。在某人决定用-1代替0作为失败返回值的时候,一个显式的测试就可以帮助你了。就算是比较值不会变化也应该使用显式的比较;例如:if (!($bufsize % strlen($str)))应该写成:if (($bufsize % strlen($str)) == 0)以表示测试的数值(不是布尔)型。一个经常出问题的地方就是使用strcmp来测试一个字符等式,结果永远也不会等于缺省值。
非零测试采用基于缺省值的做法,那么其他函数或表达式就会受到以下的限制:
· 只能返回0表示失败,不能为/有其他的值。
· 命名以便让一个真(true)的返回值是绝对显然的,调用函数IsValid()而不是Checkvalid()。
3.13. 布尔逻辑类型 中国网管联盟www_bitscn_com
大部分函数在FALSE的时候返回0,但是发挥非0值就代表TRUE,因而不要用1(TRUE,YES,诸如此类)等式检测一个布尔值,应该用0(FALSE,NO,诸如此类)的不等式来代替:
if (TRUE == func()) { ...
应该写成: 中国网管论坛bbs.bitsCN.com
if (FALSE != func()) { ...
3.14. 通常避免嵌入式的赋值 中国网管联盟www、bitsCN、com
有时候在某些地方我们可以看到嵌入式赋值的语句,那些结构不是一个比较好的少冗余,可读**强的方法。
while ($a != ($c = getchar()))
{
process the character
}
++和--操作符类似于赋值语句。因此,出于许多的目的,在使用函数的时候会产生副作用。使用嵌入式赋值提高运行时**能是可能的。无论怎样,程序员在使用嵌入式赋值语句时需要考虑在增长的速度和减少的可维护**两者间加以权衡。例如:
a = b + c;
d = a + r;
不要写成:
d = (a = b + c) + r;
feedom.net
虽然后者可以节省一个周期。但在长远来看,随着程序的维护费用渐渐增长,程序的编写者对代码渐渐遗忘,就会减少在成熟期的最优化所得。 中国网管论坛bbs.bitsCN.com
4. 帮助与共享
网管联盟www.bitsCN.com
4.1. 重用您和其他人的艰苦工作
网管网bitsCN.com
跨工程的重用在没有一个通用结构的情况下几乎是不可能的。对象符合他们现有的服务需求,不同的过程有着不同的服务需求环境,这使对象重用变得很困难。
开发一个通用结构需要预先花费许多的努力来设计。当努力不成功的时候,无论出于什么原因,有几种办法推荐使用: 中国网管联盟www.bitscn.com
4.2. 请教!给群组发Email求助
中国网管联盟www、bitsCN、com
这个简单的方法很少被使用。因为有些程序员们觉得如果他向其他人求助,会显得自己水平低,这多傻啊!做新的有趣的工作,不要一遍又一遍的做别人已经做过的东西。
如果你需要某些事项的源代码,如果已经有某人做过的话,就向群组发email求助。结果会很惊喜哦!
在许多大的群组中,个人往往不知道其他人在干什么。你甚至可以发现某人在找一些东西做,并且自愿为你写代码,如果人们在一起工作,外面就总有一个金矿。
feedom.net
4.3. 告诉!当你在做事的时候,把它告诉所有人
网管网bitsCN_com
如果你做了什么可重用的东西的话,让其他人知道。别害羞,也不要为了保护自豪感而把你的工作成果藏起来。一旦养成共享工作成果的习惯,每个人都会获得更多。
中国网管联盟www_bitscn_com
4.4. 小型代码库
对于代码重用,一个常见的问题就是人们不从他们做过的代码中做库。一个可重用的类可能正隐蔽在一个程序目录并且决不会有被分享的激动,因为程序员不会把类分拆出来加入库中。
这样的其中一个原因就是人们不喜欢做一个小库,对小库有一些不正确感觉。把这样的感觉克服掉吧,电脑才不关心你有多少个库呢。
如果你有一些代码可以重用,而且不能放入一个已经存在的库中,那么就做一个新的库吧。如果人们真的考虑重用的话,库不会在很长的一段时间里保持那么小的。
4.5. 知识库 54ne.com
很多公司不清楚现有什么代码可用,而且大多数程序员仍然没有通过沟通他们已经做过了什么,或者一直在询问现存什么代码可用。解决这个的方法是有一个可用的知识库。
理想的情况是,程序员可以到一个WEB页,浏览或者查询打包的知识库列表,找到他们所要的。建立一个程序员可以自动维护的知识库系统,是一个很不错的做法。如果有一个专门的管理员来负责维护这个知识库,那当然更好。
另一种方法是自动的从代码中产生知识库的做法。把通用的类、方法和标头(subsystem headers)作为手册或者是知识库的一个条目。 feedom.net
