软件设计原则
面向对象的SOLID原则
1) Single Responsibility Principle 单一责任(功能)原则
变量, 函数, 类, 包(组件)都应该遵守这个原则, 它能提升模块的内聚, 有利于重用; 从软件工程的角度, SRP有利于分解问题, 确定子系统边界, 有利于管理开发.
2) Open Closed Principle 开放关闭原则
增加新的功能时, 应该尽可能扩展而非修改原有实现. 这样可以避免在原有实现中引入新的bug, 减少不必要的测试工作量. 这条原则要求我们的软件在设计初期就应该考虑必要的扩展性
3) Liskov Substitution Principle 替换原则
Barbara Liskov提出的替换原则, 在程序中引用的父类对象都应该能用任意一个子类对象替换而不能引起语义, 运行逻辑上的异常. 这条原则要求我们应该谨慎使用继承: 只有类的关系是IS-A的时候才能使用继承.
4) Interface Segregation Principle 接口隔离原则
一个接口包含的方法应该具有内聚性,无内聚性的方法应该分隔出来另外设计新的接口,即应该将大的接口拆分为多个小的接口,将关联性不强的方法隔离,这就是接口隔离原则的实质,可以看作SRP原则在接口定义上的体现.
5) Dependency Inversion Principle 依赖倒置原则
依赖倒置原则是指上下层模块的实现都应该依赖于抽象(即接口), 更一般的说, 编程要依赖抽象, 而不要依赖具体实现. 从UML类图看, 依赖发生了倒置(底层依赖于中层(接口), 如下所示
其他设计原则
1) 封装
封装变化, 封装细节
2) 高扇入, 低扇出
这是一个设计的目标: 一个中间层的函数, 类, 包(组件)提供的服务能被更多的上层客户使用, 同时, 应该尽量减少对下层服务的使用种类. 这就是说, 中间层的模块应该提供比较通用的服务, 带来的好处是尽可能的软件复用(高扇入), 尽可能的模块低耦合(减少了上层对下层的依赖)
3) 尽量使用对象的组合, 而不是继承
继承关系是一种静态关系, 且会增加类之间的耦合度.
4) 尽量继承接口, 而不是继承实现
继承实现增加的类之间耦合度远远大于继承接口.