架構(gòu)師之路(5)面向?qū)ο蟮脑O(shè)計(jì)原則

字號(hào):

1 OO的設(shè)計(jì)原則
    采用面向?qū)ο蟮姆治龊驮O(shè)計(jì)思想,為我們分析和解決問(wèn)題提供了一種全新的思維方式。我們?cè)谀玫叫枨笾?略去OOA,以后補(bǔ)全),接下來(lái)的問(wèn)題就是:如何對(duì)系統(tǒng)進(jìn)行面向?qū)ο蟮脑O(shè)計(jì)呢?
    按照軟件工程的理論,面向?qū)ο蟮脑O(shè)計(jì)要解決的核心問(wèn)題就是可維護(hù)性和可復(fù)用性。尤其是可維護(hù)性,它是影響軟件生命周期重要因素,通常情況下,軟件的維護(hù)成本遠(yuǎn)遠(yuǎn)大于初期開(kāi)發(fā)成本。
    一個(gè)可維護(hù)性很差的軟件設(shè)計(jì),人們通常稱之為“臭味”的,形成的原因主要有這么幾個(gè):過(guò)于僵硬、過(guò)于脆弱、復(fù)用率低或者黏度過(guò)高。相反,一個(gè)好的系統(tǒng)設(shè)計(jì)應(yīng)該是靈活的、可擴(kuò)展的、可復(fù)用的、可插拔的。在20世紀(jì)80到90年代,很多業(yè)內(nèi)專家不斷探索面向?qū)ο蟮能浖O(shè)計(jì)方法,陸續(xù)提出了一些設(shè)計(jì)原則。這些設(shè)計(jì)原則能夠顯著地提高系統(tǒng)的可維護(hù)性和可復(fù)用性,成為了我們進(jìn)行面向?qū)ο笤O(shè)計(jì)的指導(dǎo)原則:
    1、 單一職責(zé)原則SRP
    每一個(gè)類應(yīng)該只專注于做一件事。
    2、 “開(kāi)-閉”原則OCP
    每一個(gè)類應(yīng)該是對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。
    3、 里氏代換原則LSP
    避免造成派生類的方法非法或退化,一個(gè)基類的用戶應(yīng)當(dāng)不需要知道這個(gè)派生類。
    4、 依賴倒轉(zhuǎn)原則DIP
    用依賴于接口和抽象類來(lái)替代依賴容易變化的具體類。
    5、 接口隔離原則ISP
    應(yīng)當(dāng)為客戶提供盡可能小的接口,而不是提供大的接口。
    其中,“開(kāi)-閉”原則是面向?qū)ο蟮目蓮?fù)用設(shè)計(jì)的基石,其他設(shè)計(jì)原則是實(shí)現(xiàn)“開(kāi)-閉”原則的手段和工具。
    我會(huì)為大家一一進(jìn)行講解。
    2 單一職責(zé)原則SRP(Single-Responsibility Principle)
    2.1什么是單一職責(zé)
    單一職責(zé)就是指一個(gè)類應(yīng)該專注于做一件事?,F(xiàn)實(shí)生活中也存謚釗绱死嗟奈侍猓?ldquo;一個(gè)人可能身兼數(shù)職,甚至于這些職責(zé)彼此關(guān)系不大,那么他可能無(wú)法做好所有職責(zé)內(nèi)的事情,所以,還是專人專管比較好?!蔽覀?cè)谠O(shè)計(jì)類的時(shí)候,就應(yīng)該遵循這個(gè)原則:?jiǎn)我宦氊?zé)。
    我們以計(jì)算器編程為例:
    在有些人眼里,計(jì)算器就是一件東西,是一個(gè)整體,所以它把這個(gè)需求進(jìn)行了抽象,最終設(shè)計(jì)為一個(gè)Calculator類,代碼如下:
    class Calculator{
    public String calculate() {
    Console.Write("Please input the first number:");
    String strNum1 = Console.ReadLine();
    Console.Write(Please input the operator:");
    String strOpr= Console.ReadLine();
    Console.Write("Please input the second number:");
    String strNum2 = Console.ReadLine();
    String strResult = "";
    if (strOpr == "+"){
    strResult = Convert.ToString(Convert.ToDouble(strNum1) + Convert.ToDouble(strNum2));
    }
    else if (strOpr == "-"){
    strResult = Convert.ToString(Convert.ToDouble(strNum1) - Convert.ToDouble(strNum2));
    }
    else if (strOpr == "*"){
    strResult = Convert.ToString(Convert.ToDouble(strNum1) * Convert.ToDouble(strNum2));
    }
    else if (strOpr == "/"){
    strResult = Convert.ToString(Convert.ToDouble(strNum1) / Convert.ToDouble(strNum2));
    }
    Console.WriteLine("The result is " + strResult);
    }}
    另外,還有一部分人認(rèn)為:計(jì)算器是一個(gè)外殼和一個(gè)處理器的組合。
    class Appearance{
    public int displayInput(String &strNum1,String &strOpr, String &strNum2) {
    Console.Write("Please input the first number:");
    strNum1 = Console.ReadLine();
    Console.Write(Please input the operator:");
    strOpr= Console.ReadLine();
    Console.Write("Please input the second number:");
    strNum2 = Console.ReadLine();
    return 0;
    } 1 OO的設(shè)計(jì)原則
    采用面向?qū)ο蟮姆治龊驮O(shè)計(jì)思想,為我們分析和解決問(wèn)題提供了一種全新的思維方式。我們?cè)谀玫叫枨笾?略去OOA,以后補(bǔ)全),接下來(lái)的問(wèn)題就是:如何對(duì)系統(tǒng)進(jìn)行面向?qū)ο蟮脑O(shè)計(jì)呢?
    按照軟件工程的理論,面向?qū)ο蟮脑O(shè)計(jì)要解決的核心問(wèn)題就是可維護(hù)性和可復(fù)用性。尤其是可維護(hù)性,它是影響軟件生命周期重要因素,通常情況下,軟件的維護(hù)成本遠(yuǎn)遠(yuǎn)大于初期開(kāi)發(fā)成本。
    一個(gè)可維護(hù)性很差的軟件設(shè)計(jì),人們通常稱之為“臭味”的,形成的原因主要有這么幾個(gè):過(guò)于僵硬、過(guò)于脆弱、復(fù)用率低或者黏度過(guò)高。相反,一個(gè)好的系統(tǒng)設(shè)計(jì)應(yīng)該是靈活的、可擴(kuò)展的、可復(fù)用的、可插拔的。在20世紀(jì)80到90年代,很多業(yè)內(nèi)專家不斷探索面向?qū)ο蟮能浖O(shè)計(jì)方法,陸續(xù)提出了一些設(shè)計(jì)原則。這些設(shè)計(jì)原則能夠顯著地提高系統(tǒng)的可維護(hù)性和可復(fù)用性,成為了我們進(jìn)行面向?qū)ο笤O(shè)計(jì)的指導(dǎo)原則:
    1、 單一職責(zé)原則SRP
    每一個(gè)類應(yīng)該只專注于做一件事。
    2、 “開(kāi)-閉”原則OCP
    每一個(gè)類應(yīng)該是對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。
    3、 里氏代換原則LSP
    避免造成派生類的方法非法或退化,一個(gè)基類的用戶應(yīng)當(dāng)不需要知道這個(gè)派生類。
    4、 依賴倒轉(zhuǎn)原則DIP
    用依賴于接口和抽象類來(lái)替代依賴容易變化的具體類。
    5、 接口隔離原則ISP
    應(yīng)當(dāng)為客戶提供盡可能小的接口,而不是提供大的接口。
    其中,“開(kāi)-閉”原則是面向?qū)ο蟮目蓮?fù)用設(shè)計(jì)的基石,其他設(shè)計(jì)原則是實(shí)現(xiàn)“開(kāi)-閉”原則的手段和工具。
    我會(huì)為大家一一進(jìn)行講解。
    2 單一職責(zé)原則SRP(Single-Responsibility Principle)
    2.1什么是單一職責(zé)
    單一職責(zé)就是指一個(gè)類應(yīng)該專注于做一件事?,F(xiàn)實(shí)生活中也存謚釗绱死嗟奈侍猓?ldquo;一個(gè)人可能身兼數(shù)職,甚至于這些職責(zé)彼此關(guān)系不大,那么他可能無(wú)法做好所有職責(zé)內(nèi)的事情,所以,還是專人專管比較好?!蔽覀?cè)谠O(shè)計(jì)類的時(shí)候,就應(yīng)該遵循這個(gè)原則:?jiǎn)我宦氊?zé)。
    我們以計(jì)算器編程為例:
    在有些人眼里,計(jì)算器就是一件東西,是一個(gè)整體,所以它把這個(gè)需求進(jìn)行了抽象,最終設(shè)計(jì)為一個(gè)Calculator類,代碼如下:
    class Calculator{
    public String calculate() {
    Console.Write("Please input the first number:");
    String strNum1 = Console.ReadLine();
    Console.Write(Please input the operator:");
    String strOpr= Console.ReadLine();
    Console.Write("Please input the second number:");
    String strNum2 = Console.ReadLine();
    String strResult = "";
    if (strOpr == "+"){
    strResult = Convert.ToString(Convert.ToDouble(strNum1) + Convert.ToDouble(strNum2));
    }
    else if (strOpr == "-"){
    strResult = Convert.ToString(Convert.ToDouble(strNum1) - Convert.ToDouble(strNum2));
    }
    else if (strOpr == "*"){
    strResult = Convert.ToString(Convert.ToDouble(strNum1) * Convert.ToDouble(strNum2));
    }
    else if (strOpr == "/"){
    strResult = Convert.ToString(Convert.ToDouble(strNum1) / Convert.ToDouble(strNum2));
    }
    Console.WriteLine("The result is " + strResult);
    }}
    另外,還有一部分人認(rèn)為:計(jì)算器是一個(gè)外殼和一個(gè)處理器的組合。
    class Appearance{
    public int displayInput(String &strNum1,String &strOpr, String &strNum2) {
    Console.Write("Please input the first number:");
    strNum1 = Console.ReadLine();
    Console.Write(Please input the operator:");
    strOpr= Console.ReadLine();
    Console.Write("Please input the second number:");
    strNum2 = Console.ReadLine();
    return 0;
    }