Delphi程序開發經驗

Delphi 7是一個很經典的版本,在Win2000/XP下推薦安裝Delphi 7來開發軟件,在Vista下推薦使用Delphi 2007開發軟件。安裝好Delphi 7後,應立即安裝Delphi 7 Update Pack 1,Delphi 2007則建議儘量安裝最新的版本。工欲善其事,必先利其器,爲了提升開發效率,爲了能更加得心應手的處理接下來的開發工作,我們有必要安裝一些有用的開發輔助工具(Delphi將此類插件以Expert命名)。首先推薦的是DelForExp這個源代碼格式化工具,集成在IDE裏,使用相當方便。即使我所寫代碼的風格非常好,但是還是免不了閱讀某些人寫的亂七八糟的代碼,這時DelForExp就能派上用場了,1秒鐘就能讓代碼能看上去順眼多了。GExperts曾經是一個非常出名的工具,可現在都不怎麼更新了,裏面有幾個功能還是值得一用,比如Grep Search, Replace Components, Code Proofreader等。強烈推薦安裝CnPack IDE 專家包,相信我,它會讓你的Delphi更好用。Delphi 7是不支持重構的,因此我還建議安裝Castalia,這個工具中某些功能還是很不錯的。CodeRush一直都是Delphi下最強大的工具,可是由於安裝後比較容易與其他工具衝突,讓人不得不忍痛割愛。Delphi 7下建議安裝Delphi SpeedUp這個IDE加速工具,其原理是在Delphi啓動前,替換RTL的函數爲來自FastCode工程的執行效率更高的函數。ModelMaker Code Explorer爲Delphi增加了一些方便重構代碼的功能,值得安裝使用。

    第一次啓動Delphi 7,關閉設置中的Delphi Direct以禁止Delphi訪問Borland服務器,勾選Show Compiler Progress選項以便編譯程序時可以看見編譯進度,然後分別設置所安裝的專家的選項,再對Delphi的窗體佈局按自己的喜好調整,調整好了然後將其保存爲默認佈局。關閉工程,設置好默認的工程選項。接下來就可以安裝控件包了。如果是在項目小組中配置開發環境,因爲可能所需的控件比較多,安裝比較麻煩,建議由一個有經驗的開發人員將那些散裝控件預編譯後做成安裝程序供小組其他成員安裝。

 

軟件設計

    在整理自己的思路的時候可以採用PersonalBrain來畫思維導圖,這是一個拓展腦力,激發思維的一個活動,並且將自己的想法全部記錄下來,並在整理的過程當中可以發現內在聯繫與更多的問題,在接下來的設計中加以考慮。做設計需要畫圖,除了Visio外,我推薦EDraw Soft Diagrammer。Enterprise Architect用來做UML設計是很好的選擇。ModelMaker爲Delphi增加UML支持,可以保持設計與代碼雙向同步,非常不錯的工具。

    作爲一個Delphi產品的設計人員,應該具有廣闊的視野,熟悉.NET、Java下優秀的框架設計,熟悉Delphi類庫的源代碼,其中總有我們可以借鑑與學習的地方,根據公司的實際情況以及具體需求有選擇的在產品開發中進行實踐,這樣才能做出高質量的產品。


