摘要: ISP用来处理fat接口的缺点.如果类的接口不是内聚的,那么该类就具有fat接口.fat接口可以分解为多个组.每个组服务于不同的客户.ISP承认不需要内聚接口的对象.但是建议客户不应该看到它作为单一的类而存在.客户程序看到的应该是多个具有内聚接口的抽象基类.接口污染.分离客户就是分离接口.客户对接口施加的反作用力.考虑引起变化的作用力时,通常考虑的是接口的变化会怎么影响它的使用者.但有时候,迫使接口改变的,正是它的使用者.ISP:不应该强迫客户依赖于它们不使用的方法.这样会导致所有客户程序间的耦合.一个客户依赖于一个它不使用的方法的类.但是其他客户却要使用该方法.此时,当其它客户要求这个类改变 阅读全文
posted @ 2013-12-06 14:50 robynhan 阅读(356) 评论(0) 推荐(0) 编辑
摘要: 高层模块不应该依赖于底层模块,二者都应该依赖于抽象;细节应依赖于抽象.传统习惯中,高层模块依赖于底层模块,策略依赖于细节的结构.这是要定义子程序层次结构,该层次结构描述了高层模块如何调用底层模块.但是,这也就意味着,底层模块的更改会直接影响到高层模块.而APP的区别就是体现在这些高层模块中的.包含高层业务规则的模块应该优先并独立于包含细节的模块.通过子程序库来重用底层模块.我们更希望能够重用高层的策略设置模块.这也是Framework设计的核心.所以必须将高层独立于底层模块.倒置的接口所有权.底层实现了高层中声明并被高层调用的接口.这样高层可以在任何实现了该接口的环境中重用.有点短视的启发规则 阅读全文
posted @ 2013-12-06 11:17 robynhan 阅读(298) 评论(0) 推荐(0) 编辑
摘要: OCP中,继承支持了抽象和多态特性.LSP:子类必须能够替换掉其基类.反例:使用if/else判断类型,以便选择针对特定类型的正确行为.有效性并非本质属性模型的有效性,只能通过它的客户程序来表现.在考虑一个特定设计是否合理时,必须要根据该设计的使用者所作出的合理假设来审视它.这些合理的假设常常就是单元测试中的assert.不要试图做所有的假设,而只是优先预测那些明显的对于LSP原则的违反情况,而在相关的脆弱性臭味出现时,才做其他的预测.IS-A是关于行为方式的.对象的行为方式才是软件所关注的.行为方式是可以进行合理假设的,是客户程序所依赖的.DBC:基于契约(Contract)设计.Class 阅读全文
posted @ 2013-12-06 09:55 robynhan 阅读(368) 评论(0) 推荐(0) 编辑