本文将通过示例讨论 Java 开发如何实践 SOLID 原则。

2000年,Robert C.Martin 在《设计原则和设计模式》论文中首次提出 SOLID 概念。Michael Feathers 对这些内容进行提炼并提出 SOLID 缩写。

SOLID 是什么?如何帮助我们编写更好的代码?简单地说,Martin 和 Feathers 提出的设计原则提倡构建可维护性更高、更容易理解和更灵活的软件。随着程序规模日益增长,设计原则有助于降低系统复杂性并减少后续开发中可能遇到的麻烦。SOLID 原则包含下面五个概念:

  1. 单一职责原则(SRP)
  2. 开闭原则(OCP)
  3. 里式替换原则(LSP)
  4. 接口隔离原则(ISP)
  5. 依赖倒置原则(DIP)

让我们通过一个示例来理解 SOILD 原则。SOLID 原则中每一条都单独撰写了文章,通过 「好的」和「坏的」设计对原则进行解释。

在实际开发中,设计 class 应牢记这五条 SOLID 原则。不仅如此,它们还是设计应用时需要遵循的最佳实践。

1.单一职责(SRP)

“一个类应该有且只赋予一个职责”

每个类都应该赋予单一职责,而且这个职责应该完全封装在类中。引起类变化的因素永远不要超出一个。单一职责表示 SOLID 五项原则中的 “S”,在面向对象编程实践中意味着编写设计良好、可读性强、易于维护、易于升级和修改的代码。

实践总结

  • 如果无法给 class 指定一个有意义类名,那么可能该类被赋予的职责过多。
  • 每个 Web 应用中的对象都应赋予一个职责,所有对象 service 都应专注于该职责(SRP)。
  • 如果某个 Java 类提供了多个功能,那么两个功能之间可能会产生耦合。即使只更改一个功能,也可能破坏耦合的关联功能。因此需要额外测试,以免对生产环境造成损害。

2. 开闭原则(OCP)

这是应用程序设计应当牢记的第二个重要原则。开闭原则指出:

“软件应该对扩展开放,但对修改关闭”。

简单地说,类、模块和函数等软件实体应该对扩展开放,对修改关闭。开闭原则表示 SOLID 五项原则中的“O”,在面向对象编程实践中意味着编写设计良好、可读性强、易于维护、易于升级和修改的代码。

实践总结

  • 对扩展开放:class 设计在应对新需求时可以方便地加入新功能。
  • 对修改关闭:除了修改 bug,否则不要改动已经设计好的类。
  • 加入新功能时,设计和编码应该尽可能避免修改已有代码,最好不修改。
  • 扩展已有功能时,应避免紧耦合:不要使用 if-else 或者 switch-case,请根据需要重构代码。
  • 实现技术:继承、多态、泛型。
  • 适用模式:策略模式、模板方法。

3. 里氏替换原则(LSP)

里式替换原则:

“派生类型必须可以完全替换其基类型。”

里式替换原则表示 SOLID 五项原则中的 “L”,在面向对象编程实践中意味着编写设计良好、可读性强、易于维护、易于升级和修改的代码。

实践总结

  • 该原则适用于继承层次结构,是开闭原则的一种扩展。
  • 这意味着派生出的新类必须保证不会改变基类的行为。基本上,派生类提供的功能只会比基类多。
  • 如果派生类行为超出了基类客户端的预期,则违反了里氏替换原则。比如派生类抛出一个基类不会抛出的异常,或者派生类的功能有副作用。必须考虑客户端程序如何使用类继承结构。有时需要重构代码以纠正不符合里氏替换原则的部分。

4. 接口隔离原则(ISP)

该原则适用于接口,之前的单一职责原则适用于类。接口隔离原则:

“不应强迫客户实现对自身无用的方法”。

SOLID 五项原则中的“I”表示接口隔离原则,它意味着应将较大的接口拆分为较小的接口。这样可以确保接口的实现类只需要关心它们感兴趣的方法。

5. 依赖倒置原则(DIP)

依赖倒置原则:

高层模块不应依赖于底层模块。两者都应依赖其抽象。

抽象不应当依赖细节。细节应当依赖于抽象。

依赖倒置原则表示 SOLID 五项原则中的 “D”,在面向对象编程实践中意味着编写设计良好、可读性强、易于维护、易于升级和修改的代码。

实践总结

  • 契约式设计。
  • 设计中每个依赖项都应该是接口或抽象类。不应当依赖任何具体类。
  • 工厂类与抽象工厂可以用作依赖框架,也有像 Spring IOC(控制反转容器)这样的专门框架。

