日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

6.2 类模型

發(fā)布時間:2024/3/26 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 6.2 类模型 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

【引子】

【師傅領(lǐng)進門,修行在個人】

????“類模型”是整個面向?qū)ο笤O(shè)計模型的核心,是面向?qū)ο笤O(shè)計階段的主要輸出,也是設(shè)計師們最能夠發(fā)揮自己才能的地方。

????雖然“類模型”如此重要,但面向?qū)ο笤O(shè)計技術(shù)經(jīng)過幾十年的發(fā)展后,目前已經(jīng)形成了很成熟的一套體系,因此真正在進行“類模型”設(shè)計的時候,其實難度并不高,這也是多虧了眾多前輩們的無私貢獻,才能使得我們這些蕓蕓眾生也能輕松掌握這些原本帶有藝術(shù)色彩的技能。

????不過話又說回來了,入門容易精通難,“類模型”的設(shè)計也是如此,雖然有前輩們各種各樣的思想結(jié)晶指導(dǎo)著我們,但畢竟如何理解、如何應(yīng)用這些思想結(jié)晶,還是要看個人的領(lǐng)悟力和把握力。就像同樣的《葵花寶典》,岳不群看了創(chuàng)立了氣宗,蔡子峰看了創(chuàng)立了劍宗,渡元禪師聽了后悟出了辟邪劍法,東方不敗看了竟然練出了繡花針絕技!所以接下來的內(nèi)容,也只是“師父領(lǐng)進門,修行在個人”,如果希望做出優(yōu)秀的設(shè)計,更多還是依靠個人的領(lǐng)悟和實踐!

【設(shè)計的魔法崇拜】

????面向?qū)ο箢惖脑O(shè)計很多時候都蒙上了一層神秘的面紗。一個常見的場景是:“設(shè)計師”拿到需求后,經(jīng)過一段時間的設(shè)計,感覺就像變戲法一樣,然后就拿出了一個類模型。普通的開發(fā)人員看到這樣的類模型,很難想象如何從需求才能夠得到了這些類,由于大部分公司的設(shè)計人員確實也都是公司里面的牛人,因此大家就自然而然地認為這是水平和創(chuàng)造力的表現(xiàn),心底不由得產(chǎn)生由衷的贊嘆:“牛逼啊!”

????我稱這種現(xiàn)象為設(shè)計的“魔法崇拜”,具體表現(xiàn)就是認為設(shè)計是一種魔法,做設(shè)計的人是魔法師,只有牛逼的人才能夠做設(shè)計。

????但這種認識并不準(zhǔn)確,就像我們前面提到的,面向?qū)ο箢I(lǐng)域已經(jīng)發(fā)展了幾十年,各種思想、理論都已經(jīng)基本成熟,絕大部分人在做設(shè)計的時候,都不可能有什么天才的創(chuàng)新或者天才的靈感,而只是這些已經(jīng)成熟的思想和理論的應(yīng)用而已。

????之所以現(xiàn)在還會出現(xiàn)這種現(xiàn)象,主要原因還是在于各種思想、理論、方法都是針對具體問題的分析或者總結(jié),但并沒有誰明確的將這些東東形成一套完整的面向?qū)ο笤O(shè)計體系。

????可能很多人都有這種感覺:面向?qū)ο笪乙捕?#xff0c;設(shè)計模式我也知道,設(shè)計原則我也明白,但真的要進行設(shè)計的時候,就不知道如何下手了,比如說:

  • 對象從哪里來?
  • 什么時候用設(shè)計模式?
  • 如何判斷設(shè)計是否正確?
  • 什么樣的設(shè)計才是優(yōu)秀的設(shè)計?
  • 。。。。。。。。。。。

????正因為存在這樣的原因,我們自然會對那些能夠設(shè)計出完整的類模型的設(shè)計師們刮目相看了。

????其實面向?qū)ο笤O(shè)計并不是什么高深的技術(shù),也不需要天才的創(chuàng)新,更不需要變魔法,而是有章可循的,只要我們按照一定的步驟,一步一個腳印,不斷精益求精,就能夠完成面向?qū)ο蟮脑O(shè)計。

