天天看點

ZT: 一個程式員的開發習慣

有關開發習慣的一些想法,如鲠在喉,不吐不快。究其發貼動機,當然不排除有騙取參與分的可能,但另一方面,也希望能給同行(念Xing)者提供一些建議,或者參考(希望不是誤人子弟)。同時,也希望各位能夠就我的這些陋習,發表一點看法,給出批評和指正的意見。謝謝。

一.建立工程目錄

? ? ? ?首先,第一步要做的,當然是給新項目建一個單獨的目錄(别笑)。目錄名稱與項目名稱同名,或者另取一個也可,隻要清楚、簡練。然後,在此目錄中建立以下各個目錄:

? ? ? ? :用來存放該項目相關的開發文檔(需求說明,概要設計,詳細設計等等等等);

? ? ? ?

:用來存放Delphi源程式中的”.Dpr”,”.Pas”,”.Dfm”等檔案;

? ? ? ? :該目錄中存放”.Dcu”檔案,将’.Pas’與’.Dcu’檔案分開存放隻是為了讓Source目錄的内容更加清楚一些;

? ? ? ? :存放工程的輸出檔案,比如”.Exe”,”.Dll”或者”.Ocx”等等;

? ? ? ? :用來存放日志檔案;通常在這個目錄中我會放一個”<項目名稱>程式員日志.Txt”檔案。

? ? ? ? :當然是存放工程中用到的圖檔的目錄了。一般情況下,這個目錄是少不了的。假如還用到其他資源,那麼也一樣建立各自的目錄,比如Wav,比如Avi等等。

二.設定工程選項

在Delphi中建立一個新的工程,将此工程儲存到Source目錄中,同時:

a. ? ? ? 選一個耐看的,與項目有些聯系的圖示作為這個工程的圖示。當然,這個圖示可能隻是臨時用用的,但是總要比Delphi預設的那個難看的要好才行,要不然,怎麼對得起自己?

b. ? ? ? 将Project Options -> Directories/Conditionals頁面中的Output Directory設定為Bin目錄;

c. ? ? ? 将Unit output Directory設定為Dcu目錄。

三.添加常量單元

? ? ? ?添加一個新的Unit,另存為“unt<工程名> Consts.Pas”,用來儲存工程中用到的常量。

四.有關窗體(Form)及單元(Unit) ?

按照匈牙利命名法則給Form命名,則一個用來登入的窗體可以命名為’FrmLogin’,而其單元名可以為’untLogin’。通常,兩個對應的Form和Unit的名稱在除去’Frm’或’unt’的縮寫後應當保持一緻。

在Unit的頭部添加本單元的注釋,注釋的格式可以參照Delphi的源碼,但是至少應當包含以下幾項:功能描述;作者;版權;建立時間;最後修改時間;修改曆史等等。

将新建立好的Form的Caption設定為該Form類的名稱,而不是使用Delphi預設的。比如,将Form1更名為FrmLogin後,此時我們獲得了TFrmLogin這個新的窗體類,并且Delphi自動将窗體的Caption更新為’FrmLogin’。依我看,該Caption應當為’TFrmLogin’才是,因為我們在設計的是一個窗體類TFrmLogin,而不是僅僅對FrmLogin進行操作。

向TFrmLogin這樣功能明确的窗體類,許多人都有在設計期就将其Caption設定為諸如“操作員登入”這種名稱的習慣。我的習慣是,象“操作員登入”這樣的常量,通常存放在unt<工程名>Consts.Pas中,用ResourceString來定義,或者用Const來定義。至于窗體的Caption的命名,應當屬于運作期的工作。是以,我往往在TForm.OnCreate事件觸發之時才對Caption進行操作,比如:

procedure TFrmLogin.FormCreate(Sender: TObject);

begin

? ? ? ?Caption := csLoginTitle;

? ? ? ....

end;

五.關于Format函數的使用

? ? ? ?有iYear,iMonth,iDay三個資料,要顯示諸如“生日:1976/3/18”這樣的資訊,你通常怎麼做?使用s := ‘生日:’+IntToStr(iYear)+’.’+IntToStr(iMonth)+’.’+IntToStr(iDay); 嗎?這樣實在是太累了。我的習慣是,在unt<工程名>Consts.Pas中增加一個常量csBirthDayFormat = ‘生日:%d/%d/%d’來儲存顯示格式,然後使用s := Format(csBirthDayFormat, [iYear, iMonth, iDay]);這樣的語句完成資料的拼裝。這麼做的好處顯而易見,那就是你隻需在一個地方維護資料的顯示格式。

? ? ? ?Format函數功能強大,我對它很是推崇,你呢?

六.關于系統資料庫或者Ini檔案的存儲

原先通路系統資料庫我通常使用TRegistry,而通路Ini檔案通常使用TIniFile。這兩個類的使用方法各不相同,是以想要使用相同的代碼既能通路系統資料庫又能通路Ini檔案幾乎是不可能的。真頭疼啊!

終于我發現了救星!那就是TRegistryIniFile類。檢視Registry單元,我們發現,TRegistryIniFile繼承自TCusomIniFile。而TIniFile也是繼承于TCusomIniFile。是以,使用抽象類TCusomIniFile來實作對系統資料庫或者Ini檔案的通路便是一舉兩得了。比如:

var

? csmIniFile: TCusomIniFile;

begin

? if blUseIniFile then//如果使用Ini檔案

? ? csmIniFile:= TIniFile.Create(csRootKey)

? else

? ? csmIniFile:= TRegistryIniFile.Create(csRootKey);

? //接着就可以使用csmIniFile對Ini檔案進行通路,

//或者用類似通路Ini檔案的方式通路系統資料庫。

七.關于TStream流以及TFileStream,TMemoryStream等等

? ? ? ?TFileStream和TMemoryStream都繼承自抽象類TStream,這意味着我們可以使用一套代碼完成對檔案和記憶體的存取操作。是以,定義一些接口的時候,我往往傾向于将參數的類型定義為抽象類,而不是具體類。比如,要完成儲存功能的一個函數,定義成

function Save(AStream: TStream): Boolean;

就比定義成

function Save(AStream: TFileStream): Boolean;

要靈活的多。

前一個定義是具有前瞻性的,因為它可以适用于以後可能出現的新型态的流。而後一個定義隻适用于TFileStream這種流(當然包括TFileStream的子類),呆闆多了。

我的習慣:如果存在抽象類,那麼盡量将參數定義為抽象類的類型,畢竟,我們無法預見未來。

八.多使用TAction

? ? ? ?Delphi 4以後引入了Action的概念,并且在Standard元件欄中增加TActionList元件。使用Action的好處是,控件狀态同步的煩惱從此一掃而空!