Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >接口设计六大原则

接口设计六大原则

作者头像
子勰
发布于 2018-05-31 09:58:33
发布于 2018-05-31 09:58:33
5.6K0
举报
文章被收录于专栏:子勰随笔子勰随笔

一. 单一职责原则

Single Responsibility Principle, 简称SRP。

定义
  • There should never be more than one reason for a class to change
  • 应该有且仅有一个原因引起类的变
准则
  • 职责的划分?单一的定义和级别?
  • 应该根据实际业务情况而定。关注变化点。
  • 实际使用时,类很难做到职责单一,但是接口的职责应该尽量单一。

二. 里氏替换原则

Liskov Substitution Principle, 简称LSP。

定义
  • Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it
  • 所有引用基类的地方必须能透明地使用其子类的对象
准则

里氏替换原则为良好的继承定义了一个规范:

  1. 子类必须完全实现父类的方法
  2. 子类可以有自己的个性(属性和方法)。
  3. 覆盖或实现父类的方法时输入参数可以被放大。
  4. 覆写或实现父类的方法时输出结果可以被缩小。

注:在类中调用其他类时务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了LSP原则。

三. 依赖倒置原则

Dependence Inversion Principle, 简称DIP

定义
  • High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details.Details should depend upon abstractions.
  • 翻译过来,包含三层含义:
  1. 高层模块不应该依赖低层模块,两者都应该依赖其抽象
  2. 抽象不应该依赖细节。
  3. 细节应该依赖抽象。

精简的定义: 面向接口编程。

案例

Test-Driven Development 测试驱动开发是依赖倒置原则的最好体现。

测试驱动开发要求先写测试类,测试通过才写实现类,这就要求你要先想接口定义。

依赖的三种写法:

  1. 构造函数传递依赖对象。
  2. Setter方法传递依赖对象。
  3. 接口声明依赖对象。
最佳实践:
  1. 每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备。
  2. 变量的表面类型尽量是接口或抽象类。
  3. 任何类都不应该从具体类派生。
  4. 尽量不要覆写基类的方法。
  5. 结合里氏替换原则使用。

四. 接口隔离原则:

接口这里指用interface关键字定义的接口。

定义:
  • Clients should not be forced to depend upon interfaces that they don’t use.(客户端不应该依赖它不需要的接口)
  • The dependency of one class to anther one should depend on the smallest possible interface.(类间的依赖关系应该建立在最小的接口上)

概括:建立单一接口,不要建立臃肿庞大的接口。

通俗来讲:接口尽量细化,同时接口中的方法尽量少。

准则

如何细化?细化到什么程序?

没有统一的标准,应根据业务合理细分,适合业务才是重点。

保证接口的纯结性:

  1. 接口要尽量小。
  2. 接口要高内聚。
  3. 定制服务。
  4. 接口的设计是有限度的。
最佳实践:
  1. 一个接口只服务于一个子模块或业务逻辑。
  2. 通过业务逻辑压缩接口中的public方法,接口时常去回顾,尽量让接口达到“满身筋骨肉”,而不是“肥嘟嘟”的一大堆方法。
  3. 已经被污染了的接口,尽量去修改,若变更的风险较大,则采用适配器模式进行转化处理。
  4. 了解环境,拒绝盲从。每个项目或产品都有特定的环境因素,不要盲从大师的设计,要根据业务逻辑进行最好的接口设计。

五.迪米特法则

Law of Demeter, LOD。又称最少知识原则(Least Knowledge Principle, LKP)。

定义:
  • 一个对象应该对其他对象保持最少的了解。
准则:

通俗来讲:一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没有关系,那是你的事情,我就调用你提供的public方法,其他一概不关心。

  • 低耦合要求:
    1. 只和朋友交流 朋友类:出现在成员变量、方法的输入输出参数中的类。方法体内部的类不属于朋友类。
    2. 朋友间也是有距离的 迪米特法则要求类“羞涩”一点,尽量不要对外公布太多的public方法和非静态的public变量,尽量内敛,多使用private、package-private、protected等访问权限。
    3. 是自己的就是自己的 如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,就放置在本类中。
    4. 谨慎使用Serializable

六.开闭原则

定义:
  • Software entities like classes, modules and functions should be open for extension but closed for modifications.
  • 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭
准则:

软件实体包括以下几个部分:

  1. 项目和软件产品中按照一定的逻辑规则划分的模块。
  2. 抽象和类。
  3. 方法。

变化的三种类型:

  1. 逻辑变化
  2. 子模块变化
  3. 可见视图变化
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年05月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
六大原则不熟?那你学什么设计模式?来来来,赶紧来!
如果要理解为:一个类只有一个职责,当然也是可以的,简单化嘛。 单一职责的原话解释是这样的:There should never be more than one reason for a class to change. 什么意思?那里,应该,没有,多于,一个,原因,使得,类,去,改变。 啊,咱这蹩脚英语,勉强能翻译啊。
看、未来
2020/08/26
3650
六大原则不熟?那你学什么设计模式?来来来,赶紧来!
设计模式六大原则
有言曰,“无规矩不成方圆”,有“规”才能画“圆”,那设计模式要遵循的六大原则要画一个什么的“圆”呢?
mingmingcome
2021/11/29
3410
设计模式六大原则
软件设计的七大原则
写出高质量、易维护、高可用的代码是每一个程序员的追求,那么,究竟什么样的代码才是易于维护与扩展的好代码呢?本文,我们就来介绍软件开发过程中的七大原则,一同来管窥一二。
用户3147702
2022/06/27
2.3K0
软件设计的七大原则
设计模式六大原则
  单一职责原则又称为单一功能原则,即不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。
