PHP プログラミングの 5 つの良い習慣
優秀なプログラマーと優秀な人材の違いは何なのかと尋ねる人もいますが、おそらく 10 ~ 20 種類あります。ダニエルはプログラミングの習慣があり、豊富な経験があるため、非常に効率的です。コードに悪いプログラミング習慣が現れると、コードの効率が低下します。この記事では、より優れたプログラマーになれるいくつかの良いプログラミング習慣について説明します。
これらの習慣により、コードを効率的に実行しながら保守性を向上させることができます。コードを作成するとき、ほとんどの時間はメンテナンスに費やされる可能性があります。プログラムのメンテナンスには非常に費用がかかります。モジュール設計などの適切なプログラミング習慣を身につけると、コードがより読みやすくなり、保守が容易になります。
コードの問題は、悪いプログラミング習慣を伴うことが多く、後者はコードの修正を困難にし、新たな欠陥が現れる可能性があります。これらの落とし穴を避けるのに役立つ 5 つの良いプログラミング習慣を次に示します。
次の章では、これらの習慣について説明します。
適切な名前を付けることは、コードを理解して理解するのを容易にするため、適切な名前を付けることが最も重要なプログラミング習慣です。コードの読みやすさによって、コードの保守性が決まります。コードにコメントを書かなくても、可読であれば修正が容易になります。コードを本のようなものにするために、演習の最初から適切な名前を使用する必要があります。
例 1 には短すぎる変数名が含まれています。このように記述されたコードを理解するのは非常に難しく、関数名はこのメソッドが何を行うのかを明確に説明していません。関数名は関数の機能を示すものであり、他の目的で使用すると誤解を招く恐れがあります。
<?<font color="#335533">php</font><br/><br/>function getNBDay($d)<br/>{<br/> switch($d) {<br/> case 5:<br/> case 6:<br/> case 7:<br/> return 1;<br/> default:<br/> return ($d + 1);<br/> }<br/>}<br/><br/>$day = 5;<br/><br/>$nextDay = getNBDay($day);<br/><br/>echo ("Next day is: " . $nextDay . "\n");<br/><br/>?><br/> ログイン後にコピー |
例 2 は、適切な命名方法を使用したコードを示しています。関数の機能をより適切に反映するために、関数の名前が変更されました。変数の名前もわかりやすいように変更されます。ループ内の 1 つの $i だけが依然として短い変数名を使用しています。同意しない人もいますが、ループ内では短い変数名を使用できます。変数名は明らかにポインタとして機能するため、さらに良いことです。
<?<font color="#335533">php</font><br/><br/>define ('MONDAY', 1);<br/>define ('TUESDAY', 2);<br/>define ('WEDNESDAY', 3);<br/>define ('THURSDAY', 4);<br/>define ('FRIDAY', 5);<br/>define ('SATURDAY', 6);<br/>define ('SUNDAY', 7);<br/><br/>/*<br/> *<br/> * @param $dayOfWeek<br/> * @return int Day of week, with 1 being Monday and so on.<br/> */<br/>function findNextBusinessDay($dayOfWeek)<br/>{<br/> $nextBusinessDay = $dayOfWeek;<br/><br/> switch($dayOfWeek) {<br/> case FRIDAY:<br/> case SATURDAY:<br/> case SUNDAY:<br/> $nextBusinessDay = MONDAY;<br/> break;<br/> default:<br/> $nextBusinessDay += 1;<br/> break;<br/> }<br/><br/> return $nextBusinessDay;<br/>}<br/><br/>$day = FRIDAY;<br/><br/>$nextBusDay = findNextBusinessDay($day);<br/><br/>echo ("Next day is:" . $nextBusDay . "\n");<br/><br/>?><br/> ログイン後にコピー |
関数内の長い条件を分離し、条件を説明しやすくするために関数に名前を付けることをお勧めします。 (コーン: この文の意味は何ですか? 5555) この手法を使用すると、コードが読みやすく拡張しやすくなり、抽象的に再利用できるようになります。これにより、条件が変わった場合でも関数を更新することが容易になります。メソッドにはよく知られた名前が付けられているため、コードが本来の意味を失ったり、理解しにくくなったりすることはありません。
コードの使用量を減らします
コードを書いて問題を解決するのは簡単です。進行中の問題を解決するとき、何度も書いて書き続けると、その方法はどんどん長くなっていきます。戻ってより少ないコードでリファクタリングを行う限り、時間が経っても問題はありません。
リファクタリングは良いアイデアですが、最初はより短く簡潔なコードを書く習慣を身につける必要があります。 1 つのウィンドウで表示できる (ページをめくる必要がない) 短い機能の方が理解しやすいです。 関数にウィンドウがある場合、コード全体を上から下まで素早く見ることができないため、理解するのが難しくなります。
メソッドを構築するときは、メソッドに 1 つのことだけを実行させる習慣も身に付ける必要があります。コードを記述するときは、次の要素に常に注意を払う必要があります。まず、1 つのことだけを行う関数は再利用が簡単です。第二に、このような機能テストはより便利です。第三に、このような関数は読みやすく理解しやすく、できるだけ単純にすることで必要に応じて変更できます。
悪い習慣: 関数が長すぎます (多くの場合)
例 3 は、長すぎる関数の実行です。何が起こるかわかりません。あまりにも多くのことを行うので、統合はできません。理解するのが難しくなり、デバッグやテストも難しくなります。ファイルを反復処理してリストを作成し、オブジェクトに値を割り当て、いくつかの計算を行い、...耕したり、水を与えたり、さらにはそれ以上のことを行います。 (^_^)
例 3. 悪い習慣: 関数が長すぎます
<?<font color="#335533">php</font><br/><br/>function writeRssFeed($user)<br/>{<br/> // Get the DB connection information<br/><br/><br/> // look up the user's preferences...<br/> $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')<br/> OR die(mysql_error());<br/><br/> // Query<br/> $perfsQuery = sprintf("SELECT max_stories FROM user_perfs WHERE user= '%s'",<br/> mysql_real_escape_string($user));<br/><br/> $result = mysql_query($query, $link);<br/><br/> $max_stories = 25; // default it to 25;<br/><br/> if ($row = mysql_fetch_assoc($result)) {<br/> $max_stories = $row['max_stories'];<br/> }<br/><br/> // go get my data<br/> $perfsQuery = sprintf("SELECT * FROM stories WHERE post_date = '%s'",<br/> mysql_real_escape_string());<br/><br/> $result = mysql_query($query, $link); <br/><br/><br/> $feed = "<rss version=\"2.0\">" .<br/> "<channel>" .<br/> "<title>My Great Feed</title>" .<br/> "<link>http://www.example.com/feed.xml</link>" .<br/> "<description>The best feed in the world</description>" .<br/> "<language>en-us</language>" .<br/> "<pubDate>Tue, 20 Oct 2008 10:00:00 GMT</pubDate>" .<br/> "<lastBuildDate>Tue, 20 Oct 2008 10:00:00 GMT</lastBuildDate>" .<br/> "<docs>http://www.example.com/rss</docs>" .<br/> "<generator>MyFeed Generator</generator>" .<br/> "<managingEditor>editor@example.com</managingEditor>" .<br/> "<webMaster>webmaster@example.com</webMaster>" .<br/> "<ttl>5</ttl>";<br/><br/> // build the feed...<br/> while ($row = mysql_fetch_assoc($result)) {<br/> $title = $row['title'];<br/> $link = $row['link'];<br/> $description = $row['description'];<br/> $date = $row['date'];<br/> $guid = $row['guid'];<br/><br/> $feed .= "<item>";<br/> $feed .= "<title>" . $title . "</title>";<br/> $feed .= "<link>" . $link . "</link>";<br/> $feed .= "<description> " . $description . "</description>";<br/> $feed .= "<pubDate>" . $date . "</pubDate>";<br/> $feed .= "<guid>" . $guid . "</guid>";<br/> $feed .= "</item>";<br/> }<br/><br/> $feed .= "</rss";<br/><br/> // write the feed out to the server...<br/> echo($feed);<br/><br/>}<br/><br/>?><br/> ログイン後にコピー |
要是你再加更多东西到这个函数里,它会很快变得难以维护。
好习惯:可管理,集成化的函数
<?<font color="#335533">php</font><br/><br/>function createRssHeader()<br/>{<br/> return "<rss version=\"2.0\">" .<br/> "<channel>" .<br/> "<title>My Great Feed</title>" .<br/> "<link>http://www.example.com/feed.xml</link>" .<br/> "<description>The best feed in the world</description>" .<br/> "<language>en-us</language>" .<br/> "<pubDate>Tue, 20 Oct 2008 10:00:00 GMT</pubDate>" .<br/> "<lastBuildDate>Tue, 20 Oct 2008 10:00:00 GMT</lastBuildDate>" .<br/> "<docs>http://www.example.com/rss</docs>" .<br/> "<generator>MyFeed Generator</generator>" .<br/> "<managingEditor>editor@example.com</managingEditor>" .<br/> "<webMaster>webmaster@example.com</webMaster>" .<br/> "<ttl>5</ttl>";<br/>}<br/><br/>function createRssFooter()<br/>{<br/> return "</channel></rss>";<br/>}<br/><br/>function createRssItem($title, $link, $desc, $date, $guid) <br/>{<br/> $item .= "<item>";<br/> $item .= "<title>" . $title . "</title>";<br/> $item .= "<link>" . $link . "</link>";<br/> $item .= "<description> " . $description . "</description>";<br/> $item .= "<pubDate>" . $date . "</pubDate>";<br/> $item .= "<guid>" . $guid . "</guid>";<br/> $item .= "</item>";<br/> return $item;<br/>}<br/><br/>function getUserMaxStories($db_link, $default)<br/>{<br/> $perfsQuery = sprintf("SELECT max_stories FROM user_perfs WHERE user= '%s'",<br/> mysql_real_escape_string($user));<br/><br/> $result = mysql_query($perfsQuery, $db_link);<br/><br/> $max_stories = $default;<br/><br/> if ($row = mysql_fetch_assoc($result)) {<br/> $max_stories = $row['max_stories'];<br/> } <br/><br/> return $max_stories;<br/>}<br/><br/>function writeRssFeed($user)<br/>{<br/> // Get the DB connection information<br/> $settings = parse_ini_file("rss_server.ini");<br/><br/> // look up the user's preferences...<br/> $link = mysql_connect($settings['db_host'], $settings['user'], <br/> $settings['password']) OR die(mysql_error());<br/><br/> $max_stories = getUserMaxStories($link, 25);<br/><br/> // go get my data<br/> $newsQuery = sprintf("SELECT * FROM stories WHERE post_date = '%s'",<br/> mysql_real_escape_string(time()));<br/><br/> $result = mysql_query($newsQuery, $link); <br/><br/> $feed = createRssHeader();<br/><br/> $i = 0;<br/> // build the feed...<br/> while ($row = mysql_fetch_assoc($result)) {<br/> if ($i < $max_stories) {<br/> $title = $row['title'];<br/> $link = $row['link'];<br/> $description = $row['description'];<br/> $date = $row['date'];<br/> $guid = $row['guid'];<br/><br/> $feed .= createRssItem($title, $link, $description, $date, $guid);<br/><br/> $i++;<br/> } else { <br/> break;<br/> }<br/> }<br/><br/> mysql_close($link);<br/><br/> $feed .= createRssFooter();<br/><br/> // write the feed out to the server...<br/> echo($feed);<br/>}<br/>?><br/> ログイン後にコピー |
把长函数分割会导致效率降低,所以要注意,这个好习惯不要使用过度。这样做可能也会引起阅读性差,跟原来人家是一个整体时没什么区别。
注释代码
注释你的代码有时就像你刚着手写代码一样困难。明确注释内容很棘手,因为他要写出代码要做什么。注释变量是一个好主意。在函数头部注释可能不太明显时,就可以告诉阅读者函数要什么参数,有什么返回以及主要的意图。
通常大家会注释代码是做什么的,但这并不必要。如果代码让人困惑以至于你不得不写注释说它是做什么的,这就提示你应该重写它,使它更好懂。命名良好、更加短小、组织合理的代码习惯会让你的代码用不着注释就拥有很高的可读性。
坏习惯:压根没有或者叽叽歪歪的函数注释 (^_^)
例5的注释只给出了代码在做什么——它的通过循环的遍历、加了个数。但是丢了为什么这么做和要做什么。 这会让别人难以不影响原代码的情形下安全修改的做出修改。
例5 :压根没胡或者叽叽歪歪的函数注释
<?<font color="#335533">php</font><br/><br/>class ResultMessage <br/>{<br/> private $severity;<br/> private $message;<br/><br/> public function __construct($sev, $msg) <br/> {<br/> $this->severity = $sev;<br/> $this->message = $msg;<br/> }<br/><br/> public function getSeverity()<br/> {<br/> return $this->severity;<br/> }<br/><br/> public function setSeverity($severity)<br/> {<br/> $this->severity = $severity;<br/> }<br/><br/> public function getMessage()<br/> {<br/> return $this->message;<br/> }<br/><br/> public function setMessage($msg)<br/> {<br/> $this->message = $msg;<br/> }<br/>}<br/><br/>function cntMsgs($messages)<br/>{<br/> $n = 0;<br/> /* iterate through the messages... */<br/> foreach($messages as $m) {<br/> if ($m->getSeverity() == 'Error') {<br/> $n++; // add one to the result;<br/> }<br/> }<br/> return $n;<br/>}<br/><br/>$messages = array(new ResultMessage("Error", "This is an error!"),<br/> new ResultMessage("Warning", "This is a warning!"),<br/> new ResultMessage("Error", "This is another error!"));<br/><br/>$errs = cntMsgs($messages);<br/><br/>echo("There are " . $errs . " errors in the result.\n");<br/><br/>?><br/> ログイン後にコピー |
好习惯: 注释函数和类
例6里的注释标明了类和函数的意图。注释表明方法做了什么和为什么做,这会对将来了解代码的意图很有帮助。环境的变化会需要你进行代码修改,这就会让很容易的知道开始时你代码是做什么的。
例6.好习惯:注释函数和类
<?<font color="#335533">php</font><br/>/**<br/> * The ResultMessage class holds a message that can be returned<br/> * as a result of a process. The message has a severity and<br/> * message.<br/> * <br/> * @author nagood<br/> *<br/> */<br/>class ResultMessage <br/>{<br/> private $severity;<br/> private $message;<br/><br/> /**<br/> * Constructor for the ResultMessage that allows you to assign<br/> * severity and message.<br/> * @param $sev See {@link getSeverity()}<br/> * @param $msg<br/> * @return unknown_type<br/> */<br/> public function __construct($sev, $msg) <br/> {<br/> $this->severity = $sev;<br/> $this->message = $msg;<br/> }<br/><br/> /**<br/> * Returns the severity of the message. Should be one<br/> * "Information", "Warning", or "Error".<br/> * @return string Message severity<br/> */<br/> public function getSeverity()<br/> {<br/> return $this->severity;<br/> }<br/><br/> /**<br/> * Sets the severity of the message<br/> * @param $severity<br/> * @return void<br/> */<br/> public function setSeverity($severity)<br/> {<br/> $this->severity = $severity;<br/> }<br/><br/> public function getMessage()<br/> {<br/> return $this->message;<br/> }<br/><br/> public function setMessage($msg)<br/> {<br/> $this->message = $msg;<br/> }<br/>}<br/><br/><br/>/*<br/> * Counts the messages with the given severity in the array<br/> * of messages.<br/> * <br/> * @param $messages An array of ResultMessage<br/> * @return int Count of messages with a severity of "Error"<br/> */<br/>function countErrors($messages)<br/>{<br/> $matchingCount = 0;<br/> foreach($messages as $m) {<br/> if ($m->getSeverity() == "Error") {<br/> $matchingCount++;<br/> }<br/> }<br/> return $matchingCount;<br/>}<br/><br/>$messages = array(new ResultMessage("Error", "This is an error!"),<br/> new ResultMessage("Warning", "This is a warning!"),<br/> new ResultMessage("Error", "This is another error!"));<br/><br/>$errs = countErrors($messages);<br/><br/>echo("There are " . $errs . " errors in the result.\n");<br/><br/>?><br/> ログイン後にコピー |
异常处理
写健壮应用时经常会提到的异常处理,一般遵循着80/20原则: 80%的代码用于处理异常或者验证,20%的代码没什么实际的用途。原始的代码通常都是在乐观的环境下编写的。这意味着代码可以在数据正常、一切理解的基础环境中工作的很好。但是这种代码在其生命周期内是脆弱的。在极端的情形中,你得花更多的时间来未很可能永远不会发生的状况编写相应代码。
这个习惯就是要你处理全部的出错情况,而且如果要是不这么做,你的代码永远也完不成。
坏习惯:不处理任何异常
<?<font color="#335533">php</font><br/><br/>// Get the actual name of the <br/>function convertDayOfWeekToName($day)<br/>{<br/> $dayNames = array(<br/> "Sunday",<br/> "Monday",<br/> "Tuesday",<br/> "Wednesday",<br/> "Thursday",<br/> "Friday",<br/> "Saturday");<br/> return $dayNames[$day];<br/>}<br/><br/>echo("The name of the 0 day is: " . convertDayOfWeekToName(0) . "\n");<br/>echo("The name of the 10 day is: " . convertDayOfWeekToName(10) . "\n");<br/>echo("The name of the 'orange' day is: " . convertDayOfWeekToName('orange') . "\n");<br/><br/>?><br/> ログイン後にコピー |
好习惯: 防守型编程
例8表明处理并抛出异常是一件很有意义的事情。不只是额外的异常处理可以让代码健壮,但是这有助于提高代码的可读性。这种异常处理为原作者查看何时编写提供了一个很好的说明。
例8.好习惯:防守型编程
<?<font color="#335533">php</font><br/><br/>/**<br/> * This is the exception thrown if the day of the week is invalid.<br/> * @author nagood<br/> *<br/> */<br/>class InvalidDayOfWeekException extends Exception { }<br/><br/>class InvalidDayFormatException extends Exception { }<br/><br/>/**<br/> * Gets the name of the day given the day in the week. Will<br/> * return an error if the value supplied is out of range.<br/> * <br/> * @param $day<br/> * @return unknown_type<br/> */<br/>function convertDayOfWeekToName($day)<br/>{<br/> if (! is_numeric($day)) {<br/> throw new InvalidDayFormatException('The value \'' . $day . '\' is an ' .<br/> 'invalid format for a day of week.');<br/> }<br/><br/> if (($day > 6) ($day < 0)) {<br/> throw new InvalidDayOfWeekException('The day number \'' . $day . '\' is an ' .<br/> 'invalid day of the week. Expecting 0-6.');<br/> }<br/><br/> $dayNames = array(<br/> "Sunday",<br/> "Monday",<br/> "Tuesday",<br/> "Wednesday",<br/> "Thursday",<br/> "Friday",<br/> "Saturday");<br/> return $dayNames[$day];<br/>}<br/><br/>echo("The name of the 0 day is: " . convertDayOfWeekToName(0) . "\n");<br/><br/>try {<br/> echo("The name of the 10 day is: " . convertDayOfWeekToName(10) . "\n");<br/>} catch (InvalidDayOfWeekException $e) {<br/> echo ("Encountered error while trying to convert value: " . $e->getMessage() . "\n");<br/>}<br/><br/>try {<br/> echo("The name of the 'orange' day is: " . convertDayOfWeekToName('orange') . "\n");<br/>} catch (InvalidDayFormatException $e) {<br/> echo ("Encountered error while trying to convert value: " . $e->getMessage() . "\n");<br/>}<br/><br/>?><br/> ログイン後にコピー |
通过检验参数的全法性——这有助于他人使用你需要正确参数的函数——你应该检验它们并抛出异常的大意:
永远,永远不要复制粘贴
把代码复制到你的编辑里的能力是一把双刃剑。一方面,它避免了你参照一些示例后重新再打一遍时出现的错误;另一方面,它让书写相似代码太简单了。
你要避免在你的程序应用中复制粘贴代码。当你发现自己在这样做时,停下来并问自己可不可以把复制的部分重复使用。把相同的代码放在同一个地方可以让你以后修改时更加的轻松,因为要改变都在一起。
坏习惯:相似的代码块
例9表现了除了一些值所在位置之外很相近的几个方法。有些工具可以检验你的代码中复制粘贴的部分(去看看Resources)。
例9.相似的代码块
<?<font color="#335533">php</font><br/>/**<br/> * Counts the number of messages found in the array of <br/> * ResultMessage with the getSeverity() value of "Error"<br/> * <br/> * @param $messages An array of ResultMessage<br/> * @return unknown_type<br/> */<br/>function countErrors($messages)<br/>{<br/> $matchingCount = 0;<br/> foreach($messages as $m) {<br/> if ($m->getSeverity() == "Error") {<br/> $matchingCount++;<br/> }<br/> }<br/> return $matchingCount;<br/>}<br/><br/>/**<br/> * Counts the number of messages found in the array of <br/> * ResultMessage with the getSeverity() value of "Warning"<br/> * <br/> * @param $messages An array of ResultMessage<br/> * @return unknown_type<br/> */<br/>function countWarnings($messages)<br/>{<br/> $matchingCount = 0;<br/> foreach($messages as $m) {<br/> if ($m->getSeverity() == "Warning") {<br/> $matchingCount++;<br/> }<br/> }<br/> return $matchingCount;<br/>}<br/><br/>/**<br/> * Counts the number of messages found in the array of <br/> * ResultMessage with the getSeverity() value of "Information"<br/> * <br/> * @param $messages An array of ResultMessage<br/> * @return unknown_type<br/> */<br/>function countInformation($messages)<br/>{<br/> $matchingCount = 0;<br/> foreach($messages as $m) {<br/> if ($m->getSeverity() == "Information") {<br/> $matchingCount++;<br/> }<br/> }<br/> return $matchingCount;<br/>}<br/><br/>$messages = array(new ResultMessage("Error", "This is an error!"),<br/> new ResultMessage("Warning", "This is a warning!"),<br/> new ResultMessage("Error", "This is another error!"));<br/><br/>$errs = countErrors($messages);<br/><br/>echo("There are " . $errs . " errors in the result.\n");<br/>?><br/> ログイン後にコピー |
好习惯:可复用的带参函数
例10展示了把要复制的代码入到一个方法中的代码修改。另一个修改的方法则把工作代理给了一个新的方法 。编写一个通用的方法要花一些时间来设计,当然这会让你停下来思考,而不是用复制粘贴的组合快捷键。但是这样做会在以后修改时省回第一次多花的时间。
例10.好习惯 :可利用的带参函数
<?<font color="#335533">php</font><br/> /*<br/> * Counts the messages with the given severity in the array<br/> * of messages.<br/> * <br/> * @param $messages An array of ResultMessage<br/> * @return int Count of messages matching $withSeverity<br/> */<br/> function countMessages($messages, $withSeverity)<br/> {<br/> $matchingCount = 0;<br/> foreach($messages as $m) {<br/> if ($m->getSeverity() == $withSeverity) {<br/> $matchingCount++;<br/> }<br/> }<br/> return $matchingCount;<br/> }<br/><br/> /**<br/> * Counts the number of messages found in the array of <br/> * ResultMessage with the getSeverity() value of "Error"<br/> * <br/> * @param $messages An array of ResultMessage<br/> * @return unknown_type<br/> */<br/> function countErrors($messages)<br/> {<br/> return countMessages($messages, "Errors");<br/> }<br/><br/> /**<br/> * Counts the number of messages found in the array of <br/> * ResultMessage with the getSeverity() value of "Warning"<br/> * <br/> * @param $messages An array of ResultMessage<br/> * @return unknown_type<br/> */<br/> function countWarnings($messages)<br/> {<br/> return countMessages($messages, "Warning");<br/> }<br/><br/> /**<br/> * Counts the number of messages found in the array of <br/> * ResultMessage with the getSeverity() value of "Warning"<br/> * <br/> * @param $messages An array of ResultMessage<br/> * @return unknown_type<br/> */<br/> function countInformation($messages)<br/> {<br/> return countMessages($messages, "Information");<br/> }<br/><br/> $messages = array(new ResultMessage("Error", "This is an error!"),<br/> new ResultMessage("Warning", "This is a warning!"),<br/> new ResultMessage("Error", "This is another error!"));<br/><br/> $errs = countErrors($messages);<br/><br/> echo("There are " . $errs . " errors in the result.\n");<br/><br/>?><br/> ログイン後にコピー |
结论
如果当你开发PHP的时候养成了本文中提到的好习惯,你写的代码将会好读、好懂、好维护。编写可维护代码的方式将让你的代码可以高度排错,并告别低级错误。
使用良好命名并用短代码块来组强你的代码会让你的代码简单明了。注明你代码的目的会让它的主旨明确易于理解。异常处理让你的代码健壮。最后,摒弃复制粘贴的恶习让你的代码整洁。
-----------------------------------------------------
玉米寄语:最后的这个复制粘贴的建议让我一身冷汗,想想其实有很多代码都是重复的工作,有时只是为了“快”,而把相似的代码又“复制”了一遍,虽然我没有使用ctrl+c\v 但是也是写了很多类似的代码,看来,review的事儿可以在世界和平的事儿之前考虑了。