经验分享:PHP编程的5个良好习惯(二)

学习良好的编程习惯能够提高代码质量和效率。像其他语言一样,开发人员可以用 PHP 编写出各种质量级别的代码。根据具体的情况,一般的开发人员往往比优秀的开发人员的效率低 10%~20%。优秀的开发人员的效率更高,因为他们拥有丰富的经验和良好的编程习惯。不良的编程习惯将会影响到效率。本文通过展示一些良好的编程习惯,帮助您成为更优秀的程序员。

接上一篇>>

3. 为代码添加注释

要为代码添加良好的注释有时似乎和编写代码一样难。要了解应该为哪些内容添加注释并不容易,因为我们常常倾向于注释代码当前做的事情。注释代码的目的是不错的主意。在函数的不是很明显的头部代码块中,告诉读者方法的输入和输出,以及方法的最初目标。

注释代码当前做什么是很常见的,但这是不必要的。如果代码很复杂,不得不注释它当前在做什么,这将暗示您应该重写代码,让它更容易理解。学会使用良好的名称和更短的方法,在不提供注释说明其用途的情况下提高代码的可读性。

不良习惯:函数注释过多或不足

清单 5 中的注释仅告诉读者代码在做什么 — 它正在通过一个循环进行迭代或添加一个数字。但它忽略了它为什么 做当前的工作。这使维护该代码的人员不知道是否可以安全地更改代码(不引入新缺陷)。

清单 5. 不良习惯:函数注释过多或不足

 
 
 
  1. class ResultMessage  
  2. {  
  3. private $severity;  
  4. private $message;  
  5. public function __construct($sev, $msg)  
  6. {  
  7. $this->severity = $sev;  
  8. $this->message = $msg;  
  9. }  
  10. public function getSeverity()  
  11. {  
  12. return $this->severity;  
  13. }  
  14. public function setSeverity($severity)  
  15. {  
  16. $this->severity = $severity;  
  17. }  
  18. public function getMessage()  
  19. {  
  20. return $this->message;  
  21. }  
  22. public function setMessage($msg)  
  23. {  
  24. $this->message = $msg;  
  25. }  
  26. }  
  27. function cntMsgs($messages)  
  28. {  
  29. $n = 0;  
  30. /* iterate through the messages... */ 
  31. foreach($messages as $m) {  
  32. if ($m->getSeverity() == 'Error') {  
  33. $n++; // add one to the result;  
  34. }  
  35. }  
  36. return $n;}  
  37. $messages = array(new ResultMessage("Error", "This is an error!"),  
  38. new ResultMessage("Warning", "This is a warning!"),  
  39. new ResultMessage("Error", "This is another error!"));  
  40. $errs = cntMsgs($messages);  
  41. echo("There are " . $errs . " errors in the result.\n");  
  42. ?> 

复制代码良好习惯:带注释的函数和类

清单 6 中的注释告诉读者类和方法的目的。该注释解释了为什么代码在做当前的工作,这对未来维护代码十分有用。可能需要根据条件变更而修改代码,如果能够轻松了解代码的目的,则修改起来很容易。

清单 6. 良好习惯:带注释的函数和类

 
 
 
  1. /**  
  2. *The ResultMessage class holds a message that can be returned  
  3. * as a result of a process. The message has a severity and  
  4. * message.  
  5. *  
  6. * @author nagood  
  7. *  
  8. */ 
  9. class ResultMessage  
  10. {  
  11. private $severity;  
  12. private $message;  
  13. /**  
  14. * Constructor for the ResultMessage that allows you to assign  
  15. * severity and message.  
  16. * @param $sev See {@link getSeverity()}  
  17. * @param $msg  
  18. * @return unknown_type  
  19. */ 
  20. public function __construct($sev, $msg)  
  21. {  
  22. $this->severity = $sev;  
  23. $this->message = $msg;  
  24. }  
  25. /**  
  26. * Returns the severity of the message. Should be one  
  27. * "Information", "Warning", or "Error".  
  28. * @return string Message severity  
  29. */ 
  30. public function getSeverity()  
  31. {  
  32. return $this->severity;  
  33. }  
  34. /**  
  35. * Sets the severity of the message  
  36. * @param $severity  
  37. * @return void  
  38. */ 
  39. public function setSeverity($severity)  
  40. {  
  41. $this->severity = $severity;  
  42. }  
  43. public function getMessage()  
  44. {  
  45. return $this->message;  
  46. }  
  47. public function setMessage($msg)  
  48. {  
  49. $this->message = $msg;  
  50. }  
  51. }  
  52. /*  
  53. * Counts the messages with the given severity in the array  
  54. * of messages.  
  55. * @param $messages An array of ResultMessage  
  56. * @return int Count of messages with a severity of "Error"  
  57. */ 
  58. function countErrors($messages)  
  59. {  
  60. $matchingCount = 0;  
  61. foreach($messages as $m) {  
  62. if ($m->getSeverity() == "Error") {  
  63. $matchingCount++;  
  64. }  
  65. }  
  66. return $matchingCount;  
  67. }  
  68. $messages = array(new ResultMessage("Error", "This is an error!"),  
  69. new ResultMessage("Warning", "This is a warning!"),  
  70. new ResultMessage("Error", "This is another error!"));  
  71. $errs = countErrors($messages);  
  72. echo("There are " . $errs . " errors in the result.\n");  
  73. ?> 

