技术开发 频道

PHP 编程的 5 个良好习惯

  分成更小的部分

  专心解决一个问题之后再继续编程,这样会让您更轻松。在解决一个紧急的问题时,如果继续编程,会使函数越来越长。从长远来说,这并不是一个问题,但您要记得回过头来将它重构为更小的部分。

  重构是个不错的主意,但您应该养成编写更短、功能更集中的代码。短的方法能够在一个窗口中一次看完,并且容易理解。如果方法过长,不能在一个窗口中一次看完,那么它就变得不容易理解,因为您不能快速地从头到尾了解它的整个思路。

  构建方法时,您应该养成这样的习惯,让每个方法只完成一件事情。这个习惯很好,因为:首先,如果方法只完成一件事情,那么它就更容易被重用;其次,这样的方法容易测试;第三,这样的方法便于理解和更改。

  不良习惯:过长的方法(完成很多件事情)

  清单 3 展示了一个很长的函数,其中存在很多问题。它完成很多件事情,因此不够紧凑。它也不便于阅读、调试和测试。它要做的事情包括遍历一个文件、构建一个列表、为每个对象赋值、执行计算等等。

  清单 3. 不良习惯:过长的函数

<?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.example.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.example.com/rss</docs>" .
        
"<generator>MyFeed Generator</generator>" .
        
"<managingEditor>editor@example.com</managingEditor>" .
        
"<webMaster>webmaster@example.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);

}

?
>

  如果多编写几个这样的方法,维护就成了真正的难题了。

  良好习惯:易管理、功能专一的方法

  清单 4 将原来的方法改写为更加紧凑、易读的方法。在这个示例中,将一个很长的方法分解为几个短方法,并且让每个短方法负责一件事情。这样的代码对将来的重用和测试都是大有裨益的。

  清单 4. 良好习惯:易管理、功能专一的方法

<?php

function createRssHeader()
{
    return
"<rss version=\"2.0\">" .
        
"<channel>" .
        
"<title>My Great Feed</title>" .
        
"<link>http://www.example.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.example.com/rss</docs>" .
        
"<generator>MyFeed Generator</generator>" .
        
"<managingEditor>editor@example.com</managingEditor>" .
        
"<webMaster>webmaster@example.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);
}
?
>

  将长方法拆分为短方法也是有限制的,过度拆分将适得其反。因此,不要滥用这个良好的习惯。将代码分成大量的片段就像没有拆分长代码一样,都会造成阅读困难。

0
相关文章