軟件開發

    數據結構是軟件開發中的基礎,在開發項目前,你一定應該準備好如TStack, THashtable, TQueue, TCollection, TMap, TBag, TSet, TAssociation之類的容器類,然後在以後的開發中根據需要選用合適的數據結構,避免不要直接使用指針與TList。如有需要,可以先將TStream,TRegistry等常用類繼承實現,也就是做一個包裝,這樣就爲以後的開發中就留下了一個可以隨時加入擴展的接口。

    網上也能找到DGL(The Delphi Generic Library)來爲Delphi增加泛型支持,實際上也可以稱之爲一個模板庫,但是這個庫我也只使用過一次,網上也未見其他人使用,因此到底是否可靠還有待於實踐驗證。說到模板庫,我還想起一個DEEX,這是一個預處理器,可以讓你使用類似STL相似的語法,其中也內置了DTL(Delphi Template Library)庫。

    關於AOP,Delphi這方面完全不能與Java或.NET相比,所能用的技術也就只能是動態代理或Hook來實現,雖然也出現了MeAOP之類的框架,我還是建議從設計上去解決這類AOP的需求,或者也可以考慮採用在DailyBuild的時候做編譯前預處理(比如設計成{LogAction}類似於.NET的屬性特性來修飾特定的方法,當然預處理器必須自己開發)。

    與開發有關的文件都應該被管理起來,而不僅僅是隻管理代碼,一開始就要做好目錄規劃,特別要注意將代碼與運行時所需的資源分隔開,一般來說,可以分爲Doc,Src,Res,Misc四大類,Doc存放全部相關的文檔,裏面建立具體的分類目錄;Src存放編譯所需的文件,比如源代碼和幫助的源文件;Res存放製作安裝包與發佈軟件所需的各種資源文件,比如圖片、網頁等。這樣做將爲接下來的DailyBuild做好準備。

    Delphi沒有Package與Namespace的概念,因此只能利用目錄上的物理劃分代替邏輯劃分,將同一性質的單元放置到同一目錄,根據需要再劃分更多子目錄來存放單元。

    程序的界面上的控件最好都重新規範命名,切忌在代碼中出現類似Label1.txt := 'abc';之類的代碼。開發者應該熟悉Delphi所提供的系統函數,切忌自己去實現Delphi已經提供了的函數,一則這樣做的效率不高,二則你自己所寫的代碼沒有經過完全的測試,很有可能存在未妥善處理的情況。我們不提倡重複發明輪子,特別是在正式的開發中這樣做。開發中把握面向對象設計的原則:單一職責、開放封閉、里氏替換、依賴倒置、接口隔離、高內聚低耦合。代碼就是最好的註釋,變量命名儘可能的表達其本身的意義,最好的註釋就是不需要註釋也能很容易的看懂代碼,只在需要的地方加上註釋。開發人員應該將自己所寫的代碼視之爲供別人使用的產品,不要隨意的將方法聲明爲公開方法,只提供給別人需要的方法,每個公用方法上都應該用註釋標明其功能。程序編譯過程中出現的任何警告或提示都應該認真對待,爭取消除每一個警告或提示,這樣做是避免一些代碼中可能存在的隱患。

    有經驗的程序員完成特定的功能會充分考慮可變的情況,將這些地方提取出來,定義爲方法參數或者從配置文件中讀取,這樣即使需求發生變化,也能輕鬆應對。要寫出易維護的程序應該在軟件配置化和程序動態化上下功夫。特別提一提程序動態化,現在開發網絡遊戲的很多,而且一般都會用到腳本引擎Lua來實現部分邏輯,這樣在開發後期的調整相對變得輕鬆一點,以後在服務器上做修改也不會要求重新啓動程序。當然在一般的項目或產品中一樣可以考慮使用腳本引擎,當然不一定要用Lua,還可以有很多別的選擇。比如:DelphiWebScript,RemObjects Pascal Script,AUTOMA atPASCAL SCRIPTER,FastScript,Innerfuse Pascal Script。如果還有更高的要求,還可以考慮利用COCO/R (ParserBuilder)來實現自己的語法解析器。

    開發中通常會遇到自己不能解決的問題,要知道你遇到的問題別人可能早就遇到過並解決,因此請教他人或者請教Google通常是最好的選擇。上論壇提問是沒有效率的方法。本地的知識庫也能派上用場,比如www.delphi3000.com的離線庫CodeFinder,大富翁離線資料庫,


控件開發

    控件分爲不可視控件與可視控件,不可視控件其實與一般的類沒什麼太大的區別,只需要公佈需要公佈的屬性爲Published,如有需要也可以設計並註冊自己的屬性編輯器。

    開發控件也有專業的開發工具Eagle CDK和Eagle reAct,您不僅可以很方便的創建類,還可以在運行期測試控件,可以很方便的修改屬性,即時看到效果,大大提高了開發效率。


軟件破解

    愈來愈多的開發者開始採用RSA來作爲註冊的加密算法,效果還算不錯,雖然仍不能防止被爆破,但是至少不會出現(內存)註冊機。對軟件加殼也不是什麼防彈衣,對於有經驗的破解者幾分鐘就可以用OllyDbg從內存Dump(先用Process Explorer殺掉屏蔽調試工具的線程),接着就是用Import REConstructor修復IAT,再用Lord PE對EXE進行優化。

    DeDe可以讓破解者看到程序內的資源,事件,既可以靜態分析,也可以在OllyDbg中對分析出的地址進行動態調試。

    破解Delphi控件當然也可以用DeDe,但是我們有更好的選擇,那就是DCUcu與Dcu2Pas,可以將Dcu直接反編譯成彙編代碼,通過靜態分析其中的字符串以及調用的API,破解真的是很容易。

    只有做到知己知彼,才能做到有的放矢,反破解就是做到以最小的保護代價來使得破解者付出極大的破解行動。


版本控制

    版本控制最流行的就是VSS, CVS, SVN,我比較喜歡SVN,但是由於在Delphi下始終沒有很方便的連接SVN的插件,因此,仍然是Delphi+VSS是最方便的版本控制的選擇。VssConneXion是專門用於爲Delphi增加VSS支持的插件,確實爲開發人員帶來了無比的便利。Delphi+TortoiseCVS與Delphi+TortoiseSVN同樣也是不錯的選擇。VSS最大的缺點就是只能在內網中使用,除了可以透過VPN來允許遠程訪問外,我們還可以用Dynamsoft SourceAnyWhere或SourceOffSite實現VSS通過Internet訪問。當然VSS 2005也支持Internet訪問。如果你是個人開發者,覺得使用VSS也太麻煩,不妨試試FileHamster。


軟件測試

    在提交給測試人員前,要求開發人員首先做自測,不要出現給測試人員的是一個都不能運行的版本,這樣是對測試人員的不尊重。

    Java有JUnit,.Net有NUnit,同樣Delphi也有DUnit,這主要是用來做單元測試用的,特別是在不停的代碼重構中,能夠及時發現修改出的問題,是每日構建中的重要組成部分。開發人員在完成功能前就寫好測試用例代碼,也稱之爲測試驅動開發,讓自己作爲自己代碼的第一個用戶,以確保自己提交的代碼是易用的、正確的;讓測試人員更專注於發現那些隱藏的邏輯性錯誤。

    TestComplete是AutomatedQA出品的專業自動化測試工具,與Rational Robot和Mercury WinRunner相比,特別適合用於Delphi開發的程序的測試。自動化測試可以減輕測試人員的工作量,提高他們的測試效率。當然,採用自動化測試對於測試人員的要求就更高了,因爲需要測試人員維護測試腳本。


缺陷管理

    測試人員的報告需要反饋給開發者,同時又要知道開發者的修改意見,上級主管需要知道當前的測試進度與修改情況,這一切都是需要缺陷管理系統所管理的。通常缺陷管理都是做成B/S系統,當然也有提供客戶端的。JIRA, Mantis, Bugzilla, Axosoft OnTime, Axosoft PowerTrack, Bug Tracker, BugFree, Dev Hound, SourceGear Dragnet, TestTrack Pro, URTracker,同樣有很多選擇。


內存泄漏

    Java與.NET自身有垃圾回收機制,而且沒有指針,除了外部資源(數據連接,文件等)需要使用完關閉,讓開發人員是不需要主動管理內存釋放的,Delphi卻是需要自己管理對象的創建與釋放(Create and Free, New and Dispose, GetMem and FreeMem),在這一點上有些初學者往往不太注意,應堅持誰創建誰負責釋放的原則。雖然Delphi下沒有垃圾回收機制,但是有工具可以幫助我們檢查內存泄漏。

    MemProof就是一款專門用來檢查內存等資源分配情況的軟件。作者Atanas Stoyanov後來加入了AutomatedQA公司。
    AQtime是AutomatedQA出品的專業的測試軟件,包括性能分析,內存與資源分配情況,最有用的當然是性能分析與內存泄漏檢測。
    Fast Memory Manager,一款優秀的內存管理器,Delphi 2006以後就採用FMM替換了BorlandMM,Delphi 7下也可以加掛FMM來提升程序運行性能。同時FMM也是一個絕佳的內存泄漏測試工具。

    推薦引入FMM到工程,在開發過程中儘早的發現並解決內存泄漏問題,是比較理想的解決辦法。


錯誤定位

    測試人員在錯誤追蹤系統上提出了測試出來的錯誤,開發人員就要進行鍼對解決,首先就會遇到如何定位一些複雜的錯誤。
    首先就是打斷點在Delphi裏跟蹤調試運行,如果是在線程裏或是不能跟蹤調試的情況下,可以使用OutputDebugString進行跟蹤輸出,然後在View->Debug Windows->Event Log裏查看。CodeSite是一款讓開發者可以很方便的調試工具,特別是支持遠程輸出。此外還有小巧並且開源的Overseer也是不錯的調試工具。JEDI Code Library裏的Debug單元功能同樣強大。

    AV錯誤是Delphi中比較常見的未知錯誤。通常可以掛接Application.OnException,來自己處理所有的異常錯誤。在這方面,有專業的軟件可以幫助我們處理異常,EurekaLog就是一款專業的異常處理軟件,可以告訴我們非常詳細的錯誤信息,使得定位錯誤變得更輕鬆。madCollection裏的madExcept也是一款非常強的異常處理軟件,

 

