軟件設(shè)計(jì)原則

          Posted on 2011-01-28 22:00 Wesley Xie 閱讀(1107) 評(píng)論(0)  編輯  收藏 所屬分類: 設(shè)計(jì)相關(guān)

          已經(jīng)有很多人寫過(guò)類似的文章了,不過(guò)我還是想記錄下來(lái),最近對(duì)設(shè)計(jì)原則的理解,哪天回頭觀看,也有點(diǎn)印象:

           

          單一職責(zé)原則:

                就一個(gè)類而言、應(yīng)該僅有一個(gè)引起它變化的原因。 這句話的意思是說(shuō),如果有多種不同類型的需求改變了,都需要對(duì)該類進(jìn)行改變,那么這個(gè)類就違背了單一職責(zé)原則,這個(gè)度非常難把握,個(gè)人感覺很多時(shí)候,單一職責(zé)原則比較滯后,大部分情況下都是在需求變更的時(shí)候,才發(fā)現(xiàn)這個(gè)某些類單一職責(zé)原則沒(méi)有太好落實(shí),因此才去做的重構(gòu),其實(shí)發(fā)生這個(gè)情況的原因,個(gè)人感覺主要是在做設(shè)計(jì)的時(shí)候,還是功夫做得太少,如果能在紙上多畫畫,應(yīng)該效果會(huì)更好。

                軟件設(shè)計(jì)真正要做的許多內(nèi)容,就是發(fā)現(xiàn)職責(zé)并把那些職責(zé)相互分離----如果你能夠想到多于一個(gè)的動(dòng)機(jī)去改變一個(gè)類,那么這個(gè)類就具有多于一個(gè)的職責(zé)。

           

          開放-關(guān)閉原則

                對(duì)于擴(kuò)展是開放的,對(duì)于更改是封閉的。

                怎樣的設(shè)計(jì)才能面對(duì)需求的改變卻可以保持相對(duì)穩(wěn)定,從而使得系統(tǒng)可以在第一個(gè)版本以后不斷推出新的版本呢?

                無(wú)論模塊是多么的‘封閉’,都會(huì)存在一些無(wú)法對(duì)之封閉的變化。既然不可能完全封閉,設(shè)計(jì)人員必須對(duì)于他設(shè)計(jì)的模塊應(yīng)該對(duì)哪種變化封閉做出選擇。他必須先猜測(cè)出最有可能發(fā)生的變化種類,然后構(gòu)造抽象來(lái)隔離那些變化。

                在我們最初編寫代碼時(shí),假設(shè)變化不會(huì)發(fā)生。當(dāng)變化發(fā)生時(shí),我們就創(chuàng)造抽象來(lái)隔離里后發(fā)生的同類變化。

                面對(duì)需求,對(duì)程序的改動(dòng)是通過(guò)增加新代碼進(jìn)行的,而不是更改現(xiàn)有的代碼。這就是開放-關(guān)閉原則的精神所在。 我們希望的是在開發(fā)工作展開不就就知道可能發(fā)生的變化。查明可能發(fā)生的變化所等待的時(shí)間越長(zhǎng),要?jiǎng)?chuàng)建正確的抽象就越困難。

                  開放-關(guān)閉原則是面向?qū)ο笤O(shè)計(jì)的核心所在。遵循這個(gè)原則可以帶來(lái)面向?qū)ο蠹夹g(shù)所聲稱的巨大好處,也就是可維護(hù)、可擴(kuò)展、可復(fù)用、靈活性好。開發(fā)人員應(yīng)該僅針對(duì)程序中呈現(xiàn)出頻繁變化的那些部分做出抽象,然而,對(duì)于應(yīng)用程序中的每個(gè)部分都刻意地進(jìn)行抽象同樣不是一個(gè)好主意。拒絕不成熟的抽象和抽象本身一樣重要。

           

          依賴倒轉(zhuǎn)原則

                針對(duì)接口編程,而不要對(duì)實(shí)現(xiàn)編程:

                      A. 高層模塊不應(yīng)該依賴低層模塊,兩個(gè)應(yīng)該都依賴抽象。

                      B. 抽象不應(yīng)該依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴抽象。

           

                以上都是根據(jù)書上所寫,但個(gè)人在這里有些需要說(shuō)明的,依賴倒轉(zhuǎn)原則與前面所講的原則都是一樣,不要將所有的地方,都寫成是對(duì)接口編程,那樣相當(dāng)于是過(guò)度抽象,其實(shí)對(duì)整個(gè)軟件設(shè)計(jì)并沒(méi)有任何好處。一句話概括:只有當(dāng)需要的時(shí)候,再進(jìn)行抽象,這也是敏捷所描述的精神。

           

          里氏代換原則

                一個(gè)軟件實(shí)體如果使用的是一個(gè)父類的話,那么一定適用于其子類,而且它察覺不出父類對(duì)象和子類對(duì)象的區(qū)別。也就是說(shuō),在軟件里面,把父類都替換成它的子類,程序的行為沒(méi)有變化。簡(jiǎn)單地說(shuō),子類型必須能夠替換掉它們的父類型。

                只有當(dāng)子類可以替換掉父類,軟件單位的功能不受到影響時(shí),父類才能真正被復(fù)用,而子類也能夠在父類的基礎(chǔ)上增加新的行為。


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 北川| 盐源县| 锡林郭勒盟| 滁州市| 萨嘎县| 广宁县| 仙居县| 道孚县| 扎赉特旗| 灵川县| 印江| 福安市| 淄博市| 上栗县| 溆浦县| 新邵县| 中山市| 内黄县| 孟津县| 宁海县| 阳原县| 屏东县| 靖州| 临夏市| 绿春县| 巧家县| 金乡县| 鄢陵县| 二手房| 东丽区| 新化县| 巴林左旗| 普洱| 辉县市| 武功县| 育儿| 姜堰市| 汶上县| 沁源县| 绥化市| 滁州市|