有些人问,优秀程序员和大牛有什么区别,大概有10到20种吧。因为大牛有很好的编程习惯和丰富的经验,所以他们非常的高效。如果不好的编程习惯出现在你的代码里,你的代码效率就会降低。本文阐述一些好的编程习惯,他们可以让你成为更好的程序员。
这些习惯能让你的代码在高效运行的同时提高可维护性。你写代码的时候,可能大部分时间都浪费在维护上了,程序的维护代价很高。培养良好的编程习惯,如模块化设计,可以让你的代码可读性更好,从而容易维护。
代码中的问题往往伴随着不良的编程习惯,而且后者会导致代码不好修改并可能出现新的缺陷。下面有五个好的编程习惯,将帮你避免这些陷阱:
使用友好的命名方式。 使用更精悍短小的代码。 注释你的代码。 编写异常处理。 永远,永远不要复制粘贴.(玉米:我深深的同意这一点) 下面的章节将解释这些习惯。
良好的命名方式是最重要的编程习惯,因为好的命名会让代码易懂,好懂。代码的可读性决定它的可维护性。即使你在代码没有写注释,如果它可读性好的话,它也修改起来也会简单。你应该在练习开时就使用良好的命名方式,让你的代码像一本书一样。
例1包含一个过短的变量名,写出这样的代码非常不好弄懂,而且函数名也没有清晰的描述出这个方法是做什么的。函数名表示了函数的功能,如果它却是做别的用途的,那就会误导别人。
Listing 1. Bad: Ambiguous or meaningless names
<?php
function getNBDay($d) { switch($d) { case 5: case 6: case 7: return 1; default: return ($d + 1); } }
$day = 5;
$nextDay = getNBDay($day);
echo ("Next day is: " . $nextDay . "\n");
?>
例2则给出了使用良好命名方式的代码。重新命名函数是为了更好的反映它们的功能。变量也重新命名为描述性的。只有一个在循环中的$i还使用短的变量名。尽管有些人不同意,短变量名在循环中是请允许的——甚至更好些,因为它们清晰的起到了指针的功能。
<?php
define ('MONDAY', 1); define ('TUESDAY', 2); define ('WEDNESDAY', 3); define ('THURSDAY', 4); define ('FRIDAY', 5); define ('SATURDAY', 6); define ('SUNDAY', 7);
/* * * @param $dayOfWeek * @return int Day of week, with 1 being Monday and so on. */ function findNextBusinessDay($dayOfWeek) { $nextBusinessDay = $dayOfWeek;
switch($dayOfWeek) { case FRIDAY: case SATURDAY: case SUNDAY: $nextBusinessDay = MONDAY; break; default: $nextBusinessDay += 1; break; }
return $nextBusinessDay; }
$day = FRIDAY;
$nextBusDay = findNextBusinessDay($day);
echo ("Next day is:" . $nextBusDay . "\n");
?>
我鼓励你在函数中分隔长的条件给函数命名,以便于描述这个条件。(玉米:这句话啥意思?5555)这个技巧会让你的代码容易阅读和扩展,因此它可以 被抽象复用。如果条件发生了改变,这样也会很容易更新函数 .由于方法有一个见名知义的名字,化码就不会失去它本来的意思或者变得难以理解。
使用更少的代码
编写代码、解决问题是一种容易的事情。当你解决一个正在发生的问题,编呀编,写呀写,你的方法越来越长。只要你回头使用更少的代码来重构,就是过了很久也没什么问题。
重构是个好主意,但你应该养成第一次就写出更短小精悍代码的习惯。在一个窗口上(玉米:不用翻页)就能看全的短小函数更容易理解。 要是一个函数长出了窗口,就很难理解了,因为你不能快速的从头到脚的浏览整个代码。
当构思一个方法的时候,你还应该养成一个让它们只做一件事情的习惯。以下因素写代码时应常注意。第一,只做一件事情的函数更易于复用。第二,这样的函数测试更方便。第三,这样的函数好读易懂方便改——如果必要的话——让它们尽可能的简单吧。
坏习惯:过长的函数(很多时候)
例三是过长函数的表现。它不知道自己要做什么。它做太多的事情,所以没有集成化。它更难以理解,不好Debug和测试。它遍历文件建立列表,它给对象赋值,它做一些计算,……它耕田,它浇水,甚至做更多事情。(^_^)
例三. 坏习惯:过长函数
<?php
function writeRssFeed($user) { // Get the DB connection information
// look up the user's preferences... $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password') OR die(mysql_error());
// Query $perfsQuery = sprintf("SELECT max_stories FROM user_perfs WHERE user= '%s'", mysql_real_escape_string($user));
$result = mysql_query($query, $link);
$max_stories = 25; // default it to 25;
if ($row = mysql_fetch_assoc($result)) { $max_stories = $row['max_stories']; }
// go get my data $perfsQuery = sprintf("SELECT * FROM stories WHERE post_date = '%s'", mysql_real_escape_string());
$result = mysql_query($query, $link);
$feed = "<rss version=\"2.0\">" . "<channel>" . "<title>My Great Feed</title>" . "<link>http://www.php100.com/feed.xml</link>" . "<description>The best feed in the world</description>" . "<language>en-us</language>" . "<pubDate>Tue, 20 Oct 2008 10:00:00 GMT</pubDate>" . "<lastBuildDate>Tue, 20 Oct 2008 10:00:00 GMT</lastBuildDate>" . "<docs>http://www.php100.com/rss</docs>" . "<generator>MyFeed Generator</generator>" . "<managingEditor>editor@php100.com</managingEditor>" . "<webMaster>webmaster@php100.com</webMaster>" . "<ttl>5</ttl>";
// build the feed... while ($row = mysql_fetch_assoc($result)) { $title = $row['title']; $link = $row['link']; $description = $row['description']; $date = $row['date']; $guid = $row['guid'];
$feed .= "<item>"; $feed .= "<title>" . $title . "</title>"; $feed .= "<link>" . $link . "</link>"; $feed .= "<description> " . $description . "</description>"; $feed .= "<pubDate>" . $date . "</pubDate>"; $feed .= "<guid>" . $guid . "</guid>"; $feed .= "</item>"; }
$feed .= "</rss";
// write the feed out to the server... echo($feed);
}
?>
要是你再加更多东西到这个函数里,它会很快变得难以维护。
好习惯:可管理,集成化的函数
<?php
function createRssHeader() { return "<rss version=\"2.0\">" . "<channel>" . "<title>My Great Feed</title>" . "<link>http://www.php100.com/feed.xml</link>" . "<description>The best feed in the world</description>" . "<language>en-us</language>" . "<pubDate>Tue, 20 Oct 2008 10:00:00 GMT</pubDate>" . "<lastBuildDate>Tue, 20 Oct 2008 10:00:00 GMT</lastBuildDate>" . "<docs>http://www.php100.com/rss</docs>" . "<generator>MyFeed Generator</generator>" . "<managingEditor>editor@php100.com</managingEditor>" . "<webMaster>webmaster@php100.com</webMaster>" . "<ttl>5</ttl>"; }
function createRssFooter() { return "</channel></rss>"; }
function createRssItem($title, $link, $desc, $date, $guid) { $item .= "<item>"; $item .= "<title>" . $title . "</title>"; $item .= "<link>" . $link . "</link>"; $item .= "<description> " . $description . "</description>"; $item .= "<pubDate>" . $date . "</pubDate>"; $item .= "<guid>" . $guid . "</guid>"; $item .= "</item>"; return $item; }
function getUserMaxStories($db_link, $default) { $perfsQuery = sprintf("SELECT max_stories FROM user_perfs WHERE user= '%s'", mysql_real_escape_string($user));
$result = mysql_query($perfsQuery, $db_link);
$max_stories = $default;
if ($row = mysql_fetch_assoc($result)) { $max_stories = $row['max_stories']; }
return $max_stories; }
function writeRssFeed($user) { // Get the DB connection information $settings = parse_ini_file("rss_server.ini");
// look up the user's preferences... $link = mysql_connect($settings['db_host'], $settings['user'], $settings['password']) OR die(mysql_error());
$max_stories = getUserMaxStories($link, 25);
// go get my data $newsQuery = sprintf("SELECT * FROM stories WHERE post_date = '%s'", mysql_real_escape_string(time()));
$result = mysql_query($newsQuery, $link);
$feed = createRssHeader();
$i = 0; // build the feed... while ($row = mysql_fetch_assoc($result)) { if ($i < $max_stories) { $title = $row['title']; $link = $row['link']; $description = $row['description']; $date = $row['date']; $guid = $row['guid'];
$feed .= createRssItem($title, $link, $description, $date, $guid);
$i++; } else { break; } }
mysql_close($link);
$feed .= createRssFooter();
// write the feed out to the server... echo($feed); } ?>
(责任编辑:admin) |