敏捷軟件開發 10~12章

LSP:Liskov Substitution Principle Liskov 替換原則

Subtypes must be substitutable for their base types.子類必須可以替換基類編程

例:正方形IS-A矩形,所以咱們會設計成正方形繼承至矩形,然而假若有如下代碼:spa

public Rectangle IncreaseHeight(Rectangle r)
{
    while(r.getHeight()<r.getWidth()))
    {
        r.setHeight(r.getHeight()++)
    }
    
    return r;
}

 

就會有錯誤出現。設計

應用:在具體實如今,要求應該針對 「接口」或「抽象基類」進行編程,充分利用面向對象的多態特性,讓實現同一接口或抽象基類的子對象能夠互相取代而不影響到程序的其餘部分。code

反例:.NET基類庫中的ReadOnlyCollection類,ReadOnlyCollection<T>實現了ICollection<T>接口,但這接口中的Add()、Clear()方法對於只讀集合是無心義的。對象

 

ISP:Interface Segregation Principle 接口隔離原則

No client should be forced to depend on methods it does not use blog

不該該強迫一個軟件組件依賴於它們不用的方法繼承

  • 要避免設計出一個「包羅萬有」的大接口,而應該將定義的功能從邏輯上進行分組,將其切分爲多個小接口。
  • 各個類按需實現接口

例:IRepository接口既有「命令」(Save,Update)又有「查詢」(Find,GetById)功能接口

        public interface IRepository
        {
            public void Save(MyDataItem item);
            public void Update(MyDataItem item);

            public void Delete(int ItemId);

            public MyDataItem GetById(int ItemId);

            public List<MyDataItem> Find(Predicate<MyDataItem> pred);
        }

能夠拆分爲兩個接口:ip

  public interface IMutableRepository
        {
            public void Save(MyDataItem item);
            public void Update(MyDataItem item);
            public void Delete(int ItemId);
            
        }

        public interface IQueryableRepository
        {
            public MyDataItem GetById(int ItemId);

            public List<MyDataItem> Find(Predicate<MyDataItem> pred);
        }

 DIP:Dependency Inversion Principle 依賴倒置原則

  • High-level modules should not depend on low-level modules. Both should depend on abstractions. 
  • Abstractions should not depend upon details. Details should depend upon abstractions.
  • 高層模塊不該該依賴於低層模塊,二者都應該依賴於抽象。
  • 抽象不該該依賴於細節,細節應該依賴於抽象。

依賴注入:類自己不直接實例化它所依賴的類的對象,而是由外界動態了將其「注入(inject)"ci

相關文章
相關標籤/搜索