电竞比分网-中国电竞赛事及体育赛事平台

分享

軟件設(shè)計(jì)原則和模式--------單一指責(zé)原則

 linyu2688 2006-09-25
                                                                                 軟件設(shè)計(jì)原則和模式--------單一指責(zé)原則

      對(duì)于一個(gè)類(lèi),應(yīng)該僅有一個(gè)引起它變化的原因,很簡(jiǎn)單,如果一個(gè)類(lèi)承擔(dān)了多余一個(gè)的職責(zé),那么引起它變化的原因就會(huì)有多個(gè)。也就等于把這些職責(zé)耦合在了一起。當(dāng)然了一個(gè)職責(zé)的變化可能會(huì)削弱或者抑制這個(gè)類(lèi)完成其他職責(zé)的能力。最終的結(jié)果就是這種耦合會(huì)導(dǎo)致一種脆弱的設(shè)計(jì)。例子:Retangle類(lèi)有兩個(gè)方法。一個(gè)方法把矩形繪制在窗體上,另一個(gè)方法計(jì)算矩形的面積:

                            多余一個(gè)的職責(zé)的情況
    2個(gè)不同的程序使用矩形類(lèi),一個(gè)是計(jì)算幾何學(xué)方面的,此時(shí)Rectangle類(lèi)會(huì)為次幾何學(xué)程序提供幫助,它從來(lái)是不會(huì)在窗口上繪制矩形的。而另一個(gè)程序是有關(guān)圖形學(xué)方面的,他可能也會(huì)進(jìn)行一些幾何學(xué)方面的計(jì)算,但是它肯定會(huì)在窗口上繪制矩形。
       
所以說(shuō)這個(gè)設(shè)計(jì)違反了單一職責(zé)原則,就是矩形類(lèi)具有2個(gè)職責(zé):1:提供了一個(gè)矩形幾何形狀的數(shù)學(xué)模型;2:把矩形的一個(gè)圖形用戶(hù)界面繪制出來(lái)。這樣的設(shè)計(jì)可能會(huì)導(dǎo)致一個(gè)地方的改動(dòng)會(huì)帶動(dòng)其他的地方的一列改動(dòng)。一個(gè)比較好的設(shè)計(jì)是把這兩個(gè)職責(zé)分離到兩個(gè)完全不同的類(lèi)中。如下:

  什么是職責(zé)?
可以理解為:變化的原因,如果你能想到多與一個(gè)的動(dòng)機(jī)去改變一個(gè)類(lèi),那么這個(gè)類(lèi)就具有多于一個(gè)的職責(zé)。有時(shí)候我們很難做到這一點(diǎn),都是習(xí)慣以組的方式去考慮職責(zé)。如下面的接口看起來(lái)很合理:該接口所聲明的4個(gè)函數(shù)確實(shí)是調(diào)制解調(diào)器所具有的功能:

Interface Modem
{
   void dial(string pno);
  void hangUp();
  void send(
string c);
  void recv();
}

        然而,該接口中卻顯示出兩個(gè)職責(zé),第一個(gè)職責(zé)是連接管理[dial;hangUp];第二個(gè)職責(zé)是數(shù)據(jù)通信[send;recv ],問(wèn)題是這兩個(gè)職責(zé)應(yīng)該被分開(kāi)嗎?這得依賴(lài)于應(yīng)用程序變化的方式了。如果程序的變化會(huì)影響連接函數(shù)的簽名,那么這個(gè)設(shè)計(jì)就具有僵化性的味道。因?yàn)閟end;recv類(lèi)必須要重新編譯。部署的次數(shù)常常會(huì)超過(guò)我們希望的次數(shù)。在這樣的情況下,需要把這兩個(gè)職責(zé)分離開(kāi)。但是另一方面,如果應(yīng)用程序的變化方式總是導(dǎo)致這兩個(gè)職責(zé)的同時(shí)變化,那么就不必分離他們了。
總結(jié):?jiǎn)我宦氊?zé)是所有原則中最簡(jiǎn)單的之一,也是最難正確運(yùn)用之一。我們會(huì)自然的把職責(zé)結(jié)合在一起,軟件設(shè)計(jì)真正要做的許多內(nèi)容,就是發(fā)現(xiàn)職責(zé)并把那些職責(zé)相互分離。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多