有一个“改变的原因”（即功能）；开闭原则：软件实体（类、模块、函数等）应当对扩展是开放的，对修改是关闭的；里氏替换原则：子类型能替换基类型；依赖反转原则：高层模块不应依赖于低层模块，二者应当依赖于抽象。抽象不应依赖与细节。细节应当依赖于抽象。接口隔离原则：类应当有胖（fat）接口，可被分为方法的分组。每个分组服务于不同的客户集。客户不应当知道这些分组是在同一个类中。