春風(fēng)博客

          春天里,百花香...

          導(dǎo)航

          <2008年1月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統(tǒng)計(jì)

          公告

          MAIL: junglesong@gmail.com
          MSN: junglesong_5@hotmail.com

          Locations of visitors to this page

          常用鏈接

          留言簿(11)

          隨筆分類(224)

          隨筆檔案(126)

          個(gè)人軟件下載

          我的其它博客

          我的鄰居們

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          設(shè)計(jì)構(gòu)建一個(gè)軟件程序的基本步驟探討

          軟件的主要任務(wù)

          軟件的核心任務(wù)不外乎是收集和整理數(shù)據(jù),然后以用戶需要的形式表現(xiàn)給他們而已,此外還有數(shù)據(jù)的存儲(chǔ),數(shù)據(jù)的傳輸?shù)韧鈬蝿?wù)。
          數(shù)據(jù)的收集,整理,表現(xiàn),存儲(chǔ)和傳輸就是軟件的主要任務(wù),它們也是程序員的主要工作內(nèi)容,也是程序員編寫代碼的最終目的。
          那么該如何編寫代碼讓軟件完成它的主要任務(wù)呢?編寫代碼的過程是否有規(guī)律可循?編寫代碼需要注意那些方面的問題?本人想就這些問題羅列自己一些粗淺的看法,并大家進(jìn)行一些探討。

          一.軟件構(gòu)建從需求開始

          需求即用戶對(duì)軟件功能的描述,用戶通過需求告訴程序員他需要收集什么數(shù)據(jù),這些數(shù)據(jù)該怎么處理,最后他希望看到什么結(jié)果。需求中描述的場景和內(nèi)容是軟件處理的核心領(lǐng)域,程序員需要通過代碼把它表現(xiàn)出來。
          即使用戶是和你一樣的程序員,需求也不可能完善到直接指導(dǎo)編碼的地步,而且軟件的構(gòu)建是一個(gè)“邪惡(Wicked)”的過程,也就是說某些問題在設(shè)計(jì)階段并不顯山露水,只有在構(gòu)建過程中它們才會(huì)逐漸暴露出來。這就要求程序員深入問題的領(lǐng)域,了解領(lǐng)域的相關(guān)知識(shí),對(duì)領(lǐng)域做出合理的抽象,并在軟件構(gòu)建過程中不斷完善它,直到完全實(shí)現(xiàn)用戶需求,具備現(xiàn)代軟件的八個(gè)主要特征。

          二.何謂領(lǐng)域和領(lǐng)域模型

          領(lǐng)域即業(yè)務(wù)領(lǐng)域,是用戶進(jìn)行業(yè)務(wù)活動(dòng)的主要內(nèi)容。一些領(lǐng)域是和現(xiàn)實(shí)世界中的實(shí)體對(duì)應(yīng)的:如雇員管理系統(tǒng)中的雇員,圖書管理系統(tǒng)中的圖書,零售系統(tǒng)中的商品,而有些領(lǐng)域和現(xiàn)實(shí)世界中的虛擬實(shí)體相對(duì)應(yīng):如金融系統(tǒng)中的借貸關(guān)系,商務(wù)系統(tǒng)中的合同關(guān)系等。
          軟件的主要任務(wù)是數(shù)據(jù)的收集,整理,表現(xiàn),存儲(chǔ)和傳輸,而數(shù)據(jù)的基本單位就是領(lǐng)域模型。
          領(lǐng)域模型是現(xiàn)實(shí)世界中的實(shí)體在代碼中的體現(xiàn)和合理抽象,它能表現(xiàn)出實(shí)體的基本信息。如果可以說軟件環(huán)境是現(xiàn)實(shí)業(yè)務(wù)活動(dòng)在計(jì)算機(jī)世界的模擬的話,那領(lǐng)域模型就是現(xiàn)實(shí)實(shí)體在計(jì)算機(jī)世界的模擬。

          三.軟件構(gòu)建的核心是領(lǐng)域模型的建立

          領(lǐng)域模型是軟件需要處理的數(shù)據(jù)的基本單元,只有建立起了領(lǐng)域模型,你才能知道軟件需要收集,整理,表現(xiàn),存儲(chǔ)和傳輸?shù)膶?duì)象是什么。
          建立領(lǐng)域模型是軟件構(gòu)建的核心環(huán)節(jié),如果它沒有被合理抽象出來的話,軟件能提供的服務(wù),數(shù)據(jù)的持久化和數(shù)據(jù)在軟件中的表現(xiàn)都是空中樓閣,因此我們可以說,從現(xiàn)實(shí)世界中的實(shí)體中抽象出合理的領(lǐng)域模型是軟件構(gòu)建中提綱挈領(lǐng)的一個(gè)環(huán)節(jié),這一步是軟件各個(gè)層次的基石,也是軟件構(gòu)建的起點(diǎn)。

          不建立領(lǐng)域模型并非一定不能造就出能運(yùn)轉(zhuǎn)正常的軟件,所謂的表維護(hù)程序就是典型例子,它們由某些懶惰,愚蠢和無能的程序員造就,他們從來不去認(rèn)真思考用戶究竟想知道什么,程序究竟在處理什么,而是翻譯堆砌代碼,僅僅讓它能跑出一個(gè)正確的結(jié)果而已,這樣的程序員永遠(yuǎn)成為不了優(yōu)秀的程序員,他們生產(chǎn)出的代碼也是一堆有危害性的幾乎無法維護(hù)的垃圾,這堆垃圾將給公司和個(gè)人帶來潛在的危害,相對(duì)而言,對(duì)個(gè)人的危害性更大,有時(shí)甚至可以斷送一個(gè)程序員的職業(yè)生涯。

          四.如何建立起領(lǐng)域模型

          途徑一:分析業(yè)務(wù)中的業(yè)務(wù)流和業(yè)務(wù)規(guī)則,從中歸納出功能的基本單位,這個(gè)基本單位就是領(lǐng)域模型之一或領(lǐng)域模型的一部分.

          途徑二:從原型界面中觀察顯示的數(shù)據(jù),它們是領(lǐng)域模型的外在體現(xiàn).

          途徑三 :從持久化介質(zhì)中推導(dǎo)領(lǐng)域模型,如從數(shù)據(jù)庫的表結(jié)構(gòu)和ER圖中推導(dǎo)領(lǐng)域模型.

          途徑四:向領(lǐng)域?qū)<覇栐儤I(yè)務(wù)流程中的核心單元是什么,甚至自己進(jìn)入問題領(lǐng)域去學(xué)習(xí)探究。

          途徑五:將不熟悉的領(lǐng)域和相似的自己熟悉的領(lǐng)域做對(duì)照,類比出領(lǐng)域模型。

          途徑六:從已有的知識(shí)系統(tǒng)中學(xué)習(xí),參考功能相似的軟件代碼,向優(yōu)秀代碼學(xué)習(xí)。

          五.如何完善領(lǐng)域模型

          領(lǐng)域模型是經(jīng)常發(fā)生相互聯(lián)系的,上一步只是建立了孤立的,僅能表現(xiàn)單個(gè)領(lǐng)域?qū)ο笮畔⒌哪P?要使它們豐富完善起來,需要做以下工作:

          1) 從程序的功能角度入手,考慮需要幾個(gè)領(lǐng)域?qū)ο蟛拍芡瓿蛇@個(gè)功能,再由此考慮領(lǐng)域?qū)ο笾g的聯(lián)系.這方面的典型例子是需要雇員類和資源類的協(xié)助,借貸關(guān)系才能完整的表現(xiàn)出來.

          2) 從領(lǐng)域?qū)ο蟊旧砣胧?考慮領(lǐng)域?qū)ο笾g是否有級(jí)聯(lián),回溯,包含等常見關(guān)系.如個(gè)人信息包含地址信息,公司類和雇員類的級(jí)聯(lián)關(guān)系,雇員類查找自己所屬公司的回溯關(guān)系等.

          3) 從反持久化入手,考慮把一個(gè)領(lǐng)域?qū)ο髲拇鎯?chǔ)介質(zhì)中提取出來需要那些領(lǐng)域?qū)ο蟮膸椭?這些領(lǐng)域?qū)ο笫峭ㄟ^那種方式聯(lián)系在一起的,這方面的典型例子是表之間的主鍵和外鍵,領(lǐng)域?qū)ο笸瑯右惨哂邢鄬?duì)應(yīng)的成員變量.

          六.領(lǐng)域?qū)ο笤O(shè)計(jì)完成之后

          一旦領(lǐng)域?qū)ο笤O(shè)計(jì)完成,程序的設(shè)計(jì)工作就可以說完成了一大半,其余工作都是圍繞領(lǐng)域?qū)ο髞磉M(jìn)行,這些工作有:
          1) 從考慮怎么為領(lǐng)域?qū)ο蠓?wù)入手,為領(lǐng)域?qū)ο笤O(shè)計(jì)服務(wù)類,服務(wù)類的常用方法有添加,刪除,更新,查詢領(lǐng)域?qū)ο笏姆N以及從ID取得一個(gè)領(lǐng)域?qū)ο?判斷持有某個(gè)ID的領(lǐng)域?qū)ο笫欠翊嬖诘?具體的操作實(shí)際上由服務(wù)類的持久層類成員完成,服務(wù)類實(shí)際上起到的是一個(gè)領(lǐng)域?qū)ο笊舷聜鬏斖ǖ赖淖饔?一般來說Service層的六大函數(shù)是add,delete,update ,search, hasId(String id), getById(String id))再加上一些用于查詢的函數(shù)。

          2) 考慮到實(shí)現(xiàn)服務(wù)類中要求的方法,設(shè)計(jì)持久層類,其中的成員函數(shù)基本是服務(wù)類的六大方法的具體化,持久層類實(shí)際上起到一個(gè)把領(lǐng)域?qū)ο蟠鎯?chǔ)到持久介質(zhì)中和從持久介質(zhì)中取出領(lǐng)域?qū)ο蟮淖饔?如果持久層是關(guān)系型數(shù)據(jù)庫的話,還需要設(shè)計(jì)領(lǐng)域?qū)ο髮?duì)應(yīng)的表以及表之間的關(guān)系ER圖。

          3) 從功能的角度設(shè)計(jì)控制層的函數(shù)和類,在這里控制層類調(diào)用服務(wù)層類來操作領(lǐng)域?qū)ο?業(yè)務(wù)邏輯主要體現(xiàn)在這里.

          4) 從領(lǐng)域?qū)ο蟮妮斎胼敵龊捅憩F(xiàn)的角度設(shè)計(jì)各個(gè)表現(xiàn)層類.設(shè)計(jì)這一層類時(shí)應(yīng)該從用戶立場考慮而不是從代碼編寫者的立場考慮,怎么讓用戶感到直觀,方便,快捷就怎么設(shè)計(jì)界面.

          5) 在設(shè)計(jì)上述層次的同時(shí),考慮到減少重復(fù)代碼,突出主干代碼而設(shè)計(jì)實(shí)用層類,把共通的操作都?xì)w納到一起,這樣既提高的代碼的清晰程序和可讀性,也使修改變得方便容易起來.

          6) 如果有些變量在使用過程中是可能發(fā)生變化的,如數(shù)據(jù)庫的地址,業(yè)務(wù)中一些硬編碼信息等,這樣的量就不該硬編碼(Hard Code)在程序中,否則修改后還需要重新編譯,打包,發(fā)布.而應(yīng)該把這些量寫在XML形式的配置文件里,在程序啟動(dòng)時(shí)讀取.

          七.軟件的六大層次

          上頁的工作完成后,我們會(huì)得到以下六大層次:
          1) Domain層
          2) Service層(允許Control層訪問,能訪問Persistence層)
          3) Persistence層(也稱為DAO層,只允許Service層訪問)
          4) Control層(訪問Service層和View層)
          5) View層(僅被Control層訪問)
          6) Util層

          八.一定要限制各層之間的無規(guī)則通信



          如果不規(guī)定各層之間的通信規(guī)則,那么它們之間的通信將會(huì)肆意的發(fā)生,這將使軟件結(jié)構(gòu)混亂直到不可收拾的地步。
          在分層中,有一點(diǎn)特別重要,即不同層次之間相互通信的規(guī)則。如果所有的層次都能和其它層次通信,你就完全失去了把它們分開帶來的好處,應(yīng)該通過限制層次之間的通信來讓每個(gè)層次更加有意義

          九.逐步完善六大層次中類的各個(gè)具體函數(shù)


          這一層的設(shè)計(jì)包括把每個(gè)類細(xì)分為子程序。在上一步已經(jīng)定義了其中一些子程序,這一步將使類更加細(xì)化豐富起來。
          完整的定義出類內(nèi)部的子程序,常常有助于更好的理解類的接口,反過來,這又有利于對(duì)類的接口進(jìn)行進(jìn)一步的修改。
          將類分解為子程序時(shí):首先要想到這個(gè)類的基本功能和在類層次中的定位是什么?其次要想到它被上級(jí)類調(diào)用的接口是什么和它該怎么調(diào)用下級(jí)類?再次要想到為豐富這些接口類中還需要那些字段和方法?最后考慮是用返回值還是異常來控制程序流程。

          十.繪出各層次類的靜態(tài)類圖


          靜態(tài)類圖能幫助我們思考各類之間的關(guān)系和類內(nèi)部的各函數(shù),通過靜態(tài)類圖我們還能發(fā)現(xiàn)各類共通的接口,由此可以對(duì)已有的類進(jìn)行進(jìn)一步抽象和歸納.

          十一.最后的步驟:子程序內(nèi)部的設(shè)計(jì)



          在子程序?qū)哟紊线M(jìn)行設(shè)計(jì)就是為每個(gè)子程序布置詳細(xì)的功能。這里的設(shè)計(jì)工作包括繪制流程圖,選擇算法,組織子程序內(nèi)部的代碼塊,考慮和工具層類的調(diào)用關(guān)系以及最后用編程語言編寫代碼。
          在書寫代碼時(shí),可能會(huì)遇到復(fù)雜的處理,這時(shí)可以通過流程圖來理清思路,幫助思考.

          十二.軟件的最終需要具備的現(xiàn)代軟件的八個(gè)典型特征

          最小的復(fù)雜度:整個(gè)系統(tǒng)可以分解為簡單而易于理解的各個(gè)部分.
          易于維護(hù):程序有良好的可維護(hù)性.
          松散耦合,通過應(yīng)用類接口中的合理抽象,封裝性以及信息隱藏等原則,設(shè)計(jì)出相互關(guān)聯(lián)盡可能最少的類.
          適應(yīng)變化: 能在不改變系統(tǒng)基本構(gòu)架的基礎(chǔ)上,適應(yīng)未來的變化,有良好的擴(kuò)展性,程序可擴(kuò)展,可重用.
          有明晰的層次,每層各司其職,有良好分工.
          高扇入低扇出:系統(tǒng)很好的利用了較低層次上的工具類,重復(fù)代碼很少或沒有.
          有良好的規(guī)范:無論多少人參與了項(xiàng)目,從代碼看來猶如出自一人之手.
          使用標(biāo)準(zhǔn)技術(shù).(以上八點(diǎn)來自<<代碼大全2>>)

          軟件編寫完成后,可以自我審核一下看看是否達(dá)到了這些特征。

          以上。

          posted on 2008-01-26 21:19 sitinspring 閱讀(3115) 評(píng)論(10)  編輯  收藏 所屬分類: Object Orient Programming 、隨想錄

          評(píng)論

          # re: 設(shè)計(jì)構(gòu)建一個(gè)軟件程序的基本步驟探討 2008-01-27 15:25 山風(fēng)小子

          寫的很好,那些沒有抽象出領(lǐng)域模型的項(xiàng)目的確讓人無法忍受~  回復(fù)  更多評(píng)論   

          # re: 設(shè)計(jì)構(gòu)建一個(gè)軟件程序的基本步驟探討 2008-01-28 15:09 javajava

          以前不知道有“領(lǐng)域模型”這么一個(gè)概念,尤其是“領(lǐng)域”這個(gè)詞。
          經(jīng)過lz的解釋個(gè)人理解就是用面向?qū)ο蟮姆椒ㄈシ治鰳I(yè)務(wù),把業(yè)務(wù)中的一個(gè)個(gè)抽象的東西具體為一個(gè)個(gè)對(duì)象。這些對(duì)象就是模型中的實(shí)體,然后再去分析實(shí)體間的關(guān)系,具體體現(xiàn)在數(shù)據(jù)庫設(shè)計(jì)和代碼框架設(shè)計(jì)上來。正如lzER圖和類圖。
          這樣的設(shè)計(jì)步驟很清晰也很實(shí)用,不知道lz在中間這些環(huán)節(jié)都用的哪些工具來提升設(shè)計(jì)效率和準(zhǔn)確率(設(shè)計(jì)與實(shí)現(xiàn)相符)?  回復(fù)  更多評(píng)論   

          # re: 設(shè)計(jì)構(gòu)建一個(gè)軟件程序的基本步驟探討 2008-01-28 20:48 如坐春風(fēng)

          @javajava

          慚愧,主要工具就是Visio。  回復(fù)  更多評(píng)論   

          # re: 設(shè)計(jì)構(gòu)建一個(gè)軟件程序的基本步驟探討 2008-02-01 10:29 落Nicety

          寫的不錯(cuò)~~
          基于領(lǐng)域模型設(shè)計(jì)是新興軟件設(shè)計(jì)方法 與 基于數(shù)據(jù)庫的軟件設(shè)計(jì)方發(fā)相比較優(yōu)點(diǎn)是更符合業(yè)務(wù)邏輯,缺點(diǎn)是最后產(chǎn)生的數(shù)據(jù)庫表會(huì)有很多的關(guān)聯(lián)表,對(duì)性能差生影響。
          往往 加載一個(gè)領(lǐng)域?qū)ο笞罱K是對(duì)數(shù)據(jù)庫中多個(gè)表進(jìn)行操作。
          所以設(shè)計(jì)領(lǐng)域模型的時(shí)候還是要兼顧數(shù)據(jù)庫設(shè)計(jì)。
          另外,基于領(lǐng)域模型設(shè)計(jì)的軟件往往都需要二級(jí)緩存的支持。  回復(fù)  更多評(píng)論   

          # re: 設(shè)計(jì)構(gòu)建一個(gè)軟件程序的基本步驟探討 2008-02-01 17:27 如坐春風(fēng)

          @落Nicety

          有道理,謝謝。

          關(guān)于二級(jí)緩存的解決方案,你有什么推薦的嗎?  回復(fù)  更多評(píng)論   

          # re: 設(shè)計(jì)構(gòu)建一個(gè)軟件程序的基本步驟探討 2008-02-02 09:51 落Nicety

          @如坐春風(fēng)
          2級(jí)緩存我用的也不多。
          如果使用hibernate的話,用他自帶的EhCache.進(jìn)行一些簡單的配置就可以使用了。hibernate也支持其他二級(jí)緩存插件。用起來還比較容易。
          但是話說回來,涉及到內(nèi)存管理的東西都比較復(fù)雜。有時(shí)候會(huì)出現(xiàn)內(nèi)存和數(shù)據(jù)庫不一致的情況。這還需要更進(jìn)一步的研究。這方面的經(jīng)驗(yàn)我也不是很多。
          不過據(jù)說 jboss的cache也挺好用的。
          如果要用 你可以嘗試~~  回復(fù)  更多評(píng)論   

          # re: 設(shè)計(jì)構(gòu)建一個(gè)軟件程序的基本步驟探討[未登錄] 2008-03-25 12:43 xw

          請問領(lǐng)域?qū)ο笾械姆椒ㄔ趺磳?shí)現(xiàn),可能需要DAO中的方法,
          也可能造成事務(wù)不好處理  回復(fù)  更多評(píng)論   

          # re: 設(shè)計(jì)構(gòu)建一個(gè)軟件程序的基本步驟探討[未登錄] 2008-03-25 12:57 如坐春風(fēng)

          @xw

          如果涉及多個(gè)領(lǐng)域?qū)ο蟮牟僮骺梢杂肑TA進(jìn)行事務(wù)管理.  回復(fù)  更多評(píng)論   

          # re: 設(shè)計(jì)構(gòu)建一個(gè)軟件程序的基本步驟探討[未登錄] 2008-03-25 17:40 xw

          但是如果用spring聲明 事務(wù) 就不好處理了
          現(xiàn)在很多都用貧血模型的
          你的應(yīng)該是充血模型,當(dāng)然比較oo  回復(fù)  更多評(píng)論   

          # re: 設(shè)計(jì)構(gòu)建一個(gè)軟件程序的基本步驟探討 2008-03-26 14:25 如坐春風(fēng)

          @xw

          OO也有幾個(gè)棘手的地方,一是你說的事務(wù)處理;二是異常的處理.

          異常麻煩在與領(lǐng)域?qū)ο筇幚聿涣舜水惓r(shí)需要往上拋,如果多個(gè)領(lǐng)域?qū)ο蠛献髂峭饨缣幚淼拇a結(jié)構(gòu)就容易亂;不拋的話又存在隱患.比較讓人頭疼.  回復(fù)  更多評(píng)論   

          sitinspring(http://www.aygfsteel.com)原創(chuàng),轉(zhuǎn)載請注明出處.
          主站蜘蛛池模板: 大方县| 平度市| 望奎县| 临安市| 剑河县| 乌什县| 平邑县| 文安县| 永兴县| 密山市| 旺苍县| 黄平县| 盐津县| 淳化县| 布尔津县| 新晃| 大埔区| 民丰县| 通榆县| 大丰市| 金坛市| 安平县| 开阳县| 大冶市| 平泉县| 镇雄县| 南陵县| 北川| 铅山县| 吴江市| 福贡县| 郎溪县| 太白县| 陈巴尔虎旗| 渑池县| 县级市| 馆陶县| 襄汾县| 宁陵县| 齐河县| 黄山市|