????但正如前面提到的一樣,面向?qū)ο笤O(shè)計更多的時候是一門藝術(shù)。雖然我們按照一定的步驟能夠完成面向?qū)ο蟮脑O(shè)計,但在這些步驟實施的過程中,如何應(yīng)用相關(guān)技術(shù),如何做出設(shè)計選擇等,更多時候是帶有藝術(shù)色彩的。就像很多人都會彈吉他,但真正的吉他大師彈出來的感覺,肯定和一個普通人彈的不一樣。

????接下來就為大家展示面向?qū)ο笤O(shè)計的具體步驟。

?

6.2.1 第一步(照貓畫虎):領(lǐng)域類映射

? ? 進行面向?qū)ο箢愒O(shè)計時,首先要解決的一個問題是:類從哪里來??

????有的人可能會認為,要發(fā)揮想象力、創(chuàng)造力。。。。。等各種“力”——這種方法的主要問題是:我們不是在進行純粹的藝術(shù)創(chuàng)造,而是要最終滿足客戶需求,而不能天馬行空。

????有的人可能會想到,參考其它的系統(tǒng)吧,把類似系統(tǒng)拿過來改吧改吧 ——這種方法的主要問題是:如果沒有其它類似系統(tǒng)給你參考呢 ?
????還有的人干脆就說:拍腦袋吧,憑感覺吧 —— 這種方法的主要問題是:猴子能敲出莎士比亞全集么 ?

????看起來以上方法都不太可行,那究竟如何才能從哪里找到我們需要的類呢?

????相信絕大部分認真看書的同學(xué)都會靈光一閃:領(lǐng)域模型。
????我們將上一章中的領(lǐng)域模型圖拿出來,重新再看一下:

????相信不用我多說,絕大部分同學(xué)一眼就能看出:哇塞,這不就是類么?

????確實是這樣的,領(lǐng)域模型中的“領(lǐng)域類”,是設(shè)計模型中“軟件類”最好的來源。通過“領(lǐng)域類”來啟發(fā)我們設(shè)計最初的“軟件類”,具有如下幾個明顯的優(yōu)點

  • 軟件類來自領(lǐng)域類,領(lǐng)域類來自用例,用例來自客戶,這樣一環(huán)扣一環(huán),軟件類的正確性得到了保證,不用擔(dān)心拍腦袋帶來的問題;
  • 領(lǐng)域類到軟件類的轉(zhuǎn)換非常簡單,不需要天才的創(chuàng)新,或者豐富的想象力,只要掌握基本的面向?qū)ο蟮闹R就能完成,菜鳥也能做設(shè)計;
  • 不需要參考其它系統(tǒng),不用擔(dān)心沒有參照物時無法設(shè)計的問題;

????從領(lǐng)域類到軟件類的轉(zhuǎn)換操作非常簡單,基本上就是一個照貓畫虎的過程。


【類篩選】
????雖然我們說從領(lǐng)域類到軟件類是一個照貓畫虎的過程,但并不意味著將領(lǐng)域類全盤拷貝過來即可。主要的原因在于“軟件類”是軟件系統(tǒng)內(nèi)部的一個概念,而領(lǐng)域類是業(yè)務(wù)領(lǐng)域的概念,并不是每個領(lǐng)域類最終都會體現(xiàn)在軟件系統(tǒng)中。

????以POS機的領(lǐng)域類為例,領(lǐng)域類“顧客”不需要轉(zhuǎn)換為軟件類,因為顧客是POS機業(yè)務(wù)領(lǐng)域的一個重要參與者,但并不是POS機內(nèi)部需要實現(xiàn)的一個實體,在POS機業(yè)務(wù)中,顧客甚至都不是和POS機直接交互的實體,站在POS軟件系統(tǒng)的角度來說,顧客和POS機其實沒有任何關(guān)系。

