编程思想是一个抽象的概念,要将其具象化我们必须透过现象看其本质,优秀的编程思想是对各种优秀想法的组织,这些想法可以精炼成许多原则,原则是构成编程思想的一个重要部分,也是所有编程方式都可以遵守的通用准则。在原则的基础上,在编码过程中反复解决的一些问题又被归纳为模式,这两者是思想的主要构成,另外也有不同的编程范式及方法论,我在这里简单的讲一下设计原则。
原则很多原则不仅适用于编程领域,也适用于其他领域,我想这也是为什么乔布斯提倡人人都应该学习编程,因为它能让你拥有更好的思考方式。
保持简单
Keep It Simple, Stupid (KISS)
最重要的原则之一,可靠来源于简单,只有不断保持系统的简单、代码的简单,才能更好地创造优秀的软件。
You Ain’t Gonna Need It (YAGNI)
如无必要,勿增复杂性,避免过度设计。
Separation of Concerns (SoC) – 关注点分离
将目标相关联的部分封装在一起,标识为关注点。这是降低复杂性的一个重要原则,MVC 或 MVP 模式都是该原则的应用,将模型、视图和控制器作为不同的关注点,使得每一个关注点可以更有效地理解及重用。
在编码过程中,也可以应用这一思想,比如我们首先关注应用程序是否可用,当其运行正确后再关心运行效率,这比同时进行这两项工作要简单的多。
不要重复
Don’t Repeat Yourself (DRY)
最简单也最容易理解的原则,每个程序员都应该以随意复制粘贴代码而感到羞愧。
Convention over Configuration(CoC)- 惯例优于配置原则
将约定的配置方式和信息作为缺省的规则来使用,可以减少开发人员做决定的数量,减少编码量,获得简单的好处,又不会丢失灵活性。
Spring Boot 框架解决的问题之一就是简化项目的配置,其大量应用了 CoC 原则。
S.O.L.I.D 原则
Single Responsibility Principle (SRP) - 单一职责原则
一个类,只做一件事,并把这件事做好,其只有一个引起它变化的原因。
很简单的原则,但是很多程序员在工作时经常违反这一原则,比如一个 service 类中引入许多 dao 对象,提供多种不相关服务。
Open/Closed Principle (OCP) – 开闭原则
模块是可扩展的,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。
设计模式中的代理、策略和观察者模式比较好地实现了这一原则。
当我们定义的一个API可接受函数作为参数时,实际上也是一种策略模式的变体,同样也体现了这一原则。
Liskov substitution principle (LSP) – 里氏代换原则
子类必须能够替换成它们的基类。
这个原则可作为我们设计类继承关系的基准。
Interface Segregation Principle (ISP) – 接口隔离原则
对接口进行拆分,使用多个专门的接口比使用单一的总接口要好。
接口可以多继承,那为何要因为懒惰而将其随便定义在一个总接口里呢?
Dependency Inversion Principle (DIP) – 依赖倒置原则
高层模块不应该依赖于低层模块的实现,而是依赖于高层抽象。
IoC 是 DIP 的一个具体实现,其已经深入到编程语言当中,Spring 框架最初就只是作为一个 IoC 容器,而后才不断扩展出许多实用功能并最终成为一个开发框架。
相关原则:Hollywood Principle – 好莱坞原则(所有的组件都是被动的,所有的组件初始化和调用都由容器负责)。
高内聚、低耦合
Law of Demeter – 迪米特法则
又称“最少知识原则”(Principle of Least Knowledge),一个类对于其他类知道的越少越好,知道的越多其耦合程度就越高。
门面模式和中介模式都是迪米特法则应用的例子。
这一原则强调低耦合。
Common Closure Principle(CCP)– 共同封闭原则
如果必须修改应用程序里的代码,我们希望所有的修改都发生在一个包里(修改关闭),而不是遍布在很多包里。
在微服务架构中,若修改一个功能时,经常需要修改多个服务,那么其很有可能违反了 CCP 原则不恰当地进行了服务拆分。
这一原则强调高内聚。
Common Reuse Principle (CRP) – 共同重用原则
包的所有类被一起重用,没有被一起重用的类不应该被组合在一起。依赖一个包就是依赖这个包所包含的一切。
CCP则让系统的维护者受益,CCP让包尽可能大(CCP原则加入功能相关的类),CRP则让包尽可能小(CRP原则剔除不使用的类)。它们的出发点不一样,但不相互冲突。
这一原则同样强调高内聚。
结语