依赖倒置原则_SOLID 设计原则,Java实例讲解相关推荐

  1. solid设计原则_SOLID设计原则

    solid设计原则 介绍: Robert C. Martin定义了五项面向对象的设计原则: 小号英格尔-责任原则 Ø笔封闭原则 大号 iskov的替换原则 我覆盖整个院落分离原则,并 d epende ...

  2. [设计原则] 六大设计原则之“开闭原则”

    [设计原则] 六大设计原则之"开闭原则" 目录 [设计原则] 六大设计原则之"开闭原则" 什么是开闭原则 为什么使用开闭原则 如何使用开闭原则 注意事项 总结 ...

  3. “设计应对变化”--实例讲解一个数据同步系统

    系列文章索引: [WCF邮件通信系统应用 之 数据同步程序 之 设计内幕 之 一] 同步一个数据库要发多少个数据包? [WCF邮件通信系统应用 之 数据同步程序 之 设计内幕 之 二] "开 ...

  4. java依赖倒转原则_设计原则之--依赖倒转原则

    [各位博友晚上好,又到了晚上的这个时间,感谢大家一直对Darren博客的支持,希望这篇文章对你有所帮助: 这几天一直在看设计模式:简单工厂模式,策略模式,单一职责原则,开放 [依赖倒转原则又称依赖倒置 ...

  5. 设计模式 — 6大设计原则(依赖倒置和接口隔离原则)

    设计模式 依赖倒置原则 示例 一 示例 二 依赖的三种写法 总结 接口隔离原则 实例 一 总结 依赖倒置原则 依赖倒置原则(Dependence Inversion Principle,DIP)这个名 ...

  6. 依赖倒置原则——面向对象设计原则

    前两节我们详细介绍了面向对象设计原则中的开闭原则和里氏替换原则,在本节中我们来介绍依赖倒置原则. 依赖倒置原则的定义 依赖倒置原则(Dependence Inversion Principle,DIP ...

  7. java的设计原则_Java设计原则

    引用一段经典的话,"武学的最高境界是无招胜有招",在编程领域,设计模式就可以认为是招数,而真正的内功心法是设计原则: 下面讲述一下编程中应该遵循的基本原则 1.单一职责原则 一个类 ...

  8. 设计原则-七大设计原则

    单一职责原则 介绍: ​ 对类来说的,即一个类应该只负责一项职责.如类 A 负责两个不同职责:职责 1,职责 2.当职责 1 需求变更而改变 A 时,可能造成职责 2 执行错误,所以需要将类 A 的粒 ...

  9. 8.接口隔离原则——面向对象设计原则

    面向对象设计原则除了开闭原则.里氏替换原则.依赖倒置原则和单一职责原则以外,还有接口隔离原则.迪米特法则和合成复用原则.本节将详细介绍接口隔离原则. 接口隔离原则的定义 接口隔离原则(Interfac ...

  10. 代码设计的基础原则_设计原则:良好设计的基础

    代码设计的基础原则 As designers, it's our goal to pass information in the most pleasing way possible. Startin ...

最新文章

  1. 2021年大数据Flink(二十九):Flink 容错机制 Savepoint
  2. 2019年上半年收集到的中国人工智能发展详情文章
  3. P4281 [AHOI2008]紧急集合 / 聚会
  4. 是时候搁置Grunt,耍一耍gulp了
  5. 判断js对象是否拥有某属性
  6. Linux性能分析—CPU篇
  7. verilog中function用法_verilog中的function用法与例子
  8. python中数据类型大小_详细解析Python中的变量的数据类型
  9. python画三维立体图难吗_万万没想到,Python竟能绘制出如此酷炫的三维图
  10. 《十四堂人生创意课》读书笔记,思维导图
  11. 获取界面url_好冷阿|编写一个自己的天气查询应用(可视化界面),提醒她注意保暖!...
  12. 用SqlConnectionStringBuilder修改连接超时时间
  13. CpK与PpK的关系
  14. BlackBerry Enterprise Service 10 for Android下载
  15. Django--表单
  16. 心理传染与恐怖的“模仿者效应”
  17. PIXEL-LEVEL SELF-PACED LEARNING FOR SUPER-RESOLUTION
  18. OLTP和OLAP有何区别?
  19. oracle会闪,Oracle闪来操作
  20. Selenium用户指南 - 第一章 Selenium 2.0 文档修订注解

热门文章

  1. mysql 30入门_mysql入门(三)
  2. 银行突发事件演练方案_湘阴星龙村镇银行开展防抢劫应急预案实战演练
  3. java中的时间戳sssss,Java日期时间API系列35-----Jdk8中java.time包中的新的日期时间API类应用,微秒和纳秒等更精确的时间格式化和解析。...
  4. bzoj 1610 连线游戏
  5. 讨论一下hibernate如何动态注册一个动态生成的实体类
  6. 【UE】关于UE的一个真实案例
  7. 【是程序猿就干了这碗心灵鸡汤】我们这一代人的困惑
  8. Linux下编译安装redis,详细教程
  9. ASP.NET Ajax 实现无刷新分页
  10. 基于visual Studio2013解决C语言竞赛题之0405阶乘求和