面向对象设计的11原则--你称得上OO专家么?

面向对象的11个原则 面向对象的11个设计原则 SOLID原则 单一职责原则(The Single Responsibility Principle) 开放/关闭原则(The Open Closed Principle) 里氏替换原则(The Liskov Substitution Principle) 依赖倒置原则(The Dependency Inversion Principle?) 接口分离原则(The Interface Segregation Principle) 包的的设计原则 发布/重用等价原则(REP) 公共闭合原则(CCP) 共同重用原则(CRP) 非循环依赖原则(ADP) 稳定依赖原则(SDP) 稳定抽象原则(SAP)。 立即下载

面向对象设计是什么?都包含了哪些内容?它所带来的好处是什么?需要你为之付出些什么?在如今这个年代,问这些问题似乎显得很愚蠢,因为这年头几乎每位软件开发人员都知道如何使用某种面向对象编程语言。可是这个问题还是很重要,因为在我看来,绝大多数人在使用这些语言的时候并不知道为什么,而且也不知该如何最充分的运用它们。

软件业曾经爆发过的所有变革里,其中曾经有两个派系如此广泛的深入人心,它们就是结构化编程和面向对象编程。所有主流的现代编程语言都被它们两个激烈的影响着。实际上,要想不像结构化和面向对象编程的样子来编写程序都是一件难事。我们的主流编程语言都没有goto,因此它们服从了结构化编程中最重要的禁令。我们的大多数主流编程语言都是基于类的,而且不支持在类以外定义函数或是变量,因此也避免了面向对象编程中最容易坠入的陷阱。

用这些编程语言所编写的程序可能看起来是结构化的或是面向对象的,可是“看起来”是会欺骗人的。当今的编程语言经常不顾他们所从属那种派系的编程语言的基本原则。我会在另篇blog中再探讨结构化编程的原则,本篇,我想要谈论的是面向对象编程的基本原则。

在1995年的三月,我写了一篇文章并发表在comp.object上,那是我第一次写OOD(译注1)原则的文章,此后就一发不可收拾的写了很多。你可以在我的PPP一书(译注2)中看到它们,在object mentor的很多文章中也都有,其中就有那篇众所周知的纲要(近期会译为中文,请关注)。

这些原则着重于OOD中的依赖管理方面,而淡化抽象与建模方面。这并不是说OO在抽象方面不够强大,或是OO不适合构建模型。当然有很多人都在使用OO的这些部分,只是这些原则集中关注于依赖管理。

依赖管理是我们每个人都要面对的问题,每当我们在屏幕面前打开那些彼此纠结又令人作呕的代码,我们就会遭受不良的依赖管理所带来的恶果。不良的依赖管理导致代码难以改变,易被破坏,而且不可重用。实际上,我在PPP一书中谈论过很多不同的设计坏味道,而这些都与依赖管理有关。从另一方面来说,如果依赖经过了良性的管理,代码就可以保持灵活性、健壮性和重用性。所以依赖管理和这些相关原则是程序员们渴求的让软件保持优良架构的基石。

头五项原则是关于类设计的,它们是:

另外的六项是关于包的设计原则。在本文中,包是指一个二进制的可发布文件,比如.jar文件、或dll文件,而不是Java包或是C++的命名空间(译注3)。

头三项包原则是关于包内聚性的,它们会告诉我们该把什么划分到包中:


最后的三项原则是关于包之间的耦合性原则的,并且论述了评价系统中包结构优良与否的评判标准。

 

 译注:

1,OOD,全称Object Oriented Design,即面向对象设计。

2,PPP,即Bob大叔的著作《敏捷软件开发 原则、模式与实践》一书以及其相关书籍,因都有“原则、模式与实践”,即Priciples, Patterns and Practices,故常简称为PPP。

3,命名空间,原文为namespace,也译作名字空间。它是一种特殊的作用域,它包含了处于该作用域内的所有标示符,且本身也用一个标示符来表示,这样便于将一系列在逻辑上相关的标示符用一个标示符来组织。就Java编程语言来说,命名空间是通过java包来表达的,所有代码都归属与一个包。来自其他包中的代码要通过指定包名来引用某项特定的标示符,例如,包java.lang中的String类要通过java.lang.String的形式引用。在C++中,命名空间常用来避免命名冲突,尽管现今的C++语言对命名空间做出了扩展,但过去的C++代码很少使用此项功能。
 

 

(原文链接网址:http://www.butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod; Robert C. Martin的英文blog网址: http://www.butunclebob.com/ArticleS.UncleBob) 

作者简介:Robert C. Martin是Object Mentor公司总裁,面向对象设计、模式、UML、敏捷方法学和极限编程领域内的资深顾问。他不仅是Jolt获奖图书《敏捷软件开发:原则、模式与实践》(中文版)(《敏捷软件开发》(英文影印版))的作者,还是畅销书Designing Object-Oriented C++ Applications Using the Booch Method的作者。Martin是Pattern Languages of Program Design 3和More C++ Gems的主编,并与James Newkirk合著了XP in Practice。他是国际程序员大会上著名的发言人,并在C++ Report杂志担任过4年的编辑。



Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=1299516

 
WorkBench3.2 + VxWorks6.8安装教程 按照FTP连接主机和目标机,将整个VxWorks6.8的安装分为两个部分,一是在主机(win10系统,可以使用虚拟机或者实体机,推荐使用虚拟机)上安装workbench3.2,进行bootrom与VxWroks映像文件的生成,二是在虚拟机上安装VxWorks系统 19.10.10 首先很高兴文章能帮到大家,但由于本人已不做该方向良久,私信和评论的很多问题现在已经无法解答,如果大家有什么问题欢迎... 阅读详情

相关推荐

AI Agent实战:WorkBuddy安装部署、任务执行与模型接入全教程

AI Agent是当前自动化办公与智能工作流的核心技术,它区别于传统问答式AI,能够理解目标、拆解任务并调用工具交付完整成果。其底层原理基于任务规划、工具调用与结果验证的循环机制,让机器从“提供建议”进化为“完成任务”。在工程实践中,合理配置模型服务(如接入DeepSeek)、设计标准化Skill(技能包)与自定义指令,可以显著提升Agent在报告生成、数据分析、竞品调研等场景中的稳定性与效率。WorkBuddy作为典型的任务式AI工作台,为运营、产品、开发等多角色提供了统一入口,覆盖安装部署、任务描述公式

weixin_26712075的博客 289

npm常用命令操作

npm常用命令操作简介版本号~ 、 ^ 和 *基本命令修改NPM源 简介 比较常用的包管理工具 新版的node.js自带了npm,无需额外安装 版本号 npm的版本号分三个部分:主版本号.次版本号.补丁版本号 主版本号: 当API发生改变,并与之前的版本不兼容的时候 次版本号: 当增加了功能,但是向后兼容的时候 补丁版本号: 当做了向后兼容的缺陷修复的时候 ~ 、 ^ 和 * 会匹配最近的小版本依赖包,比如1.2.3会匹配所有1.2.x版本,但是不包括1.3.0 会匹配最新的大版本依赖包,比如1.2.3会匹

yuzenan的博客 432

深入解析Vortex GPGPU cache设计(2),关于cache_bank

本文分析了Vortex处理器的cache_bank模块设计,作为cache系列的第二部分。文章详细阐述了cache_bank的基本结构,包括地址位分配和默认配置参数。重点解析了cache的5种操作及其优先级。文章详细介绍了二级流水线设计,包括TAG/DATARAM的读写操作时序。

weixin_55313207的博客 1168

npm run start 与 npm run dev的区别?

1-具体看你package.json 2-start和dev都是脚本 start执行的就是dev的脚本 - - > 最终目的是执行dev后面的

404路西法的博客 2万+

ZED2双目相机运行VINS-FUSION初试

基于ZED2运行VINS-MONO的经验,在运行VINS-FUSION前有几点tips想跟大家分享,应该能在运行的过程中避免一些踩坑吧。 TIPs 1)关于zed2标定 开始使用Kalibr进行相机单目/双目及联合标定,虽然重投影误差最高也就5个像素,但实际使用效果却并不好,故建议大家相机内参还是从ZED2相机发布出的topic获取或可尝试/usr/local/zed/settings文件下的参数文档 另,启动ZED2.launch的时候,会有一个相机(一般是左目)和IMU的轴系转换关系Camera-IMU

xiaojinger_123的博客 5355

从零开始:用Xilinx FPGA实现RISC-V单周期CPU(附完整Verilog代码)

本文详细介绍了如何使用Xilinx FPGA从零开始实现RISC-V单周期CPU,包括开发环境搭建、核心架构设计、Verilog代码实现及功能验证。通过实战指南和完整代码示例,帮助开发者掌握RISC-V CPU设计的关键技术,适用于嵌入式系统和定制化计算场景。

weixin_30664051的博客 547

面向对象设计的11原则--你称得上OO专家么? (原文最终修订于2006-04-10 下午06:19:40)

面向对象设计是什么?都包含了哪些内容?它所带来的好处是什么?需要你为之付出些什么?在如今这个年代,问这些问题似乎显得很愚蠢,因为这年头几乎每位软件开发人员都知道如何使用某种面向对象编程语言。可是这个问题还是很重要,因为在我看来,绝大多数人在使用这些语言的时候并不知道为什么,而且也不知该如何最充分的运用它们。软件业曾经爆发过的所有变革里,其中曾经有两个派系如此广泛的深入人心,它们就是结构化编程和

Robert C. Martin博客中文版 1万+

知识图谱中的 Ontology(本体论)

1980年,本体论(Ontology)哲学概念“本体”被引入到人工智能领域用来刻画知识。本体概念模型、明确、形式化、共享。本体是实体存在形式的描述,往往表示为一组概念定义和概念之间的层级关系,本体框架形式树状结构,通常被用来为知识图谱定义schema。如人、公司、车等都可以在具体场景下称为本体。Ontology是(特定领域)信息组织的一种形式,是领域知识规范的抽象和描述,是表达、共享、重用知识的方法。Ontology。

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 2028

信号完整性问题的11个基本原则(伯格丁原则)

信号完整性问题的11个基本原则 提高高速产品设计的关键是:充分利用分析工具实现准确的性能预估,使用测量手段验证设计过程,降低风险并提高所采用设计工具的可信度。 将问题的实质与表面现象剥离开的唯一可行途径是:采用经验法则,解析近似,数值仿真工具或测量工具获得数据,这是工程实践的本质要素。 任何一段互联,无论线长和形状,也无论信号的上升边如何,都是一个由信号路径和返回路径构成的传输线。一个信号在沿着互联前进的每一步,都会感受到一个瞬时阻抗。如果阻抗恒定为常数,比如具有均匀横截面传输线的情况,那么其信

小幽余生不加糖 1万+

matlab 质心重合法实现点云配准【2026最新版】

质心重合法是将源点云和目标点云的质心重合,以此缩小两点云集之间的平移误差,从而为下一步粗配准提供更好的初始位置姿态。

点云侠的博客 509

YOLO11改进策略【独家融合改进】| RCSOSA + SPD + WFU

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。WFU模块通过小波变换的频率分解与跨尺度融合机制,解决了传统上采样过程中的混叠和细节丢失问题,实现了高效、高保真的面部细节重建。

Limiiiing的博客 449

用npm-run自动化任务

自动构建javascript有不少好工具。不过其实很少有人知道,npm run命令就能很好地完成这一任务,配置起来也很简单。 James Halliday在博客上分享了使用npm run自动化任务的一些经验: script npm 会在项目的 package.json 文件中寻找 scripts 区域,其中包括npm test和npm start等命令。 其

kooky博客 1万+

【华为OD机试真题】282、求满足条件的最长子串的长度 | 机试真题+思路参考+代码分析 (C++、Java、Py、C语言、JS)

题目描述 >给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求: >  1、只包含1个字母(a~ z,A~Z), 其余必须是数字; 2、字母可以在子 串中的任意位置; >  如果找不到满足要求的子串,如全是字母或全是数字,则返回-1

KJ.JK 1万+

面向对象设计的11原则--你称得上OO专家么?

转自Robert C. Martin博客中文版前言面向对象设计是什么?都包含了哪些内容?它所带来的好处是什么?需要你为之付出些什么?在如今这个年代,问这些问题似乎显得很愚蠢,因为这年头几乎每位软件开发人员都知道如何使用某种面向对象编程语言。可是这个问题还是很重要,因为在我看来,绝大多数人在使用这些语言的时候并不知道为什么,而且也不知该如何最充分的运用它们。软件业曾经爆发过的所有变革里,

山里来的鱼 1283

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

面向对象设计的11原则--你称得上OO专家么? (原文最终修订于2006-04-10 下午06:19:40)...

面向对象设计是什么?都包含了哪些内容?它所带来的好处是什么?需要你为之付出些什么?在如今这个年代,问这些问题似乎显得很愚蠢,因为这年头几乎每位软件开发人员都知道如何使用某种面向对象编程语言。可是这个问题还是很重要,因为在我看来,绝大多数人在使用这些语言的时候并不知道为什么,而且也不知该如何最充分的运用它们。 软件业曾经爆发过的所有变革里,其中曾经有两个派系如此广泛的深入人心,它们就是结构化编程和...

ijavagos 132

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

OO的设计原则