????對于屏幕、鍵盤、掃描儀這些輸入輸出設(shè)備,一般情況下我們認為它們是POS機系統(tǒng)硬件的一部分,而并不是POS機軟件系統(tǒng)的一部分。但假如POS機有一個需求是既支持圖形界面輸出,又支持字符界面輸出,那么POS的軟件系統(tǒng)就需要處理這種和屏幕相關(guān)的需求了,此時屏幕就是POS機軟件系統(tǒng)的一部分了,需要將領(lǐng)域類轉(zhuǎn)換為軟件類。為了簡單處理,接下來的分析中,輸入輸出設(shè)備不做轉(zhuǎn)換。

????經(jīng)過篩選后,剩下的領(lǐng)域類就需要都轉(zhuǎn)換為軟件類,具體如下:
????收銀員、商品、交易、小票、支付、信用卡、會員卡、現(xiàn)金、購物卡。

【名稱映射】
????篩選完成后,我們開始講領(lǐng)域類轉(zhuǎn)換為軟件類,轉(zhuǎn)換的方法很簡單,首先不管三七二十一,將每個領(lǐng)域類都用一個軟件類與對應(yīng),名稱都保持一樣即可。

????有的同學(xué)可能擔(dān)心這樣設(shè)計是否會不符合面向?qū)ο笤O(shè)計的要求,是否會導(dǎo)致設(shè)計質(zhì)量不高。。。。。。等等,其實這種擔(dān)心是多余的,因為我們后續(xù)還有很多工作要做,目前做的只是一個開始工作。

【屬性映射】
????通過名稱映射的方法得到軟件類后,接下來就是要設(shè)計類的屬性了。由于領(lǐng)域類中也已經(jīng)有了屬性,因此我們也只需簡單的照搬過來即可。

【提煉方法】
????軟件類的屬性設(shè)計完成后,接下來就需要設(shè)計軟件類的方法了。但這次我們就沒有那么好的運氣了,因為領(lǐng)域類中并沒有方法!因此我們不能通過簡單映射的方法來獲取方法,必須采取其它手段。

????和類的設(shè)計一樣,類方法的設(shè)計同樣不能采取“創(chuàng)造力、參考其它系統(tǒng)、拍腦袋”等方式來完成,為了確保正確性,類的方法設(shè)計也同樣應(yīng)該能夠從已有的模型中推導(dǎo)出來。

????由于已經(jīng)明確領(lǐng)域模型中沒有方法了,因此就不能從領(lǐng)域模型中得到軟件類的方法,剩余只有一個“用例模型”了,因此我們鎖定“用例模型”,看看如何從中找到我們所需要的方法。

????其實方法也很簡單,概括一下就是:找動詞
????你可能不敢相信自己的眼睛,這么簡單,那幾乎初中生都會做設(shè)計啊,找動詞誰不會呢?

????然而不管你信不信,這一步確實是這么簡單,當(dāng)然,如果面向?qū)ο笤O(shè)計只是到此為止,那確實初中生也是可以做的,但實際上這只是面向?qū)ο箢愒O(shè)計的開始步驟而已,后面的工作還多著了,所以完全不用擔(dān)心初中生來搶你的飯碗。

????我們以POS機為例,來看看如何通過“找動詞”這種技巧來找到軟件類的方法。
????如下是POS機的用例,我們將相關(guān)動詞都加粗顯示:

【用例名稱】

買單

【場景】

Who:顧客、收銀員

Where:商店的收銀臺

When:營業(yè)時間

【用例描述】

1.?顧客攜帶選擇好的商品到收銀臺;

(這一步?jīng)]有異常)

2.?收銀員逐一掃描商品條形碼,系統(tǒng)根據(jù)條形碼查詢商品信息;

2.1?掃描儀壞了,必須支持手工輸入條形碼;

2.2?商品的條形碼無法掃描,必須支持手工輸入條形碼;

2.3?條形碼能夠掃描,但查詢不到信息,需要收銀員和顧客溝通,放棄購買此產(chǎn)品

3.?掃描完畢,系統(tǒng)顯示商品總額,收銀員告訴顧客商品總額;

(這一步?jīng)]有異常)

4.?顧客將錢交給收銀員;

4.1?顧客的錢不夠,顧客和收銀員溝通,刪除某商品;