那一叶随风
2018/08/22
2920
设计模式六大原则
设计模式六大原则
上篇文章说了工厂模式的单例模式和创建模式,单例模式如何在懒加载的情况下保证线程安全性,创建模式通过接口和抽象类,来完成开闭原则。
用户9919783
2022/12/14
4260
深入理解设计模式六大原则
万变不离其宗,不管是Java还是C++,凡是面向对象的编程语言,在设计上,尽管表现形式可能有所不同,但是其实质和所需遵守的原则都是一致的。本文便是带领读者去深入理解设计模式中的六大原则,以期帮助读者做出更好的设计。
王金龙
2020/02/14
3.2K1
设计模式之六原则一法则详解
六原则一法则是指开闭原则、里氏替换原则、依赖倒置原则、单一职责原则、接口隔离原则、合成复用原则、迪米特法则。
Java技术债务
2022/08/09
6190
设计模式之六原则一法则详解
回归设计模式的本质:设计原则
作为开发人员,或多或少都会熟悉或了解一些设计模式,如单例模式、工厂模式、观察者模式等等。但并非都能理解这些设计模式背后的本质,从而可能会导致对模式单纯的套用或滥用的情况出现。不要为了模式而模式,要明白使用模式的目的,要正确理解模式背后的设计原理,要理解背后的基本设计原则。
Keegan小钢
2019/07/30
5040
回归设计模式的本质:设计原则
【设计模式】六大设计原则
设计模式是系统服务设计中针对常见场景的一种解决方案,可以解决功能逻辑开发中遇到的共性问题。
Li_XiaoJin
2022/06/10
3890
6大设计原则总结
6大设计原则总结 一、单一职责原则  单一职责原则:英文名称是Single Responsiblity Principle,简称是SRP。定义:应该有且仅有一个原因引起类的变更。 单一职责原则要求:一个接口或类只有一个原因引起变化,也就是一个接口或类只有一个职责,它就负责一件事情。 单一职责原则的好处: 类的复杂性降低,实现什么职责都有清晰明确的定义; 可读性提高,复杂性降低,那当然可读性提高了; 可维护性提高,可读性提高,那当然更容易维护了; 变更引起的风险降低,变更是必不可少的,如果接口的单一职责做得好
新人小试
2018/04/12
8450
Java 面向对象设计的六大原则
这是设计模式系列开篇的第一篇文章。也是我学习设计模式过程中的总结。这篇文章主要讲的是面向对象设计中,我们应该遵循的六大原则。只有掌握了这些原则,我们才能更好的理解设计模式。 我们接下来要介绍以下6个内容。
芋道源码
2019/05/16
5540
设计模式中的设计原则
翻了三本书《设计模式之禅》、《设计模式:可复用的面向对象软件元素》、《Head First 设计模式》,也看了不少博客和关于设计模式原则的文章。关于设计模式有几大原则,似乎没有严格的定论,有的说6大设计原则,有的说7大设计原则,《Head First》中更是提到了9个设计原则。 不管是多少个设计原则,最终都是希望程序达到 **“高内聚,低耦合” **,代码高度复用,具有可维护性的目的。所以多少个设计原则已经不重要了,重要的是达到怎样的目标!
Haley_Wong
2018/08/22
7860
设计模式中的设计原则
一文带你读懂:设计模式的六大原则
软件设计最大的难题就是应对需求的变化,但是纷繁复杂的需求变化又是不可预料的,我们要为不可预料的变化做好准备,这本身是一件非常痛苦的事情,但好在有大师们已经给我们提出了非常好的六大设计原则和23种设计模式来“封装”未来的变化。
后台技术汇
2022/05/28
9440
一文带你读懂:设计模式的六大原则
面向对象编程中的六大原则
1. 单一职责原则(Single Responsibility Principle) 2. 里氏替换原则(Liskov Substitution Principle) 3. 依赖倒置原则(Dependence Inversion Principle) 4. 接口隔离原则(Interface Segregation Principle) 5. 迪米特法则(Law Of Demeter) 6. 开闭原则(Open Close Principle)
進无尽
2018/09/12
1.3K0
面向对象编程中的六大原则
【设计模式 00】六大原则
原则一:若 o1 是 C1 的一个实例化对象, o2 是 C2 的一个实例化对象,如果在使用 C1 的程序中将o1 替换为 o2 而程序行为没有发生变化,那么 C2 应该是 C1 的子类。
JuneBao
2022/10/26
2500
[5分钟]菜鸟修研之设计模式:六大设计原则
笔者作为一个菜鸟,会尝试以简单的代码和容易理解的语句去解释这几种原则的特性和应用场景。
痴者工良
2021/04/26
3390
设计模式的六大原则
设计模式的学习,可以增强自己的代码复用意识。同时,也可以清晰地表达自己的编程思路。本文将介绍设计模式的六大原则:
sunsky
2022/05/11
4410
设计模式的六大原则
我用过的设计模式(1)-- 本门心法
单一职责的原话解释是这样的:There should never be more than one reason for a class to change.
看、未来
2021/02/24
3290
设计模式的六大原则
文章介绍了设计模式中的六大原则:开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、单一职责原则、迪米特法则。这些原则对于项目开发有很好的指导作用,可以降低维护难度,提高代码可读性。
用户1134788
2017/12/27
1.1K0
JavaScript设计模式经典-面向对象中六大原则
主要学习JavaScript中的六大原则。那么六大原则还记得是什么了吗?六大原则指:单一职责原则(SRP),开放封闭原则(OCP),里氏替换原则(LSP),依赖倒置原则(DIP),接口分离原则(ISP),最少知识原则(LKP)。
达达前端
2019/11/21
8330
JavaScript设计模式经典-面向对象中六大原则
相关推荐
六大原则不熟?那你学什么设计模式?来来来,赶紧来!
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档