2008年5月7日 星期三

[oop]PHP項目規劃

譯者序:項目規劃是業界比較重視的一個專題,但似乎專門講PHP項目規劃的文章不多。在PHP Freaks上看到這篇文章,雖然寫得並不專業,但是在相對中文資源相對缺泛和滯後的PHP領域,還是有一點參考價值的。在翻譯時覺得原文的語言組織不太 符合中文的閱讀習慣,於是就對原文的邏輯進行了一定修改。資源共享,歡迎轉載,望註明出處。
原文:http://www.phpfreaks.com/tutorials.php?cmd=view&tutorial_id=135
本Blog的原文存檔:http://blog.donews.com/phpor/articles/460809.aspx

  作者序:我所見過的大部分的PHP程序都存在架構和組織混亂的問題,這就說明它們缺乏規劃。很多PHP程序員並沒有對項目進行足夠的考慮就一頭栽進了編碼工作之中。這是我在3-4個月前寫的一篇文章,之後我學到了更多,特別是關於OOP技術的東西。


規劃?

  無論我們是在開發大型、中型還是小型的項目,規劃是始終是最重要的事情。當我們的水平達到某個層次的時候,我們就可以編寫一些程序而無需看著教程或書 籍。也許我們懂得用PHP連接數據庫,輸出運算結果,創建類等等。然而,很多人的水平達到這個階段的時候就很容易只顧編碼而完全忽略了規劃。

  儘管即興編程聽上去不錯,但如果我們要一個工具幫我們實現流線型的編碼作業、簡便的升級過程以及輕鬆的編碼工作,規劃就是最好的選擇。如果我們已經規 劃好了數據庫結構,如果我們對自己的代碼已經有了大概的輪廓,如果我們非常清楚自己寫的程序是做什麼用的,那麼,編碼工作只不過小菜一碟。多數的書籍或教 程中都沒有詳細地講解規劃過程,因為通常作者已經做好了這個工作。但如果我們要自己來編一個程序,那麼對程序的規劃就顯得尤為重要了。當我們要為程序添加 新的功能或特性,以及要開發新版本的時候,就會發現程序的規劃和良好的代碼結構會是開發過程中最重要的一個環節。

  這篇文章會以一個留言本程序作為示例,但並不會教你如何編寫PHP代碼,而是教你如何更好的組織和規劃你的代碼。它會探討程序特性規劃、類的規劃、數據庫結構、模板、消息提取以及一些基礎的編碼技術。



目錄

  首先,請看看這篇文章大概包括了哪方面的內容


規劃程序特性
你的程序是做什麼用的?
程序各種特性之間的關係如何?
用什麼代碼來處理這些特性間的關係?
數據庫
用哪種數據庫?
怎麼使用數據庫?
什麼東西存在數據庫內?什麼東西存在配置文件內?
規劃代碼結構
你的程序要用哪些類?
這些類是做什麼用的?
如何組織它們?
程序是如何調用這些類的?
什麼東西寫進類裡,什麼東西寫進過程代碼裡?

  以上的雖然不是這篇文章的全部內容,但是文章會對這些問題進行探討。



程序特性規劃

  規劃程序特性最基本的要求是我們必須知道自己的程序是做什麼用的。首先,要對程序基本的特性有一個大概的輪廓,就如這個留言本一樣,我們可以列出了以下東西:

  1)顯示留言功能;2)發表留言功能;3)管理功能;4)模板功能。

  是如何寫出這些特性的?很簡單,我參考了其它的留言本,看看它們有什麼特性,並大概的做了一個分類。然後再想想有什麼類型的特性是它們沒有而我們又想添加上去的。但這樣做只是粗略地勾畫出一些基本的特性而已

  現在,我們需要對這些特性進行補充和擴展,列出我們認為程序必須具備的詳細特性。下面我們隨便列舉一些:


顯示留言功能
默認每頁顯示10條留言,但允許用戶自行定製
使用java script實現留言的展開和收縮
支持BB代碼
發表留言功能
在每一頁加上發表留言的鏈接
必須填寫的信息:呢稱、留言
可選填的的信息:電子郵件、網站、IM帳號、地理位置
隱藏表單域:IP地址(用於防止垃圾信息)
管理功能
編輯留言
刪除留言
屏蔽IP地址
詞語過濾器
基本設置:網站名稱,留言本名稱,網站URL,數據庫主機、名稱、用戶、密碼
留言回覆
簡單的模板編輯及添加功能
管理員身份驗證
模板功能
從數據庫或文本文件提取變量值並替換

