”。•每行程序一般少于80字符,超出部分,分成多行书写。•每行只写一条语句,不允许把多个短语句写在一行中。•应为文件和函数添加注释。•应及时删除废除的注释代码。•变量、函数的命名应规范。3. 编辑器设定3.1. 缩进所有的缩进使用空格取代Tab制表符。”。4.2. 相对独立的程序块之间、变量说明之后必须加空行示例:如下例子不符合规范复制代码 代码如下:if (!$valid_ni()){ ... // program code}$repssn_ind = $ssn_data['index']->repssn_index;$repssn_ni = $ssn_data['index']->ni;应如下书写:if (!valid_ni(){ ... // program code}$repssn_ind = $ssn_data['index]->repssn_index;$repssn_ni = $ssn_data[index]->ni; 4.3. 较长的语句要分成多行书写一行程序需小于80字符较长的语句要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首示例:复制代码 代码如下:$perm_count_msg->len = NO7_TO_STAT_PERM_COUNT_LEN + STAT_SIZE_PER_FRAM * strlen( $len );$act_task_table[$frame_id * STAT_TASK_CHECK_NUMBER + $index]->occupied = $stat_poi[index]->occupied;$act_task_table[taskno]->duration_true_or_false = sys_get_sccp_statistic_state( $stat_item );if (($taskno && (n7stat_stat_item_valid ($stat_item))){ ... // program code}for ($i = 0, $j = 0; ($i word_length) && ($j word_length); $i++, $j++){ ... // program code} 4.4. 一行只写一条语句不允许把多个短语句写在一行中,即一行只写一条语句。示例:如下例子不符合规范$rect->length = 0; $rect->width = 0;应如下书写:$rect->length = 0;$rect->width = 0;4.5. 始终包含大括号这是因为懒于多敲两个字符而给代码清晰带来问题的又一个情形。示例:如下例子不符合规范复制代码 代码如下:if ($condition) do_stuff();if ($condition) do_stuff(); while ($condition) do_stuff(); for ($i = 0; $i do_stuff($i);应如下书写复制代码 代码如下:if (condition){ do_stuff();}while ($condition){ do_stuff();}for ($i = 0; $i do_stuff();} 4.6. switch写法示例:如下例子符合规范复制代码 代码如下:switch (){case ‘1': ..program break;case ‘2': ..program break;}4.7. 大括号放在哪儿程序块的分界符(大括号‘{'和‘}')应各独占一行并且位于同一列,同时与引用它们的语句左对齐。而在函数体的开始、类的定义、以及if、for、do、while、switch、case语句中的右大括号应放在行尾, 左大括号应与右大括号所在行的行首处在同一列示例:如下例子不符合规范复制代码 代码如下:for (...){ ... // program code}if (...){ ... // program code}function example_fun(){ ... // program code}应如下书写:for (...){ ... // program code}if (...){ ... // program code}function example_fun(){ ... // program code} 4.8. 符号之间使用空格采用这种松散方式编写代码的目的是使代码更加清晰。由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格。在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给操作符留空格时不要连续留两个以上空格。示例:如下例子不符合规范复制代码 代码如下:$i=0;if($iif ( ($i 8) ) ...for($i=0; $i$i=($j do_stuff( $i, "foo", $b ); 应如下书写:复制代码 代码如下:$i = 0;if ($i if (($i 8)) ...for ($i = 0; $i $i = ($j do_stuff($i, "foo", $b); 4.9. 字符串连接符当使用字符串连接符时必须在句点(.)两侧加上空格。示例:如下例子不符合规范复制代码 代码如下:$str = ‘';$str = ‘';应如下书写:$str = ‘'; 4.10. 空行的使用谁也不愿意看到挤在一堆的无序的代码。我们在写代码的时候总是会利用一些空行来增加代码可读性。合理的利用空格来区分代码段会使代码的逻辑思路更加明确。我们强行规定的空行有以下两种情况:••?> 之前必须有且只有1个空行•两个函数之间必须有1个空行。•return、die、exit之前如果有其他语句的情况下应加上一个空行。在代码中我们不允许在行尾有多余的空格。5. 注释5.1. 文件头部模板/** * ShopEx网上商店 文件中文名称 * 类或者文件的说明,此处可以使用html * * @package * @version $Id$ * @copyright 2003-2008 Shanghai ShopEx Network Tech. Co., Ltd. * @license Commercial * ================================================================= */5.2. 函数头部注释每个函数之前应当有注释,告诉一个程序员使用这个函数所需要知道的事情。一个最小化的注释应包括:每个参数的意义,期望的输入,函数的输出。注释还应当给出在错误条件下(还有具体是什么错误条件)这个函数的行为。(注释应该确保)其他人不必察看这个函数的代码,就可以自信地在自己的代码中调用这个函数。另外,为任何技巧性的,晦涩的或者并非显而易见的代码添加注释,无疑是我们应该做的事情。对文档尤其重要的是你的代码所做的任何假设,或者它正确运转的前提。任何一个开发者应该能够查看应用程序的任意部分,并且在合理的时间内断定(代码的执行中)发生了什么。复制代码 代码如下: /** * some_func * 函数的含义说明 * 这部分可以随意输入html * 因为这是repssn_index;$repssn_ni = $ssn_data[$index]->ni;例2:$repssn_ind = $ssn_data[$index]->repssn_index;$repssn_ni = $ssn_data[$index]->ni;// get replicate sub system index and net indicator应如下书写// get replicate sub system index and net indicator$repssn_ind = $ssn_data[$index]->repssn_index;$repssn_ni = $ssn_data[$index]->ni;5.6. 数据结构声明加注释数据结构声明(数组),必须加以注释。对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方。示例:按如下形式说明复制代码 代码如下:// sccp interface with sccp user primitive message name$sccp_user_primitive = array( ‘N_UNITDATA_IND' => 1, // sccp notify sccp user unit data come ‘N_NOTICE_IND => 2, // sccp notify user the No.7 network can not transmission this message N_UNITDATA_REQ => 3 // sccp user's unit data transmission request ) 5.7. 全局变量注释全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。5.8. 注释缩排注释与所描述内容进行同样的缩排, 可使程序排版整齐,并方便注释的阅读与理解。示例:如下例子不符合规范复制代码 代码如下:function example_fun(){ // code one comments CodeBlock One // code two comments CodeBlock Two}应改为如下布局:复制代码 代码如下:function example_fun(){ //fdgfd CodeBlock One // code two comments CodeBlock Two}5.9. 将注释与其上面的代码用空行隔开示例:如下例子,显得代码过于紧凑。复制代码 代码如下:// code one commentsprogram code one// code two commentsprogram code two应如下书写// code one commentsprogram code one// code two commentsprogram code two 5.10. 连续case注释对于switch语句下的case语句,如果因为特殊情况需要处理完一个case后进入下一个case处理,必须在该case语句处理完、下一个case语句前加上明确的注释。这样比较清楚程序编写者的意图,有效防止无故遗漏break语句。示例:复制代码 代码如下:switch ($i){ case ‘CMD_INIT': echo "i equals 0"; break; case ‘CMD_START: echo "i equals 1";// now jump into case CMD_A case ‘CMB_A': echo "i equals 2"; break;}5.11. 结构体声明代码中代表结构体的数组变量,要提前声明。示例:复制代码 代码如下:function example_fun(){ $student = array( 'name' => '小明', //名称 'addr' => '详细地址', //地址 'sex' => '男', //性别 'city' => '上海' //城市 )} 5.12. 注释格式注释格式统一,单行注释必须使用“// …… ”,多行使用一对/*…*/示例:如下例子不符合规范。复制代码 代码如下:/* if receive_flag is TRUE *//* if receive_flag is FALSE */if ($receive_flag)应如下书写:复制代码 代码如下:/* if receive_flag is TRUEif receive_flag is FALSE */if ($receive_flag) 5.13. 注释以中文为主注释应考虑程序易读及外观排版的因素,使用的语言若是中、英兼有的,建议多使用中文,除非能用非常流利准确的英文表达。6. 命名规定6.1. 禁止拼音命名法代码中禁止用拼音命名法。6.2. 变量命名变量名应当全部小写,并且词语之间以单个下划线分隔。例如: $current_user 是正确的, 但是 $currentuser 和 $currentUser 就不正确。名称应当是描述性的,并且简明。我们自然不希望使用冗长的句子作为变量名,但是多输入几个字符总好于疑惑于某个变量到底是干什么用的。6.3. 函数命名使用单词间用单下划线分隔的小写名称,允许动宾词组为执行某操作的函数命名。如果是OOP方法,可以只有动词(名词是对象本身)。允许系表函数命名。示例:复制代码 代码如下: function print_record($rec_ind) function input_record() function get_current_color() function is_boy()动词表:add / edit / remove begin / end create / destroyfirst / last get / release get / setincrement / decrement put / getlock / unlock open / closemin / max old / new start / stopnext / previous source / target show / hidesend / receivecut / paste up / down系词表: is has对于私有方法,以_开头。 6.4. 循环计数器允许使用一个单字符变量名的唯一情形是当它作为一个循环计数器的时候。在这种情况下,外层循环的计数器应当始终是 $i。如果有一个循环处于这个循环的内部,它的计数器应当是 $j,进而是 $k,等等。如果循环的计数器是一个已经存在并且名字有意义的变量,本规范并不适用。例如:复制代码 代码如下:for ($i = 0; $i for ($j = 0; $j foo($i, $j); } } 6.5. 函数参数参数遵循和变量名字相同的约定。我们不希望一堆这样的函数:do_stuff($a, $b, $c)。在大部分情况下,我们希望仅仅看看函数的声明,就知道怎样使用它。7. 可读性7.1. 运算符的优先级注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。防止阅读程序时产生误解,防止因默认的优先级与设计思想不符而导致程序出错。示例:下列语句中的表达式复制代码 代码如下:$word = ($high if (($a | $b) && ($a & $c)) (2)if (($a | $b) 如果书写为$high $a | $b && $a & $c$a | $b 由于$high $a | $b && $a & $c = ($a | $b) && ($a & $c),(1)(2)不会出错,但语句不易理解;$a | $b (3)造成了判断条件出错。 7.2. 避免数字,使用常量避免使用不易理解的数字,用有意义的常量来替代。示例:如下的程序可读性差。复制代码 代码如下:if ($trunk[$index]->trunk_state == 0){ $trunk[$index]->trunk_state = 1; ... // program code} 应改为如下形式。复制代码 代码如下:define(TRUNK_IDLE, 0)define(TRUNK_BUSY, 1)if ($trunk[$index]->trunk_state == TRUNK_IDLE){ $trunk[$index]->trunk_state = TRUNK_BUSY; ... // program code} 7.3. 源程序中关系较为紧密的代码应尽可能相邻便于程序阅读和查找。示例:以下代码布局不太合理。复制代码 代码如下:$rect->length = 10;$char_poi = $str;$rect->width = 5;若按如下形式书写,可能更清晰一些。复制代码 代码如下:$rect->length = 10;$rect->width = 5; // 矩形的长与宽关系较密切,放在一起。$char_poi = $str; 8. 函数8.1. 接口函数参数的合法性检查函数参数的合法性检查应由函数的调用者负责,接口函数做必要性合法性检查(不强制)。总结为:以外为主,以内为辅,内部不强制。8.2. 函数规模函数的规模限制在100行以内,不包括注释和空格行。8.3. 一个函数仅完成一件功能8.4. 不要设计多用途面面俱到的函数除调度函数外,多功能集于一身的函数,很可能使函数的理解、测试、维护等变得困难8.5. 多段代码重复同一件事情如果多段代码重复做同一件事情,那么在函数的划分上可能存在问题。若此段代码各语句之间有实质性关联并且是完成同一件功能的,那么可考虑把此段代码构造成一个新的函数。9. 质量保证9.1. 兼容性9.2. 三元运算符三元运算符,在一行代码里只允许使用一级三元运算符只应该用来做简单的事情。它们只适合拿来做赋值用,根本不是用来做函数调用或者任何复杂的事情的。如果使用不当,它们会影响可读性,所以不要沉迷于使用它们来减少打字。示例:不应该使用它们的地方(($i $size)) ? do_stuff($foo) : do_stuff($bar);示例:使用它们的合适地方$min = ($i 9.3. 初始化变量变量使用前应初始化,error_reporting 将加入 E_NOTICE。意味着,变量未初始化将报错。这个问题最容易在检查 HTML 表单传递了什么变量时出现。这些错误可以通过使用内嵌的 isset() 或者empty()函数检查一个变量是否被设置来避免。示例: 老办法if ($forum) ...新办法:if (!empty($forum)) ...if (isset($forum)) …9.4. 引用字符串在 "promote_goods"”normal_goods”> 正确的写法:复制代码 代码如下:promote_goodsnomarl_goods">11.4. 条件修饰符在smarty中可以用eq、neq、gt、lt等来分别表示==、!=、>、当Smarty语句出现在HTML标签内时不允许使用==、!=这类修饰符,如果使用了这类修饰符有可能导致该符号或者其他的HTML相关符号被Dreamweaver自动转义。总之,尽量使用eq、gt等这类条件修饰符,避免直接使用==、>。 09-11 05:18