#p#

4. 处理错误

根据大众的经验,如果要编写健壮的应用程序,错误处理要遵循 80/20 规则:80% 的代码用于处理异常和验证,20% 的代码用于完成实际工作。在编写程序的基本逻辑(happy-path)代码时经常这样做。这意味着编写适用于基本条件的代码,即所有的数据都是可用的,所有的条件符合预期。这样的代码在应用程序的生命周期中可能很脆弱。另一个极端是,甚至需要花大量时间为从未遇到过的条件编写代码。

这一习惯要求您编写足够的错误处理代码,而不是编写对付所有错误的代码,以致代码迟迟不能完成。

不良习惯:根本没有错误处理代码

清单 7 中的代码演示了两个不良习惯。***,没有检查输入的参数,即使知道处于某些状态的参数会造成方法出现异常。第二,代码调用一个可能抛出异常的方法,但没有处理该异常。当发生问题时,代码的作者或维护该代码的人员只能猜测问题的根源。

清单 7. 不良习惯:不处理错误条件

 
 
 
  1. // Get the actual name of the  
  2. function convertDayOfWeekToName($day)  
  3. {  
  4. $dayNames = array(  
  5. "Sunday",  
  6. "Monday",  
  7. "Tuesday",  
  8. "Wednesday",  
  9. "Thursday",  
  10. "Friday",  
  11. "Saturday");  
  12. return $dayNames[$day];  
  13. }  
  14. echo("The name of the 0 day is: " . convertDayOfWeekToName(0) . "\n");  
  15. echo("The name of the 10 day is: " . convertDayOfWeekToName(10) . "\n");  
  16. echo("The name of the 'orange' day is: " . convertDayOfWeekToName('orange') . "\n");  
  17. ?> 

复制代码良好习惯:处理异常

清单 8 展示了以有意义的方式抛出和处理异常。额外的错误处理不仅使代码更加健壮,它还提高代码的可读性,使代码更容易理解。处理异常的方式很好地说明了原作者在编写方法时的意图。

清单 8. 良好习惯:处理异常

 
 
 
  1. /**  
  2. * This is the exception thrown if the day of the week is invalid.  
  3. * @author nagood  
  4. *  
  5. */ 
  6. class InvalidDayOfWeekException extends Exception { }  
  7. class InvalidDayFormatException extends Exception { }  
  8. /**  
  9. * Gets the name of the day given the day in the week. Will  
  10. * return an error if the value supplied is out of range.  
  11. *  
  12. * @param $day  
  13. * @return unknown_type  
  14. */ 
  15. function convertDayOfWeekToName($day)  
  16. {  
  17. if (! is_numeric($day)) {  
  18. throw new InvalidDayFormatException('The value \'' . $day . '\' is an ' .  
  19. 'invalid format for a day of week.');  
  20. }  
  21. if (($day > 6) || ($day < 0)) {  
  22. throw new InvalidDayOfWeekException('The day number \'' . $day . '\' is an ' .  
  23. 'invalid day of the week. Expecting 0-6.');  
  24. }  
  25. $dayNames = array(  
  26. "Sunday",  
  27. "Monday",  
  28. "Tuesday",  
  29. "Wednesday",  
  30. "Thursday",  
  31. "Friday",  
  32. "Saturday");  
  33. return $dayNames[$day];  
  34. }  
  35. echo("The name of the 0 day is: " . convertDayOfWeekToName(0) . "\n");  
  36. try {  
  37. echo("The name of the 10 day is: " . convertDayOfWeekToName(10) . "\n");  
  38. } catch (InvalidDayOfWeekException $e) {  
  39. echo ("Encountered error while trying to convert value: " . $e->getMessage() . "\n");  
  40. }  
  41. try {  
  42. echo("The name of the 'orange' day is: " . convertDayOfWeekToName('orange') . "\n");  
  43. } catch (InvalidDayFormatException $e) {  
  44. echo ("Encountered error while trying to convert value: " . $e->getMessage() . "\n");  
  45. }  
  46. ?> 

复制代码虽然检查参数是一种确认 — 如果您要求参数处于某种状态,这将对使用方法的人很有帮助 — 但是您应该检查它们并抛出有意义的异常:

  • 处理异常要尽量与出现的问题紧密相关。
  • 专门处理每个异常。

希望对你有帮助,接下一篇,经验分享:PHP编程的5个良好习惯(三)

【编辑推荐】

  1. PHP新手 详细介绍PHP代码规范
  2. PHP中IIS7实现基本身份验证的方法
  3. 分享PHP网站建设的流程与步骤
  4. PHP新手 学习基本语法
  5. PHP新手 学习变量和常量

文章名称:经验分享:PHP编程的5个良好习惯(二)
网页URL:http://www.shufengxianlan.com/qtweb/news30/388180.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联