如果你不想自己寫模板,可以使用像Smarty和patTemplate這種現成的模板引擎

  當然,寫出了以上列表並不代表我們規劃好了這個程序,但是你有沒有發現把基本特性列出來以後,編碼工作變得簡單了?當我們開始寫代碼的時候,就很清楚地知道要往哪裡去,以及各種功能之間的聯繫了。



編碼規劃

  現在要開始規劃代碼了。我們要讓程序基於數據庫運行嗎?如果是的話,用什麼數據庫?又或者是我們是不是想讓程序基於文本數據庫?如果是的話,如何實 現?還有就是,我們的代碼是基於哪種結構的?對於大型的程序開發,我的建議只有三個字:Object Oriented Programming。

  開發大型PHP程序最佳的代碼結構就是使用OOP。比方說,我們有一個論壇程序是用OOP開發的。現在程序裡有一個類叫做view,在view裡有一 個方法叫viewThreads(),可以通過接受參數來輸出帖子內容。如果現在有一個叫viewforum.php的頁面用於每次顯示一個特定的帖子, 那麼我們就可以調用$view->viewThreads()來輸出結果了。如果還有一個搜索功能,也要輸出帖子的內容,那麼我們只需調用 viewThreads()這個方法即可。如果沒有使用OOP,當我們要改變輸出帖子的代碼的時候,就必須修改每一個顯示帖子的文件,但用了OOP,我們 只需修改類代碼就行。但使用OOP的真正意途是使代碼更容易組織和擴展。

  因為,我們決定用OOP來編程了,至少也要用在這個留言本上。現在的問題就是:我們將會編寫哪些類?這些類是用於完成什麼工作的?如果我們要使用數據 庫的話,那麼至少需要一個類來處理和數據庫的數據交換。還有的就是,我們需要一個留言處理類來處理輸出和添加留言,一個管理類來完成管理工作,一個模板類 來處理模板。在一些大型項目中,我推薦使用現成的模板類如Smarty和patTemplate等,這樣既可以免除很多煩瑣的工作又可以在程序裡面實現一 些強大的功能,最重要的一點就是,你現在在編寫的是留言本,而不是模板引擎,所以使用現成的就可以了。

  當我們決定了編寫哪些類時,最好就把這些類以及它的方法列出來。下面就是一個例子:


code:
class Entry {

function Entry() {
//這個方法要定義和初始化全局變量以及要包括數據庫處理的類
//注意這個方法名要和類的名字一樣,這樣當類被調用是,這個方法也會被執行
}

function view($num, $start) {
//這個方法會從數據庫的中ID為$start的留言開始讀出$num條留言數
}

function post($name, $email, $website, $aim, $yim, $msn, $icq, $title, $post) {
//這個方法將把傳輸過來的數據寫入數據庫中
}

}
?>
  顯然,要完成這些類還要進行很多的編碼工作,雖然具體代碼還沒填上,但是我們已經有了代碼的大概結構了,這樣就使後面的編碼工作輕鬆多了。

  這個例子並沒有完成全部的規劃工作,還要對其它的類做同樣的工作。但是,這個例子卻告訴了你怎麼做。無論是大型的CMS、論壇,還是小型的留言本,這種做法都能使你的代碼寫得更好。



使編碼工作更簡單的方法

模板

  在開始編程的時候,千萬不可以忽略了模板和模板機制。所有的編碼工作都必須緊扣模版,因此不要把它放在最後。我推薦使用Smarty模版引擎,當然 patTemplate也不錯。但無論你選哪個或者你自己來寫,都要把這個工作放在最前面來完成,因為模板是和最終用戶關係最密切的一部份。我推薦各位最 好創建一個類來負責管理模版,這個類並不是去做模版該做的事,只不過是管理它而已。假如我們用Smarty模版,我們可以這樣:


