本文是 通用开发技能系列 文章,主要对编程通用技能 SOLID、YAGNI、KISS等设计原则 进行学习
1.SOLID设计原则
- S:SRP,单一职责原则
- O:OCP,开闭原则
- L:LSP,里氏替换原则
- I:ISP,接口隔离原则
- D:DIP,依赖倒转原则
1.1.SRP:单一职责原则(Single Responsibility Principle)
- 原则思想:一个方法或一个类只负责一件事情。
- 描述:单一职责原则很简单,一个方法 一个类只负责一个职责,各个职责的程序改动,不影响其它程序。
- 优点:降低类和类的耦合,提高可读性,增加可维护性和可拓展性,降低可变性的风险。
- 如何判断一个类是否符合单一职责原则,可以从下面一些方面入手:
- 类中的代码行数,函数或者属性过多
- 类依赖的其他类过多,或者依赖类的其他类过多
- 私有方法过多
- 比较难给一个类起一个合适的名字,起的名字比较笼统,例如:manger类,context类
- 类中大量的方法都是集中操作某一些属性
- 当然,类的职责也不是设计的越单一越好,如果拆分的过细的话,实际上会降低内聚性,也会影响代码的可维护性
1.2.OCP:开闭原则(Open Closed Principle)
- 原则思想:开闭指的是 对外开放,修改关闭,尽量通过扩展软件实体来解决需求变化,而不是通过修改已有的代码来完成变化
- 描述:一个软件产品在生命周期内,都会发生变化,既然变化是一个既定的事实,我们就应该在设计的时候尽量适应这些变化,以提高项目的稳定性和灵活性。
- 开闭原则并非是说完全杜绝修改,而是以最小的修改来完成新功能的开发
- 最常用来提高代码扩展性的方法有:多态、依赖注入、基于接口而非实现编程,以及大部分的设计模式(比如,装饰、策略、模板、职责链、状态)
1.3.LSP:里氏替换原则(Liskov Substitution Principle)
- 原则思想:使用的基类可以在任何地方使用继承的子类,完美的替换基类。
- 大概意思是:子类可以扩展父类的功能,但不能改变父类原有的功能。子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法,子类中可以增加自己特有的方法。
- 优点:增加程序的健壮性,即使增加了子类,原有的子类还可以继续运行,互不影响
- 里氏替换原则与多态的区别:
- 虽然定义描述和代码实现有点类似,但是他们的关注点是不一样的
- 多态是面向对象的一大特性,它是一种代码实现的思路。
- 而里式替换是一种设计原则,指导继承关系中子类该如何设计
1.4.ISP:接口隔离原则(Interface Segregation Principle)
- 原则思想:使用多个隔离的接口,比使用单个接口要好。
- 本质上还是 降低类之间的耦合度 的意思
- 从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以各种原则中多次出现:降低依赖,降低耦合。
- 例如:支付类的接口和订单类的接口,需要把这俩个类别的接口变成俩个隔离的接口
1.5.DIP:依赖倒转原则(Dependency Inversion Principle)
- 原则思想:尽量面向接口编程,在 传递参数 或 关联关系 中,尽量引用层次更高的抽象层类,而不是某一个具体实现
- 这个是开放封闭原则的基础,具体内容是:对接口编程,依赖于抽象而不依赖于具体。
2.YAGNI原则
- YAGNI:You Aint’t Gonna Need It,即你不需要的
- YAGNI原则就是说:不要设计与开发当前功能用不到的代码,但并不意味着不考虑拓展性,可以预留好拓展点,后面需要时再开发。
- 举例:目前项目只对国内市场,未来将会面向国内海外同时使用。所以在开发中不需要提前编写海外部分代码,但是在国内海外有差异的逻辑上要预留好拓展点,方便后面对海外逻辑进行补充。
3.KISS原则
- Keep It Simple And Stupid:保持简单原则
- KISS原则就是说:尽量保证代码简洁,使用通用技术(大家都用的技术,不要选择偏难怪的技术)、不重复造轮子、不过度优化。
举例:对于某个数值的提取或者匹配判断,使用正则表达式可以使代码行数更少,看似更简单,但其实并不是所有同事都熟悉正则表达式,而且在编写正则规则时易出现bug,所以可以采用通用技术来实现。
4.LOD原则
- LOD:Law of Demeter,迪米特法则,也叫做最少知道原则
- 原则思想:一个对象应当对其他对象有尽可能少地了解,简称类间解耦
- 大概意思就是一个类尽量减少自己对其他对象的依赖,原则是低耦合,高内聚,只有使各个模块之间的耦合尽量的低,才能提高代码的复用率。
- 优点:低耦合,高内聚。
参考文章: