敏捷式軟體開發 (Agile Software Development)——原則
單一職責原則(SRP):
每間事物(函數,變數,類,模組等)都只做一件事。
開放封閉原則(OCP):
對於擴充是開放的,對於更改是封閉的,關鍵在於抽象;在OOPL裡面,通常會使用其建立一個抽獎的基類,用以提供“開放”,而寫在之前代碼裡面的抽象基類等,就是對於外部是封閉的,不應該被修改的(老實說,要做到這樣,需要有預見性,所以在設計模組時,應該瞭解對哪種變化做出封閉,然後將變化的部分抽象出來)。
怎樣知道變化在哪裡呢?可以這樣做:
1、我們首先編寫測試;
2、使用很短的迭代周期進行開發;
3、加入基礎結構前就開發特性,並且經常性地把那些特性展示給涉眾(不是很理解基礎結構指什麼,看來還得要根據實際情況吧);
4、首先開發最重要的特性;
5、儘早地、經常性地發布軟體。
要遵守OCP原則,抽象是關鍵(其實不只是OCP,很多原則都十分依賴你對變化的抽象的),能夠對一個變化進行抽象,你就可以對變化進行隔離,當你需要改變時,只需要增加代碼,而無須修改已經寫好的代碼。其背後的機制是抽象和多態!!
Liskov替換原則(LSP):
衍生類別能夠完全替換掉基類。這裡是對繼承的一個充分瞭解的原則,同樣,OCP原則也是建立在LSP原則之上的,因為好的抽象,必須要有好的繼承關係進行維持。這裡提及到經典的:IS-A,的關係。IS-A有時候並不只是描述我們現實生活中的“是同一樣的事物”的關係(正方形是矩形),在程式中,更多的是描述關於“行為上” 是同一樣的事物。
依賴倒置原則(DIP):
高層不依賴底層,底層不依賴高層,高層、底層都依賴抽象(依賴抽象是一個高深的東西);抽象不應該依賴於細節。細節應該依賴於抽象。軟體中,高層上的細節不一樣才能夠體現出你的軟體區別於其他軟體的性質,就如,大部分的程式都會使用字串類,而字串是關於底層的細節的,而非常多的軟體都會有關於字串的處理,而且需要處理的情況經常都是一樣的,但正由於他們在高層上需要處理的結果的不一樣,導致軟體與軟體之前的區別,使你編寫出的軟體更有個性。
介面隔離原則(ISP):
對介面內聚,客戶只需要知道他們能用的就可以了。介面隔離原則,更像是切割原則,將你提供給它的一個龐大的東西,它只在介面處提取它需要的部分,其餘的,它都不管,只要你實現了它需要的那部分介面就可以了!
這裡提及了關於多重繼承的用法。以往一直認為,多重繼承難用,而且沒有用(我的想法,而且證明是錯誤的),然而,如果將你需要的基類都用作為抽象基類(C++中,Java叫做Interface吧),只提供實現方法,那麼你的多重繼承就會非常有作用了。當你的程式需要將子類(多重繼承而來的)切割到基類的時候,你就可以將你的基類應用到多個介面中(介面的多少,視乎你多重繼承了多少個基類),這樣,由於子類的切割,使介面隔離了,正好是我們ISP中需要實現的原則!!!!!
迪米特原則(LoD):
如果兩個類不必彼此直接通訊,那麼這兩個類就不應當發生直接的相互作用。如果一個類需要調用另一個類的某一個方法的話,可以通過第三者轉寄這個調用。
通常,迪米特法則的根本思想是強調了類之間的松耦合。其與一來依賴倒置原則十分類似。如果有兩個類(類A和類B),如果類A不想知道類B是如何?類A要求的實現,那麼類A與類B之間可以產生一個“中間類C”,這個中間類C專門講類A中的請求轉換為對類B的調用,類C能夠很好地維護類A和類B之間的關係,所以當類B修改了,卻不會影響到類A(當然,這樣是會影響到類C的),所以類B通常是會改變它提供的介面的,就如類B是我們經常要維護的,而類A是已經發布出去的,當改變類B符合類C的介面的話,發布出去的類A不是需要知道的,他們是透明的,因為他們有中間類C進行維護,類A完全不需要有類B的存在,類A只需要有東西幫它正確完成任務就可以了。
(日後在慢慢完善)