製作安裝

    Inno Setup與NSIS都是免費的,功能強大的專業安裝製作軟件,Inno Setup是Delphi開發的,因此特別適合Delphi開發的產品的安裝程序製作。NSIS比較適合C開發的產品的安裝程序製作。推薦Inno Setup + ISSI (Inno Setup Script Includes) + ISTool來製作安裝程序。


每日構建

    如果一個公司還是採用手工方式編譯發佈軟件,那一定會出問題,比如將某個中文文件打包到英文版裏發佈出去,比如發佈的軟件的版本並非最終的版本。

    爲了確保軟件發佈的穩定性,不管大小公司都應該制定一套軟件發佈流程,並用工具來固化這個流程。

    流程首先是從版本控制軟件獲取最新或特定版本的代碼以及資源,對代碼以及資源做必要的預處理(比如修改版本號,自動代碼審查),編譯代碼,編譯資源(例如幫助),編譯中出現錯誤自動反饋(比如發送郵件),編譯成功後自動進行單元測試(測試失敗也會自動反饋;編譯成功但是出現的警告與提示也應自動反饋),測試通過後製作安裝程序,發佈軟件(比如上傳到某個FTP,複製到某個目錄)。這些流程很繁瑣,如果由人來執行是不可靠的,所以要由軟件來實現這個流程。

    代碼審查:檢查代碼中是否存在不符合事先約定的代碼規範的動作。比如.NET下的FxCop就是用來做代碼審查。在Delphi中需要自己實現審查器,加上利用正則表達式定義的代碼審查規則(比如控件命名是否規範,窗體上是否使用的英文字體,公用方法上是否標有註釋等)。代碼審查用人工實現是沒有效率的,同時也是不可靠的,利用DailyBuild來實現自動代碼審查能夠保證代碼質量,甚至於提前發現代碼中的隱患。

    可以用腳本實現每日構建:比如Perl, PowerShell, 批處理等,當然只適合一些簡單場合,而且對於維護腳本的人員的要求也相對較高。

    Java有Ant,.NET有Nant,同樣Delphi有Want(爲什麼叫Want而非Dant,原來Want是取Windows Ant之意,雖然Kylix可以在Linux運行,Free Pascal可以在更多的平臺下運行,但是想到Want是一個命令行工具,want clean, want compile, want build,看起來很不錯,於是作者還是決定用Want), Want是用XML作爲配置文件,維護起來稍微有點麻煩,不過維護好XML以後執行構建的時候有WantUI界面可以使用,還算挺方便的。

    FinalBuilder,一個完全的圖形化構建工具,支持腳本,很好用,支持的工具也很多,唯一的缺點就是這是一個收費軟件。

    Visual Build Professional,同樣是一個可視化的構建工具,也支持腳本,支持宏,還支持虛擬機,同樣也是一個收費軟件。

 

網絡資源

    http://www.torry.net上有很多的Delphi資源,裏面有不少優秀的免費控件與代碼。

    隨着時間的流逝,我們手上應該積累了很多的開發資源,比如電子書、文章、源碼、開發工具等等,應該將其準確命名並分類存放於不同的目錄中,如果體積太大,可以刻錄成光盤並用WhereIsIt編目後妥善保管。像那些比較零散的文章、代碼等,可以考慮使用一個文檔管理軟件管理起來,比如MyBase、EverNote等。管理的知識可以與他人分享交流,共同學習提高。


其他補充

    JEDI Project:JEDI Code Library 和 JEDI VCL 是Delphi下最大的兩個開放源代碼的工程,值得好好研究。

    KOL+MCK:VCL的確很方便,可是代價便是程序體積的增加,KOL(Key Objects Library)+MCK(Mirror Classes Kit)便是VCL的一個替代品。

    DWPL(The Delphi WDosX Project Library):讓Delphi編譯的Console程序能夠運行在DOS下。換句話說就是開發32位的DOS程序,用Turbo/Borland Pascal開發的是16位程序。

    Free Pascal/Lazarus:Free Pascal是一個32位的編譯器,並且支持多平臺,也可以算是Delphi的一個近親,另外一個是TMT Pascal。Lazarus則是一個Free Pascal的集成開發環境,界面類似Delphi。

 

轉自:http://hi.baidu.com/haiyad/blog/item/fc5766d301c0b8d9a8ec9ae6.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章