一個(gè)程序員的開(kāi)發(fā)習(xí)慣(ZT) |
有關(guān)開(kāi)發(fā)習(xí)慣的一些想法,如鯁在喉,不吐不快。究其發(fā)貼動(dòng)機(jī),當(dāng)然不排除有騙取參與分的可能,但另一方面,也希望能給同行(念Xing)者提供一些建議,或者參考(希望不是誤人子弟)。同時(shí),也希望各位能夠就我的這些陋習(xí),發(fā)表一點(diǎn)看法,給出批評(píng)和指正的意見(jiàn)。謝謝。 一.建立工程目錄 首先,第一步要做的,當(dāng)然是給新項(xiàng)目建一個(gè)單獨(dú)的目錄(別笑)。目錄名稱與項(xiàng)目名稱同名,或者另取一個(gè)也可,只要清楚、簡(jiǎn)練。然后,在此目錄中創(chuàng)建以下各個(gè)目錄: <Doc>:用來(lái)存放該項(xiàng)目相關(guān)的開(kāi)發(fā)文檔(需求說(shuō)明,概要設(shè)計(jì),詳細(xì)設(shè)計(jì)等等等等); <Source>:用來(lái)存放Delphi源程序中的”.Dpr”,”.Pas”,”.Dfm”等文件; <Dcu>:該目錄中存放”.Dcu”文件,將’.Pas’與’.Dcu’文件分開(kāi)存放只是為了讓Source目錄的內(nèi)容更加清楚一些; <Bin>:存放工程的輸出文件,比如”.Exe”,”.Dll”或者”.Ocx”等等; <Log>:用來(lái)存放日志文件;通常在這個(gè)目錄中我會(huì)放一個(gè)”<項(xiàng)目名稱>程序員日志.Txt”文件。 <Images>:當(dāng)然是存放工程中用到的圖片的目錄了。一般情況下,這個(gè)目錄是少不了的。假如還用到其他資源,那么也一樣建立各自的目錄,比如Wav,比如Avi等等。 二.設(shè)置工程選項(xiàng) 在Delphi中創(chuàng)建一個(gè)新的工程,將此工程保存到Source目錄中,同時(shí): a. 選一個(gè)耐看的,與項(xiàng)目有些聯(lián)系的圖標(biāo)作為這個(gè)工程的圖標(biāo)。當(dāng)然,這個(gè)圖標(biāo)可能只是臨時(shí)用用的,但是總要比Delphi默認(rèn)的那個(gè)難看的要好才行,要不然,怎么對(duì)得起自己? b. 將Project Options -> Directories/Conditionals頁(yè)面中的Output Directory設(shè)置為Bin目錄; c. 將Unit output Directory設(shè)置為Dcu目錄。 三.添加常量單元 添加一個(gè)新的Unit,另存為“unt<工程名> Consts.Pas”,用來(lái)保存工程中用到的常量。 四.有關(guān)窗體(Form)及單元(Unit) 按照匈牙利命名法則給Form命名,則一個(gè)用來(lái)登錄的窗體可以命名為’FrmLogin’,而其單元名可以為’untLogin’。通常,兩個(gè)對(duì)應(yīng)的Form和Unit的名稱在除去’Frm’或’unt’的縮寫(xiě)后應(yīng)當(dāng)保持一致。 在Unit的頭部添加本單元的注釋,注釋的格式可以參照Delphi的源碼,但是至少應(yīng)當(dāng)包含以下幾項(xiàng):功能描述;作者;版權(quán);創(chuàng)建時(shí)間;最后修改時(shí)間;修改歷史等等。 將新創(chuàng)建好的Form的Caption設(shè)置為該Form類的名稱,而不是使用Delphi默認(rèn)的。比如,將Form1更名為FrmLogin后,此時(shí)我們獲得了TFrmLogin這個(gè)新的窗體類,并且Delphi自動(dòng)將窗體的Caption更新為’FrmLogin’。依我看,該Caption應(yīng)當(dāng)為’TFrmLogin’才是,因?yàn)槲覀冊(cè)谠O(shè)計(jì)的是一個(gè)窗體類TFrmLogin,而不是僅僅對(duì)FrmLogin進(jìn)行操作。 向TFrmLogin這樣功能明確的窗體類,許多人都有在設(shè)計(jì)期就將其Caption設(shè)置為諸如“操作員登錄”這種名稱的習(xí)慣。我的習(xí)慣是,象“操作員登錄”這樣的常量,通常存放在unt<工程名>Consts.Pas中,用ResourceString來(lái)定義,或者用Const來(lái)定義。至于窗體的Caption的命名,應(yīng)當(dāng)屬于運(yùn)行期的工作。所以,我往往在TForm.OnCreate事件觸發(fā)之時(shí)才對(duì)Caption進(jìn)行操作,比如: procedure TFrmLogin.FormCreate(Sender: TObject); begin Caption := csLoginTitle; .... end; 五.關(guān)于Format函數(shù)的使用 有iYear,iMonth,iDay三個(gè)數(shù)據(jù),要顯示諸如“生日:1976/3/18”這樣的信息,你通常怎么做?使用s := ‘生日:’+IntToStr(iYear)+’.’+IntToStr(iMonth)+’.’+IntToStr(iDay); 嗎?這樣實(shí)在是太累了。我的習(xí)慣是,在unt<工程名>Consts.Pas中增加一個(gè)常量csBirthDayFormat = ‘生日:%d/%d/%d’來(lái)保存顯示格式,然后使用s := Format(csBirthDayFormat, [iYear, iMonth, iDay]);這樣的語(yǔ)句完成數(shù)據(jù)的拼裝。這么做的好處顯而易見(jiàn),那就是你只需在一個(gè)地方維護(hù)數(shù)據(jù)的顯示格式。 Format函數(shù)功能強(qiáng)大,我對(duì)它很是推崇,你呢? 六.關(guān)于注冊(cè)表或者Ini文件的存儲(chǔ) 原先訪問(wèn)注冊(cè)表我通常使用TRegistry,而訪問(wèn)Ini文件通常使用TIniFile。這兩個(gè)類的使用方法各不相同,因此想要使用相同的代碼既能訪問(wèn)注冊(cè)表又能訪問(wèn)Ini文件幾乎是不可能的。真頭疼??! 終于我發(fā)現(xiàn)了救星!那就是TRegistryIniFile類。查看Registry單元,我們發(fā)現(xiàn),TRegistryIniFile繼承自TCusomIniFile。而TIniFile也是繼承于TCusomIniFile。因此,使用抽象類TCusomIniFile來(lái)實(shí)現(xiàn)對(duì)注冊(cè)表或者Ini文件的訪問(wèn)便是一舉兩得了。比如: var csmIniFile: TCusomIniFile; begin if blUseIniFile then//如果使用Ini文件 csmIniFile:= TIniFile.Create(csRootKey) else csmIniFile:= TRegistryIniFile.Create(csRootKey); //接著就可以使用csmIniFile對(duì)Ini文件進(jìn)行訪問(wèn), //或者用類似訪問(wèn)Ini文件的方式訪問(wèn)注冊(cè)表。 七.關(guān)于TStream流以及TFileStream,TMemoryStream等等 TFileStream和TMemoryStream都繼承自抽象類TStream,這意味著我們可以使用一套代碼完成對(duì)文件和內(nèi)存的存取操作。因此,定義一些接口的時(shí)候,我往往傾向于將參數(shù)的類型定義為抽象類,而不是具體類。比如,要完成保存功能的一個(gè)函數(shù),定義成 function Save(AStream: TStream): Boolean; 就比定義成 function Save(AStream: TFileStream): Boolean; 要靈活的多。 前一個(gè)定義是具有前瞻性的,因?yàn)樗梢赃m用于以后可能出現(xiàn)的新型態(tài)的流。而后一個(gè)定義只適用于TFileStream這種流(當(dāng)然包括TFileStream的子類),呆板多了。 我的習(xí)慣:如果存在抽象類,那么盡量將參數(shù)定義為抽象類的類型,畢竟,我們無(wú)法預(yù)見(jiàn)未來(lái)。 八.多使用TAction Delphi 4以后引入了Action的概念,并且在Standard組件欄中增加TActionList組件。使用Action的好處是,控件狀態(tài)同步的煩惱從此一掃而空! |
聯(lián)系客服