code:
class Template {

function Template() {
require_once("Smarty.php");
$smarty = new Smarty();
}

function showTpl($tpl) {
$smarty->display($tpl);
}
}
?>

  要完善模版管理,我們還要做更多的工作。但上面的這個類足以讓你簡單地在第一頁引用Smarty的調用和輸出代碼,而無需一次又一次地編寫了。



抽像處理

  什麼是抽像處理?我們常聽到的是「數據庫抽像」,一種可以使你無需修改代碼就可以訪問眾多數據庫的技術。但是,所謂的抽像處理還有可以是輕鬆編碼的代 詞。有這樣一種情況:我們需要所有的頁面的某部分(如頁眉、頁腳、變量引用等)內容相同,這時我們可以一次又一次地重寫這部份的內容,也可以創建一個包括 這些重複內容的頁面然後在每一頁中引用它。雖然輸出頁面重複內容時引用公共文件的這種方法在Smarty面前已黯然失色,但是,還是有它另類的用法,特別 是在一些大型程序中。

  消息抽像就是抽像應用的一個例子。在這個留言本中,我們需要輸出如「留言提交成功」、「請輸入呢稱」等消息,就可以創建一個消息類來處理它:


code:
class msg {
function msg($num) {
$start = '

';
$end = '

';
$message = $start;
switch($num) {
case 1:
$message .= '帳號名錯誤';
break;

case 2:
$message .= '錯碼錯誤';
break;
}
$message .= $end;
echo $message;
}
}
?>
  如果做了登陸頁面,我們就可以這樣訪問消息類:


code:
include 'msg.php';
if($pass != "arr") {
$msg = new msg(2);
} elseif($user != 1user1) {
$msg = new msg(1);
}
?>

  顯然,對於身份驗證,上面這個並不是一個好的例子,但我們可以通過它看到消息抽像的好處。我之所以把這個例子引入文章內,是為了使編程更方便。使用類似的消息抽像機制在需要輸出反饋信息的地方,你可以很輕鬆的通過修改一個文件完成相關的工作。

  不僅如此,如果我們需要添加新的消息,只需加上一個新的case即可,然後在相關的地方調用它,而無需再添加echo語句。如果使用模版的話,我們就 不可以像上面那樣簡單地把消息放在類裡,而是當類被調用時,使用事先創建的子模版來顯示消息,這種方法在Smarty中只不過是三行代碼而已。

  現在你應該清楚上面所說的抽像處理了。

  還有一個經常說重點不要忘記,就是在你的代碼中添加適當的縮進。類中的第一個方法,程序中的第一個自定義函數、循環語句和表達式等。除此之外,註釋也 不能忽略。我們肯定很清楚自己剛寫完的代碼是做什麼的,但是幾月之後,可能要對代碼進行升級,這時,我們就會發現有註釋的代碼確實易讀很多。

規劃!

  看完這篇文章,你應該會知道我一直所強調的就是規劃,它使編碼變得更簡單。如果對項目做了規劃工作,那麼一切進展都會變得順利。比如說,如果你特定的 功能創建了類,那麼調試這些工能將會是一個簡單的工作;如果你使用了模版引擎,那麼你的代碼將會顯得更簡潔、更易於維護和升級。

  一但確定了你工作的方法,就把這些方法用到每一段代碼上。每次我對項目進行規劃以及使用了適合的工作方法之後,我都會發現編碼質量有了飛躍。也許你不 願意把時間放在規劃上,因為它會佔用你的時間,但當你要添加新功能、升級程序、修改代碼或改變界面的時候,你就會那是一件很痛苦的事情。

  看完本文,如果你對規劃產生興趣的話,可以嘗試像上面給出的例子一樣列出程序各方面的內容,然後編寫一些簡單的程序,並且試一下基於OOP編程以及使用Smarty的hidden/shown功能。如果你還不懂OOP編程的話,不用急,可以先看一些教程。

  本文教會了你一些規劃項目的基本方法,顯然,對項目的規劃工作並不只有這些。如果你還想瞭解數據庫的設計,可看看本站的LAMP教程,除此之外,本站還有上面提到的消息抽像的教程。無論如何,規劃確實對你的工作有很大的幫助,希望本文對你有幫助。

出處:http://blog.roodo.com/ahdai0718/archives/3093001.html

【下列文章您可能也有興趣】

沒有留言: