当前位置: 首页 > news >正文

翻译 | The Principles of OOD 面向对象设计原则

本文首发于vivo互联网技术微信公众号 https://mp.weixin.qq.com/s/Q_pziBUhKRywafKeY2T7YQ
作者:Robert C. Martin
翻译:张硕
本文由来自美国业界大牛——Robert C. Martin(俗称“Bob大叔) 发布在 butunclebob.com 上,已获得翻译授权。
英文原文链接:[http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod](http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod)
本篇概括性的介绍了OOD的设计原则,后续还有更多文章会详细剖析、吃透面向对象业务设计的原则。

32902

什么是面向对象设计?它是怎么一回事?使用它会有什么利弊得失?似乎问出这些问题显得有些愚蠢,特别是在一个几乎每个开发者都会使用某种面向对象语言的时代中。

然而在我看来,这些问题即极为重要,因为我们中的大多数使用者并不知道答案,当然也不知道如何发挥面向对象语言的最大价值。

在我们这个行业发生的所有变革中,有两场是非常成功的,以至于它们已经渗透到我们的思维中,以至于我们认为它们是理所当然的。那就是"结构化设计编程"(也叫面向过程设计)与"面向对象设计编程"。所有主流的现代编程语言都被这两种编程范式深刻影响。甚至是,我们很难摒弃这两种编程范式去写任何一个程序。

我们的主流编程语言中没有“GOTO”,因此似乎是遵守了著名的结构化编程"禁令";我们大多数的主流编程语言是基于类并且不支持使用没有写入任何一个类中的变量、函数(方法),因此他们似乎是遵守了面向对象设计中最明显的特点。

用这些语言(主流结构化语言或面向对象语言)写出的程序也许看上去是结构化的或面向对象的,但是外表也可以是虚假的。今天的程序员常常不知道这些语言产生的原因以及其中的基础原则。在另一篇博客中,我会讨论结构化编程的设计原则,而在这篇文章中我想要聊聊面向对象设计原则。

在1995年3月,在comp.object上,我写过一篇文章,这篇文章也成为我日后众多OOD设计原则文章中的处女作。你们将会在我的PPP书籍中以及发表了我多篇文章的objectmentor网站上看到这些文章,当然也包括那个广为人知的那篇摘要文章。(译者注:PPP指——“Agile Software Development: Principles, Patterns, and Practice,中文即—敏捷软件开发:原则、模式与实践”

这些原则揭示了OOD依赖管理方面的内涵,而在概念化和建模方面并没有深入涉及。然而这并不代表OO在对问题领域的概念化上很薄弱,也不代表OO在建模能力上很薄弱。我很确定在这两方面上,很多从OO设计原则中获得价值。需要注意的是,这些原则非常关注依赖关系管理。

译者注:此处指宽泛概念的依赖关系管理,如系统与系统之间的依赖,模块与模块之间的依赖,类方法直接的依赖

依赖管理是一个大多数架构师需要面对的问题。每当我们在屏幕上看到一堆乱七八糟的遗留代码时,我们都在经历依赖管理不善的结果。糟糕的依赖关系管理导致代码难以更改、脆弱和不可重用。实际上,在我的PPP书中谈到了几种不同的设计风格,都与依赖管理有关。另一方面,当依赖关系得到很好的管理时,代码仍然是灵活可扩展的、健壮的和可重用的。因此,依赖关系管理的思考,以及这些原则的使用,是软件开发人员设计灵活性系统的基础。

以下5个原则是阶级设计原则:

  • SRP单一职责原则 指一个类模块包甚至系统 都应该有单一的原则。
  • OCP开闭原则 你应该能够扩展类的行为,而不需要修改它。

如果软件系统想要更容易被改变,其设计就必须允许新增代码来修改,而非修改原来代码。

  • LSP 里氏替换原则

简答理解就是 如果想要可替换的组件来构建软件系统,那么这些组件就必须遵守共同一个约定,以便让这些组件可以相互替换。

  • ISP 接口隔离原则

使细粒度接口特定于客户端,主要告诫设计师应该在设计中避免不必要的依赖。

  • DIP 依赖倒置原则

依赖抽象,而非具体实现。此原则指出高层策略性代码不应该依赖实现的代码,相反,那些底层实现应该依赖于高层策略代码。(译者注:这里的“类”泛指:方法和数据的耦合分组

接下来的六条原则是关于包(译者注:指jar、war,而非package)的。在这个上下文中,包是二进制的可交付文件,比如:jar文件,或者dll,而不是java包或c++命名空间。前三个包原则是关于包内聚的,它们告诉我们在包中放入什么:

  • REP 重用发布等价原则 重用的颗粒就是释放的颗粒。
  • CCP 共同封闭原则 一起更改的类被打包在一起。
  • CRP 共同重用原则 一起使用的类被打包在一起。
  • ADP 无环依赖原则 包的依赖关系图必须没有循环。
  • SDP 稳定依赖原则 依赖于稳定性的方向,特别是(变化更多的)具体的元素应该取决于是否要完全依赖于(更稳定的)抽象成分。
  • SAP 稳定抽象原则 抽象性随稳定性而增加。

相关文章:

  • 内置对象String及String的常用操作
  • Java提高篇——单例模式
  • 致远力推协同运营中台,赋能数字化升级
  • 文件属性权限及其权限设置
  • 关于ORACLE的SQL语句拼接、替换、截取、排序,联表等...~持续汇总~
  • Python语言学习 (三)1.1
  • windows服务器上面创建定时任务
  • mybatis整合ehcache
  • mac显示隐藏文件
  • 谈谈持续集成,持续交付,持续部署之间的区别
  • 揭秘 DockerCon 重量级演讲嘉宾(六)
  • 纠结的链接:ln、ln -s、fs.symlink、require
  • 配置DHCP
  • org.springframework.dao.InvalidDataAccessApiUsageException: The given object has a null identifier:
  • js中继承的几种实现方式
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • CEF与代理
  • ERLANG 网工修炼笔记 ---- UDP
  • es6(二):字符串的扩展
  • IDEA 插件开发入门教程
  • javascript从右向左截取指定位数字符的3种方法
  • js正则,这点儿就够用了
  • Spring Boot快速入门(一):Hello Spring Boot
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 仿天猫超市收藏抛物线动画工具库
  • 聚簇索引和非聚簇索引
  • 判断客户端类型,Android,iOS,PC
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 函数计算新功能-----支持C#函数
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • (003)SlickEdit Unity的补全
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (超详细)语音信号处理之特征提取
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (七)理解angular中的module和injector,即依赖注入
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)WLAN定义和基本架构转
  • (转)程序员技术练级攻略
  • .cn根服务器被攻击之后
  • .dwp和.webpart的区别
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 读取 JSON格式的数据
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • @Transactional 详解
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • []error LNK2001: unresolved external symbol _m