学习良好的编程习惯能够提高代码质量和效率。像其他语言一样,开发人员可以用 PHP 编写出各种质量级别的代码。根据具体的情况,一般的开发人员往往比优秀的开发人员的效率低 10%~20%。优秀的开发人员的效率更高,因为他们拥有丰富的经验和良好的编程习惯。不良的编程习惯将会影响到效率。本文通过展示一些良好的编程习惯,帮助您成为更优秀的程序员。
3. 为代码添加注释
要为代码添加良好的注释有时似乎和编写代码一样难。要了解应该为哪些内容添加注释并不容易,因为我们常常倾向于注释代码当前做的事情。注释代码的目的是不错的主意。在函数的不是很明显的头部代码块中,告诉读者方法的输入和输出,以及方法的最初目标。
注释代码当前做什么是很常见的,但这是不必要的。如果代码很复杂,不得不注释它当前在做什么,这将暗示您应该重写代码,让它更容易理解。学会使用良好的名称和更短的方法,在不提供注释说明其用途的情况下提高代码的可读性。
不良习惯:函数注释过多或不足
清单 5 中的注释仅告诉读者代码在做什么 — 它正在通过一个循环进行迭代或添加一个数字。但它忽略了它为什么 做当前的工作。这使维护该代码的人员不知道是否可以安全地更改代码(不引入新缺陷)。
清单 5. 不良习惯:函数注释过多或不足
- <?php
- class ResultMessage
- {
- private $severity;
- private $message;
- public function __construct($sev, $msg)
- {
- $this->severity = $sev;
- $this->message = $msg;
- }
- public function getSeverity()
- {
- return $this->severity;
- }
- public function setSeverity($severity)
- {
- $this->severity = $severity;
- }
- public function getMessage()
- {
- return $this->message;
- }
- public function setMessage($msg)
- {
- $this->message = $msg;
- }
- }
- function cntMsgs($messages)
- {
- $n = 0;
- /* iterate through the messages... */
- foreach($messages as $m) {
- if ($m->getSeverity() == 'Error') {
- $n++; // add one to the result;
- }
- }
- return $n;}
- $messages = array(new ResultMessage("Error", "This is an error!"),
- new ResultMessage("Warning", "This is a warning!"),
- new ResultMessage("Error", "This is another error!"));
- $errs = cntMsgs($messages);
- echo("There are " . $errs . " errors in the result.\n");
- ?>
复制代码良好习惯:带注释的函数和类
清单 6 中的注释告诉读者类和方法的目的。该注释解释了为什么代码在做当前的工作,这对未来维护代码十分有用。可能需要根据条件变更而修改代码,如果能够轻松了解代码的目的,则修改起来很容易。
清单 6. 良好习惯:带注释的函数和类
- <?php
- /**
- *The ResultMessage class holds a message that can be returned
- * as a result of a process. The message has a severity and
- * message.
- *
- * @author nagood
- *
- */
- class ResultMessage
- {
- private $severity;
- private $message;
- /**
- * Constructor for the ResultMessage that allows you to assign
- * severity and message.
- * @param $sev See {@link getSeverity()}
- * @param $msg
- * @return unknown_type
- */
- public function __construct($sev, $msg)
- {
- $this->severity = $sev;
- $this->message = $msg;
- }
- /**
- * Returns the severity of the message. Should be one
- * "Information", "Warning", or "Error".
- * @return string Message severity
- */
- public function getSeverity()
- {
- return $this->severity;
- }
- /**
- * Sets the severity of the message
- * @param $severity
- * @return void
- */
- public function setSeverity($severity)
- {
- $this->severity = $severity;
- }
- public function getMessage()
- {
- return $this->message;
- }
- public function setMessage($msg)
- {
- $this->message = $msg;
- }
- }
- /*
- * Counts the messages with the given severity in the array
- * of messages.
- * @param $messages An array of ResultMessage
- * @return int Count of messages with a severity of "Error"
- */
- function countErrors($messages)
- {
- $matchingCount = 0;
- foreach($messages as $m) {
- if ($m->getSeverity() == "Error") {
- $matchingCount++;
- }
- }
- return $matchingCount;
- }
- $messages = array(new ResultMessage("Error", "This is an error!"),
- new ResultMessage("Warning", "This is a warning!"),
- new ResultMessage("Error", "This is another error!"));
- $errs = countErrors($messages);
- echo("There are " . $errs . " errors in the result.\n");
- ?>
#p#
4. 处理错误
根据大众的经验,如果要编写健壮的应用程序,错误处理要遵循 80/20 规则:80% 的代码用于处理异常和验证,20% 的代码用于完成实际工作。在编写程序的基本逻辑(happy-path)代码时经常这样做。这意味着编写适用于基本条件的代码,即所有的数据都是可用的,所有的条件符合预期。这样的代码在应用程序的生命周期中可能很脆弱。另一个极端是,甚至需要花大量时间为从未遇到过的条件编写代码。
这一习惯要求您编写足够的错误处理代码,而不是编写对付所有错误的代码,以致代码迟迟不能完成。
不良习惯:根本没有错误处理代码
清单 7 中的代码演示了两个不良习惯。***,没有检查输入的参数,即使知道处于某些状态的参数会造成方法出现异常。第二,代码调用一个可能抛出异常的方法,但没有处理该异常。当发生问题时,代码的作者或维护该代码的人员只能猜测问题的根源。
清单 7. 不良习惯:不处理错误条件
- <?php
- // Get the actual name of the
- function convertDayOfWeekToName($day)
- {
- $dayNames = array(
- "Sunday",
- "Monday",
- "Tuesday",
- "Wednesday",
- "Thursday",
- "Friday",
- "Saturday");
- return $dayNames[$day];
- }
- echo("The name of the 0 day is: " . convertDayOfWeekToName(0) . "\n");
- echo("The name of the 10 day is: " . convertDayOfWeekToName(10) . "\n");
- echo("The name of the 'orange' day is: " . convertDayOfWeekToName('orange') . "\n");
- ?>
复制代码良好习惯:处理异常
清单 8 展示了以有意义的方式抛出和处理异常。额外的错误处理不仅使代码更加健壮,它还提高代码的可读性,使代码更容易理解。处理异常的方式很好地说明了原作者在编写方法时的意图。
清单 8. 良好习惯:处理异常
- <?php
- /**
- * This is the exception thrown if the day of the week is invalid.
- * @author nagood
- *
- */
- class InvalidDayOfWeekException extends Exception { }
- class InvalidDayFormatException extends Exception { }
- /**
- * Gets the name of the day given the day in the week. Will
- * return an error if the value supplied is out of range.
- *
- * @param $day
- * @return unknown_type
- */
- function convertDayOfWeekToName($day)
- {
- if (! is_numeric($day)) {
- throw new InvalidDayFormatException('The value \'' . $day . '\' is an ' .
- 'invalid format for a day of week.');
- }
- if (($day > 6) || ($day < 0)) {
- throw new InvalidDayOfWeekException('The day number \'' . $day . '\' is an ' .
- 'invalid day of the week. Expecting 0-6.');
- }
- $dayNames = array(
- "Sunday",
- "Monday",
- "Tuesday",
- "Wednesday",
- "Thursday",
- "Friday",
- "Saturday");
- return $dayNames[$day];
- }
- echo("The name of the 0 day is: " . convertDayOfWeekToName(0) . "\n");
- try {
- echo("The name of the 10 day is: " . convertDayOfWeekToName(10) . "\n");
- } catch (InvalidDayOfWeekException $e) {
- echo ("Encountered error while trying to convert value: " . $e->getMessage() . "\n");
- }
- try {
- echo("The name of the 'orange' day is: " . convertDayOfWeekToName('orange') . "\n");
- } catch (InvalidDayFormatException $e) {
- echo ("Encountered error while trying to convert value: " . $e->getMessage() . "\n");
- }
- ?>
复制代码虽然检查参数是一种确认 — 如果您要求参数处于某种状态,这将对使用方法的人很有帮助 — 但是您应该检查它们并抛出有意义的异常:
- 处理异常要尽量与出现的问题紧密相关。
- 专门处理每个异常。
希望对你有帮助,接下一篇,经验分享:PHP编程的5个良好习惯(三)
【编辑推荐】