转自:http://www.cnblogs.com/wanghao72214/archive/2009/03/11/1408444.html 1         OO的设计原则 采用面向对象的分析和设计思想,为我们分析和解决问题提供了一种全新的思维方式。我们在拿到需求之后(略去OOA,以后补全),接下来的问题就是:如何对系统进行面向对象的设计呢? 按照软件工程的理论,面向

bobozhuli的专栏 1442

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

面向对象分析和设计OOA/D,UML,GRASP

分析,强调是对问题和需求的调查研究,不是解决方案。例如,需要设计一个交易系统,那么如何使用他?他有什么功能?设计,强调满足需求概念上的解决方案。而不是实现。例如,数据库解决方案和软件对象描述。面向对象分析(object-oriented analysis):强调的是在问题领域内发现和描述对象或者概念。例如,在学生信息管理系统里包含学生,班级,课程等概念。面向对象的设计(object-oriented design):强调是定义软件对象以及他们如何协作以实现需求。

z524635690的博客 1490

无线互联网

面向对象设计的11原则--你称得上OO专家么? (原文最终修订于2006-04-10 下午06:19:40) - Robert C. Martin博客中文版 - 优快云Blog # 迟宇宙:把注下到无线互联网吧_通讯与电讯_科技时代_新浪网 # 内容管理:传媒行业新课题 - DoNews.com # 网络广告颠覆传统模式 - Drate的随笔 - 优快云Blog...

手机即信息 195

软件分析设计与建模(UML)期末复习笔记

这是一篇关于大学软件分析设计与建模课程的期末复习笔记

weixin_73622063的博客 2377

书籍推荐 —— UML和模式应用(原书第3版)

■关于面向对象分析与设计及UML的经典之作。■全面升级到UML 2和新的迭代/敏捷实践。■增加了全新的案例研究,阐述了大量关键思想。无论对于专业人士还是教师来说,本书都堪称经典之作。本书介绍了对象思想,并在实际的面向对象分析和设计中应用这一观点。本书的第1版和第2版广受赞誉,在第3版中,作者Craig Larman所作的更新充分反映了新的UML 2标准,有助于读者掌握对象设计,并且提倡具有高度影响的、迭代和有效的敏捷建模实践。

blackcat123的博客 1772

OO圣经的解读

设计模式简介 设计模式代表了软件开发人员总结解决问题的心血和结晶,一种解决实际问题的“套路”。一种被反复使用的,多数人知晓的,经过分类编目的,代码设计经验的总结。它能够重用代码,让代码易理解,保证可靠。 1994年苏黎世大学计算机科学博士艾瑞克伽马,墨尔本大学计算机科学博士理查德郝尔姆,康奈尔大学计算机科学博士拉尔夫约翰森,斯坦福大学计算机科学博士威利斯斯利(05年12月去世)。四人共同编写了...

TonyHelloWorld的博客 720

UML和模式应用学习笔记(10)——使用GRASP的对象设计示例

  最近一段时间工作比较忙,好久没有学习了。今天硬逼着自己学习了一会儿。直接进入主题。。。   GRASP是一组模式或原则吗?GRASP定义了9个基本OO设计原则或基本设计构件,其描述的是原则而不是模式。模式是一种优秀的学习工具,可以用来命名、表示和记忆那些基本和经典的设计思想。   GRASP的9个模式: 创建者(Create) 控制器(Controller)是UI层之上的第一个对象...

weixin_30344995的博客 203

Atitit GRASP(General Responsibility Assignment Software Patterns),中文名称为“通用职责分配软件模式”...

Atitit GRASP(General Responsibility Assignment Software Patterns),中文名称为“通用职责分配软件模式” 1. GRASP (职责分配原则)1 1.1. GRASP设计模式 1 1.2. 9个基本的OO设计原则或基本的设计构件。这9个设计模式分别是:创建者(Creator)、信息专家(InformationExper...

weixin_30342209的博客 90

工作现状

最近在优快云上看了一篇文章 面向对象设计的11原则--你称得上OO专家么? >>是Bob大叔写的,感触颇深,写程序也有些许时间了。觉得自己虽然能用java实现交付的一些任务,但java是一门OO语言,我在设计和编码时候总避免不了违反OO的一些基本原则。相对于程序设计来说,自己始终还是个门外汉。在书中Bob大叔谈到了他的书《敏捷软件开发 原则、模式与实践》,后来在网上下到了,粗略的看了下其中的章节

飞羽飞の猪の博客 795
上一篇: 学习mysql4.1的空间数据库特性(2)
下一篇: 工作现状
飞羽飞之猪
博客等级 码龄21年 127粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值