敏捷软件开发 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

相关文章
相关标签/搜索