寫程式的基本觀念肯定少不了物件導向,雖然以前大學的時候就碰過了,但是沒有特別去複習也早就忘光了,這次來依照五大原則:S.O.L.I.D,依序筆記物件導向的重點觀念,因為我猜我今天打不完,而且也希望能夠多一點時間理解,所以這會是系列文的第一篇,一樣,有錯誤的地方歡迎指教喔!

總覽

S.O.L.I.D分別代表了:

S:Single-responsiblity principle 單一責任原則

O:Open-Closed Principle 開放擴充、封閉修改原則

L:Liskov Substitution Principle 里氏替換原則

I:The Interface Segregation Principle 介面分離原則

D:The Dependency Inversion Principle 依賴反轉原則

以上分別是物件導向的五大重點,先在這邊列出來讓大家也可以自己拿英文或中文自己孤狗,畢竟我猜我會寫得很慢(炸),我這邊將會從「S」開始筆記。

S:Single-responsiblity principle 單一責任原則

基本上就是每個人(物件)只負責執行一件事情,老實說還挺淺顯易懂的,這邊以JavaScript舉例:

circle類別只負責當一個圓形

function circle( radius ){
    this.radius = radius;
}

square類別只負責當一個正方形

function square ( length ){
    this.length = length;
}

areaCal類別只負責算總面積回傳

function areaCal( shapeArray ){
    this.shapeArray = shapeArray; //存入形狀陣列
}
areaCal.prototype.sum = function (){
    var sumValue = 0;
    for( var i = 0; i < this.shapeArray.length; i++ ){
        //以迴圈來把陣列裡的面積算出來
    }
    return sumValue;
};

sumValue類別負責輸出結果給使用者

function outputControl( sumValue ){
    this.sumValue = sumValue;
}
outputControl.prototype.html = function (){
    //回傳含Html標籤字串
    return output;
};
outputControl.prototype.string = function (){
    //回傳純字串
    return output;
};

最後使用結果就會變成這樣

var shapeArray = [
    new square(4),
    new square(9),
    new circle(2)
];

var sumValue =  new areaCal(shapeArray).sum();
var stringOutput = new outputControl(sumValue).html();

console.log( stringOutput ); //輸出最後純字串結果

從上面的例子很明顯看得出來,每一個類別都只會做一件事,撰寫時看起來十分繁瑣,但是卻讓程式易於擴充維護。

假設某天,我們的使用者想要新的輸出總面積的格式,例如jade,再假設我們有一堆形狀,且每一個形狀都有自己的輸出函式,可想而知,為了符合使用者需求,接下來每一個形狀都要增加新的輸出函式。

但如果今天我們按照「單一責任原則」去做,我們只要修改outputControl這個類別就沒問題了,相比之下是不是方便很多呢?