4.2?顧客的錢不夠,顧客和收銀員溝通,刪除某類商品中的一個或幾個(例如買了5包煙,去掉兩包)

4.3?顧客覺得某個商品價格太高,要求刪除某商品;

4-A:顧客使用信用卡支付

4-A.1?信用卡支付流程(請讀者自行思考完善,可以寫在這里,如果太多,也可以另外寫一個子用例)

4-B:顧客使用購物卡支付

????????4-B.1?購物卡支付流程

4-C:顧客使用會員卡積分支付

????????4-C.1?會員卡積分支付流程

5.?收銀員清點錢數(shù),輸入收到的款額,系統(tǒng)給出找零的數(shù)目;

(這一步?jīng)]有異常)

6.?收銀員將找零的錢還給顧客,并打印小票;

7.?買單完成,顧客攜帶商品和小票離開

【用例價值】

顧客買完單以后,就可以攜帶商品離開,而超市也將得到收入;

【約束和限制】

1.?POS機必須符合國標(biāo)XXX;

2.?鍵盤使用中文,因為收銀員都是中國人;

3.?一次買單數(shù)額不能超過99999RMB;

4.?POS機要非常穩(wěn)定,至少一天內(nèi)不要出現(xiàn)故障;


標(biāo)識出所有的動詞后,還需要進一步的工作:
【篩選】
????并不是所有的動詞都一定是軟件類的方法,我們需要將這些動詞識別出來并排除在后續(xù)設(shè)計范圍之外。
????例如:

  • ?“顧客攜帶選擇好的商品到收銀臺”:這里的“攜帶”是顧客的一個動作,而顧客并不是我們的軟件類;
  • “收銀員告訴顧客商品總額”:這里的“告訴”確實是收銀員的一個動作,而且“收銀員”確實也是我們的軟件類,但這里也要排除“告訴”,因為“告訴”這個動作和POS系統(tǒng)并沒有關(guān)系,只是業(yè)務(wù)流程中的一個步驟而已。
  • ????????其它需要排除的動詞還有:“需要收銀員和顧客溝通”、“顧客將錢交給收銀員”、“收銀員清點錢數(shù)”、“收銀員將找零的錢還給顧客”、“顧客攜帶商品和小票離開”


    【提煉】
    ????篩選完不需要的動詞后,剩下的就是我們需要的動詞了,但此時并不能簡單的將所有動詞拿出來直接扔給某個軟件類就行了,我們還需要進行一些加工。

    ????繼續(xù)以POS機為例:
    ????“收銀員逐一掃描商品條形碼”:這里的“掃描”看起來是“收銀員”的一個動作,而且“收銀員”確實也是我們的軟件類,但其實深究一下,“掃描”這個動詞并不能分配給“收銀員”這個軟件類,因為真正執(zhí)行“掃描”功能的是“掃描儀”,收銀員只是拿著掃描儀掃描商品,并不是收銀員自己去讀取商品條形碼;類似的動詞還有“必須支持手工輸入條形碼”,也不能算作“收銀員”的功能。

    ????那我們?yōu)槭裁床慌懦@兩個動詞呢?秘密就在于我們要從這兩個動詞提煉出軟件類的方法。稍作分析,我們就可以發(fā)現(xiàn),無論是“掃描條形碼”,還是“手工輸入條形碼”,其實最終的目的都是“添加本次交易的商品”,因此我們可以提煉出“增加交易商品”的動詞。

    ????還有一種提煉的方法需要從已有的動詞中推斷出來,例如:“掃描完畢,系統(tǒng)顯示商品總額”,這里只提到了“顯示”這個動詞,但相信大部分人都能一眼看出,“顯示”之前肯定要“計算”,不然顯示出來的值從哪里來呢?

    ????有的朋友可能會疑惑,為什么不在用例的時候就寫清楚呢?例如:掃描完畢,系統(tǒng)計算商品總額,然后系統(tǒng)顯示商品總額。這樣不就一目了然的看出來了么?

    ????理想情況下這種想法當(dāng)然沒錯,但現(xiàn)實往往沒有那么美好,寫用例的產(chǎn)品人員可能經(jīng)驗不足,也可能表達能力有限,還有可能比較馬虎,或者遺漏了。。。。。。總之會有很多異常情況,因此設(shè)計人員必須具備這樣的推斷和判斷能力。

    經(jīng)過這一步驟后,我們獲得的動詞如下:

    • 增加商品
    • 計算商品總額
    • 顯示商品總額
    • 刪除商品
    • 現(xiàn)金支付
    • 信用卡支付
    • 購物卡支付
    • 會員卡積分支付
    • 打印小票

    ????當(dāng)然,以上列出來的動詞并不是就一定是100%的標(biāo)準(zhǔn)答案,不同的人來進行分析和設(shè)計,可能略有不同,但總體應(yīng)該比較相似,畢竟業(yè)務(wù)是一樣的,而業(yè)務(wù)需求就是設(shè)計最強的約束。

    【分配】
    ????識別出有效的動詞后,最有一步就是分配了,即:將從用例中提煉出來的動詞,分配給已經(jīng)有了屬性的軟件類。這種分配操作很多時候都是按圖索驥,特別是對于有領(lǐng)域經(jīng)驗的人來說,基本上憑直覺就能基本分配正確。

    當(dāng)然,如果你的經(jīng)驗并不是很豐富,那么還是老老實實的一個一個來分析吧。

    以POS機為例:

    • 增加商品:很明顯應(yīng)該分配給“交易”類
    • 計算商品總額:分配給“交易”類
    • 顯示商品總額:分配給“交易”類
    • 刪除商品:分配給“交易”類
    • 現(xiàn)金支付:分配給“現(xiàn)金”類
    • 信用卡支付:分配給“信用卡”類
    • 購物卡支付:分配給“購物卡”類
    • 會員卡積分支付:分配給“會員卡”類
    • 打印小票:這個動詞的分配存在一定的靈活性,有的人可能認為應(yīng)該分配給“交易”類,因為打印小票可以認為是“交易”流程中的一個步驟;有的人可能認為應(yīng)該分配給“小票”類,因為打印小票可以認為是“小票”類的一個基本功能。其實兩者都有一定道理,如果沒有其它更有力的選擇因素,我建議根據(jù)個人經(jīng)驗選擇一個即可,這里我們選擇分配給“小票”。

    ????分配完成后,我們可以看到“交易”、“小票”、“信用卡”、“購物卡”、“會員卡”、“現(xiàn)金”都已經(jīng)有方法了。

    ????當(dāng)然,對于有經(jīng)驗的人來說,以上步驟完全可以在腦海中就迅速完成了,而并不會這樣一步一步的演示給別人看,所以看起來就像變戲法一樣,不知怎么就設(shè)計出來了很多的軟件類。

    ????經(jīng)過上面的處理步驟后,我們得到如下的類圖:


    ????與領(lǐng)域模型相比,部分領(lǐng)域類被剔除了,留下來的領(lǐng)域類映射成軟件類后,又增加了方法。雖然還不完善,但軟件類的是越來越有型,越來越清晰了。


    第三斧(照本宣科):拆分輔助類

    6.2.2?第二步(精雕細琢):應(yīng)用設(shè)計原則和設(shè)計模式

    ????完成了從領(lǐng)域類到軟件類的映射后,類出來了,屬性也出來了,方法也有了,看起來設(shè)計已經(jīng)大功告成了。
    事實上也確實有很多人基本上做到這一步就開始動手編碼了,而且經(jīng)過一番拼搏,最后發(fā)布的系統(tǒng)也能用。

    ????但相信很多人都會有這個疑問:這樣做就夠了么,這樣設(shè)計是否是好的設(shè)計呢?
    要回答這個問題,我們首先要明確:什么叫做“好”的設(shè)計呢??

    ????到目前為止,我們已經(jīng)有了一個類的設(shè)計模型,而且如果按照這個模型去實現(xiàn)的話,最終應(yīng)該也是能夠滿足用戶的需求,畢竟我們這個類模型是按照“需求模型 -> 領(lǐng)域模型 -> 類模型”這樣一路推導(dǎo)過來的,不會出現(xiàn)大的偏差。

    ????那么,滿足了用戶需求的設(shè)計就是好的設(shè)計么?
    ????相信有經(jīng)驗的朋友都會知道答案:“滿足用戶需求”只是設(shè)計的一個最基本要求,而不是一個“好設(shè)計”的評判標(biāo)準(zhǔn)。

    ????既然如此,那么到底什么才是好的設(shè)計呢,是否有明確的標(biāo)準(zhǔn)來進行評價呢?
    ????幸運的是,面向?qū)ο箢I(lǐng)域經(jīng)過幾十年的發(fā)展,確實已經(jīng)發(fā)展出了很多成熟的指導(dǎo)思想和方法,用于評價和指導(dǎo)如何才能做好面向?qū)ο蟮脑O(shè)計。其中最具代表性的就是“設(shè)計原則”和“設(shè)計模式”

    【設(shè)計原則】
    ????當(dāng)我們談到面向?qū)ο箢I(lǐng)域的設(shè)計原則的時候,我們其實都是在談?wù)摿_伯特.C.馬丁(Robert C. Martin ,又叫Bob大叔)的SOLID原則。

    ????這也難怪,Bod大叔實在是太牛了,面向?qū)ο箢I(lǐng)域的設(shè)計原則幾乎被他全部包攬了,加上他在他的暢銷書《敏捷軟件開發(fā):原則、模式與實踐》中詳細的將這些原則集中一 一闡述,面向?qū)ο箢I(lǐng)域設(shè)計原則的權(quán)威非他莫屬。毫不夸張的說,Bob大叔的威名和在面向?qū)ο箢I(lǐng)域中的地位,和設(shè)計模式的“四人幫”是不相上下的。

    ????雖然很多資料都將SOLID原則和敏捷開發(fā)、測試驅(qū)動開發(fā)等方法綁定在一起,但我覺得只要是面向?qū)ο笤O(shè)計,不管是瀑布流程、、CMM流程、RUP流程、還是敏捷開發(fā)流程,都應(yīng)該應(yīng)用設(shè)計原則以提高設(shè)計質(zhì)量。

    ????參考wiki百科,SOLID設(shè)計原則簡單介紹如下:
    ????SOLID實際上是取5個設(shè)計原則的首字母拼起來的一個助記單詞。具體的設(shè)計原則如下(詳細的設(shè)計原則,我們會在后面詳細闡述,這里不再詳細展開):

    首字母

    英文簡寫

    英文名稱

    中文名稱

    說明

    S

    SRP

    Single?Responsibility?Principle

    單一職責(zé)原則

    對象應(yīng)該只具備單一職責(zé)

    O

    OCP

    Open/Close?Principle

    開放/封閉原則

    認為“軟件體應(yīng)該是對于擴展開放的,但是對于修改封閉的”的概念。

    L

    LSP

    Liskov?Substitution?Principle

    Liskov替換原則

    認為“程序中的對象應(yīng)該是可以在不改變程序正確性的前提下被它的子類所替換的”的概念

    I

    ISP

    Interface?Segregation?Principle

    接口隔離原則

    多個特定客戶端接口要好于一個寬泛用途的接口

    D

    DIP

    Dependency?Inversion?Principle

    依賴反轉(zhuǎn)原則

    依賴于抽象而不是一個實例

    前面我們簡單的八卦了一下,現(xiàn)在回歸正題:設(shè)計原則有什么用?

    其實和所有的原則一樣,設(shè)計原則也是一個判斷標(biāo)準(zhǔn),說通俗點,設(shè)計原則就像是木匠手中的尺子,尺子是用來衡量木材的長短的,而設(shè)計原則就是衡量類設(shè)計的“尺子”:量一量,看長了還是短了,還是正好,長了就裁短一些,短了就加長一些。經(jīng)過如此衡量并調(diào)整,最終就能夠得到我們希望的設(shè)計作品。

    當(dāng)然,和木匠的尺子稍有不同,木匠不用尺子就做不出能用的家具,但我們不用設(shè)計原則的話,其實還是能夠做出滿足需求的系統(tǒng)的。

    既然這樣,我們?yōu)槭裁匆欢ㄒ迷O(shè)計原則呢?ARTHUR J.RIEL在《OOD啟思錄》一書中針對這個問題給出了非常形象的解釋:

    你不必嚴格遵守這些原則,違背它也不會被處以宗教刑罰。但你應(yīng)當(dāng)把這些原則看做警鈴,若違背了其中的一條,那么警鈴就會響起。”-------ARTHUR J.RIEL,《OOD啟思錄》

    也就是說,如果違背了這些設(shè)計原則,就可能有危險,但究竟是什么危險呢,警鈴要警告我們什么呢,是火災(zāi)、水災(zāi)、地震、陷阱、還是有獅子、老虎。。。。。?

    要回答這個問題,還需要回到面向?qū)ο蟮谋驹?#xff1a;我們在第一章解釋為什么要面向?qū)ο蟮臅r候提到了面向?qū)ο蟮暮诵乃枷胧恰翱蓴U展性”,這其實就是我們應(yīng)用設(shè)計原則的根本目的:保證可擴展性。如果我們不遵守這些設(shè)計原則,警鈴就會響起,提醒我們:你的設(shè)計可擴展性會有問題!

    除了設(shè)計原則外,后面要講到的設(shè)計模式,其本質(zhì)也是為了提高可擴展性。這也是為什么我們通過領(lǐng)域類映射得到了很多軟件類之后,還需要不辭辛勞的繼續(xù)應(yīng)用設(shè)計原則和設(shè)計模式的主要原因,本質(zhì)上都是為了提高設(shè)計的可擴展性。

    SOLID設(shè)計原則的各個子原則詳細介紹會在后面詳細介紹,這里我們簡單的以POS機為例,看看如何應(yīng)用設(shè)計原則。

    仔細觀察我們通過領(lǐng)域類映射得到的軟件類,可以發(fā)現(xiàn)一個很明顯不符合SOLID原則中的DIP原則的地方,即:“交易類”直接依賴“會員卡”、“購物卡”、“信用卡”、“現(xiàn)金”4個子類,這樣的實現(xiàn)不符合DIP原則,當(dāng)需要增加新的支付方式時,“交易類”也需要跟著修改。

    既然不滿足DIP設(shè)計原則,那么我們就按照DIP原則的要求,提取出一個支付的父類來,即:“交易類”依賴“支付類”,“會員卡”、“購物卡”、“信用卡”、“現(xiàn)金”都繼承“支付”類。具體實現(xiàn)如下:

    ?

    可以看到,應(yīng)用DIP設(shè)計原則之后,我們又多出了一個“支付”的類,這個類原來在領(lǐng)域模型中是沒有的,而是我們在設(shè)計階段“創(chuàng)造”出來的。

    對于其它各個類,我們都可以依次使用設(shè)計原則進行判斷,當(dāng)發(fā)現(xiàn)不符合設(shè)計原則的設(shè)計時,就采取增加、刪除、合并、拆分等手段,使我們的設(shè)計逐步改進,最終達到符合設(shè)計原則的目的。

    【設(shè)計模式】
    相比設(shè)計原則來說,設(shè)計模式更加普及和流行,當(dāng)我們談到設(shè)計方法的時候,大部分人肯定都會想到設(shè)計模式,設(shè)計模式如此深入人心,幾乎到了言必談設(shè)計模式的地步。

    和設(shè)計原則類似,當(dāng)我們談?wù)撛O(shè)計模式的時候,我們其實都是在談?wù)揋OF(Gang of Four,中文翻譯為“四人幫”)在經(jīng)典名作《設(shè)計模式 ?--可復(fù)用面向?qū)ο筌浖幕A(chǔ)》一書中提到的設(shè)計模式。

    通俗的講,設(shè)計模式是用于指導(dǎo)我們?nèi)绾巫龀龈玫脑O(shè)計方案,而前面提到的設(shè)計原則,其作用也是這樣的。那么,設(shè)計原則和設(shè)計模式,我們該如何選擇?

    有的朋友可能會以為這兩個是二選一的關(guān)系,要么用設(shè)計原則,要么用設(shè)計模式。這種理解是錯誤的,設(shè)計原則和設(shè)計模式并不是競爭關(guān)系,正好相反,它們是互補的關(guān)系。

    設(shè)計原則和設(shè)計模式互補體現(xiàn)在:設(shè)計原則主要用于指導(dǎo)“類的定義”的設(shè)計,而設(shè)計模式主要用于指導(dǎo)“類的行為”的設(shè)計,更通俗一點的講:設(shè)計原則是類的靜態(tài)設(shè)計原則,設(shè)計模式是類的動態(tài)設(shè)計原則。
    一般情況下,我們是采用“先設(shè)計原則,后設(shè)計模式”的方法來操作的。

    設(shè)計模式的相關(guān)內(nèi)容會在后文詳細介紹,這里我們以POS機為例,看看如何應(yīng)用設(shè)計模式來優(yōu)化我們的設(shè)計。

    通過分析應(yīng)用設(shè)計原則優(yōu)化后的類,我們發(fā)現(xiàn)“信用卡”這個類存在優(yōu)化的空間,因為國際上存在不同的信用卡,最常見的有中國銀聯(lián)(UnionPay)、Visa、MasterCard這幾種,每種信用卡在支付的時候需要接入不同的機構(gòu),其接入方式和協(xié)議肯定都是有一定差異的。為了封裝這種差異以支持后續(xù)更好的擴展,我們應(yīng)用設(shè)計模式的Bridge模式,提取出“信用卡處理”這個類,這個類的主要處理“連接、認證、扣款”這樣的職責(zé)。UnionPay、Visa、MasterCard都繼承“信用卡處理”這個類。具體如下:

    ?

    6.2.3?第三步(照本宣科):拆分輔助類?

    ????經(jīng)過前面的設(shè)計步驟之后,面向?qū)ο箢惖脑O(shè)計工作已經(jīng)完成,我們輸出了完整的類模型,看起來已經(jīng)可以開始動手編碼了,你是否舒了一口氣,看著自己的設(shè)計作品,不由得產(chǎn)生了一種自豪感呢?

    ????確實值得自豪,畢竟我們一步一個腳印,從最初僅僅存在于客戶腦袋中的需求,逐步的推導(dǎo)、演變、設(shè)計出了能夠付諸實施的類模型了。但在最終實施之前,還有一點小小的動作要完成,這就是我們的拆分輔助類操作。

    ????拆分輔助類的主要目的是為了使我們的類在編碼的時候能夠滿足一些框架或者規(guī)范的要求。比如說常見的MVC模式,將一個業(yè)務(wù)拆分成Control、Model、View三個元素;J2EE模式中,將對象分為PO、BO、VO、DTO等眾多對象。

    ????之所以說這是一點小小的動作,是因為這個動作確實很簡單,只要將我們設(shè)計出來的類,按照規(guī)范要求,一 一對應(yīng)分拆即可。

    ????以POS機為例,假如我們的框架要求提供DAO對象,負責(zé)數(shù)據(jù)庫的相關(guān)操作,則“購物卡”類就應(yīng)該拆分為兩個:“購物卡”、“購物卡DAO”,其中“購物卡”用于負責(zé)提供“支付”功能給“交易”類調(diào)用,“購物卡DAO”用于負責(zé)從數(shù)據(jù)庫讀取購物卡信息,修改數(shù)據(jù)庫中購物卡余額等操作。

    ????需要注意的是,拆分設(shè)計輔助類僅僅是為了滿足框架或者規(guī)范的要求,本身并不是一個設(shè)計的步驟,而是實施的一個步驟,所以我們一般都不需要將拆分的輔助類體現(xiàn)在類模型中,僅僅在編碼的時候拆分即可。

    轉(zhuǎn)載于:https://my.oschina.net/jimilee/blog/911308

    總結(jié)

    以上是生活随笔為你收集整理的6.2 类模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。