腾讯亿级用户规模自研业务的上云实践解读,立即报名 了解详情
写点什么

SOLID 面向对象规则中的开放-封闭原则受到挑战

  • 2013-05-08
  • 本文字数:675 字

    阅读完需:约 2 分钟

开放-封闭原则(OCP)是面向对象的 SOLID 原则中的一种,该原则最近受到了 Jon Skeet Robert Ashton 的批评。他们认为,与其定义一样,该原则弊大于利。该原则是由 Robert C. Martin 在本世纪初总结出来的,Robert 辩护说,你们应该看一下完整的描述,而不是只看短短的定义。

这场争论是由《 C# in Depth 》的作者 Jon 的一条推特引发的,他质疑说:

“我知道,质疑 __OCP__ 这样的原则近乎于异端邪说,但我从来就没感觉到它有什么意义。”

Robert C. Martin 在一条回复中回顾了 OCP 原始文章给出的定义:

符合开放-封闭原则的模块有两个主要属性:

1. 为扩展而开放。这意味着模块的行为可以扩展。随着应用需求的改变,我们可以让模块表现出新的不同行为,或者满足新应用的需求。

2. 为修改而关闭。这种模块的源代码是不能动的,不允许任何人修改。

Robert 在回复中承认该原则的定义是有点夸大,但他同时宣称整篇文章的解释更为温和,而且他在新写的一篇文章中改进了其定义。

面对 Robert 的回复,Jon 继续争论说,定义和描述还是太过模糊不清,要讲清本质,这类原则必须使用正确的术语仔细定义。相反,他认为 Alistair Cockburn 创造的“防止变异( Protected Variation )”这一类似概念的描述更好一些:

“识别出预计会发生改变的点,围绕这些点来设计稳定的接口。”

Robert Ashton 随后也对开放-封闭原则提出了批评,他认为该原则是导致很多软件过度设计的罪魁祸首。但是他也承认,该原则在有些领域是有意义的,比如设计会反复修改的场景。之后他还谈到了SOLID 原则的其他4 个

查看英文原文 Open-Closed Principle in SOLID Object Orientation Rules Challenged

2013-05-08 09:381713
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 123.5 次阅读, 收获喜欢 32 次。

关注

评论

发布
暂无评论
  • SQL 语句对基本表的修改表结构和数据完整性

    在定义完表之后,如果需求有变化,比如需要添加列,删除列或修改列定义,则可以使用ALTER TABLE语句实现。ALTER TABLE语句可以实现添加列,删除列和修改列定义功能,也可以实现添加和删除约束的功能。

    2022-11-12

  • 设计模式之备忘录模式

    书上备忘录的解释是,在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

    2022-09-19

  • 结束语 | 静下心来,品味经典

    从专栏上线发布到现在,不知不觉三个月时间过去了,感谢你的一路陪伴,今天到了说再见的时候。

    2019-08-17

  • DSL:你也可以设计一门自己的语言

    即便我们不去设计一个内部DSL,这种写代码的方式也会对我们代码质量的提高大有助益。

    2020-06-17

  • 程序员练级攻略:软件设计

    Linus 说过,这世界程序员的高下之分,最大的区别就是程序员的“品味”不一样。而对软件设计的学习是提高“品位”的关键。

    2018-06-21

  • Michael Feathers 希望消除错误能驱动设计

    Michael Feathers因其著作《高效操作遗留代码》(Working Effectively With Legacy Code)一书而广为人知。他发现错误中存在着一些值得关注之处,但他也承认大部分开发人员并未投入时间去关注这些错误。在他看来,很多错误解决机制就是采取某种程度上的放弃。在 Explore DDD 2018大会上,Feathers做了主题演讲,探讨消除错误如何驱动软件系统的设计。

  • 为.NET 重新审视 SOLID 设计原则和其他模式

    Andras Nemes是一位.NET平台上的web开发者。他在博客中撰写了一系列有关SOLID设计原则和其他设计模式的博文,他发现这些模式在面向对象编程和设计中非常有趣。最近写到了SOLID中的D,也就是依赖倒转原则。此前的博文已经涵盖了其他模式中的命令模式、建造者模式、访问者模式、桥接模式和观察者模式。

  • 你应该知道的高效学习法

    在开始谈高效的学习方法之前,先聊聊什么是学习,那什么是学习,我们可以在脑海中过一遍,从小学到大学再到工作,我们不停地学习新的知识,学习不就是一种行为嘛,那到底是怎样的一种行为,能具体说说吗?我先给学习下个定义,它分为三个过程,第一个过程是理

    2021-09-11

  • 人生向前

    不知不觉,人快30,真的有种从天下皆任我行,到认知自己的平凡的过程,长期的漂泊,心已乏,30岁有家有娃,有车有房,但是依然在为了那个自己不存在的念头苦苦挣扎,不敢屈于自己的平庸,究竟怎么才算平庸,怎么也不知道去定义,做技术,一直觉得curd这个事情

    2021-04-16

  • 设计模式(上):C++ 与设计模式有啥关系?

    我对多年的实践经验进行了提炼和总结,希望帮你快速掌握并用好设计模式,写出高效、易维护的代码。

    2020-06-18

  • 编程范式:明明写的是 Java,为什么被人说成了 C 代码?

    很多语言都有着自己主流的编程范式,我们要打破编程范式的“次元壁”,把不同编程范式中优秀的元素放在一起。

    2020-06-22

  • 频面试题合集

    题目描述:实现一个冒泡排序

    2022-09-13

  • Go- map 的定义

    Go 语言map的定义

    2021-08-27

  • 总结回顾:在实际软件开发中常用的设计思想、原则和模式

    如果说设计原则相当于编程心法,那设计模式相当于具体的招式。

    2020-06-19

  • 讨论:怎样才算“易于维护”?

    不久前,NHibernate的主力开发人员Oren Eini在博客上发表了一篇名为“怎样才算易于维护”的文章,许多网友围绕这个问题表达了自己的看法。

  • 调查报告:敏捷意味着什么

    近10年前,敏捷宣言在2001年2月起草。从那时起,大环境不断改变,成千上万的人已经把敏捷的12条原则运用到他们的日常工作中。Laurie Williams实施了一个调查,来理解敏捷原则是否经得起时间和实践的考验。她在这里探讨了一些早期结果。

  • 软件专家的对话模式(第六部分)

    如何说服你的客户/上级/团队接受你的想法?——在我同团队共事的过程中,这是人们问的最多的问题之一。本文将介绍一些有效的技术,帮助你提出相对于客户的建议方案而言你认为更好的方案。我们还会判断一下,那是否真是关于说服力。

发现更多内容

2021年国内促进软件产业发展十大事件出炉,HarmonyOS 2入选

科技汇

echarts饼图指示器文字颜色设置不同

空城机

eCharts 5月月更

如何清除 WordPress 中的缓存

海拥(haiyong.site)

WordPress 5月月更

谁说 Zadig 只能复制环境?数百微服务一套环境实现高效协作

Zadig

DevOps 云原生 CI/CD 软件交付

动辄“耗资过亿”的表格工具,究竟难在哪儿?

葡萄城技术团队

4月月更开奖啦!中奖者速来领取!

InfoQ写作社区官方

热门活动

快速上手 Pythond 采集器的最佳实践

观测云

运维 可观测性 可观测

备受关注的Bit.Store,最新动态一览

西柚子

直播预告 | PolarDB-X 动手实践系列——PolarDB-X Replica原理和使用

阿里云数据库开源

数据库 阿里云 开源 PolarDB-X

钉钉 Flutter 跨四端方案设计与技术实践 | Dutter

阿里巴巴终端技术

flutter 移动端 跨端框架 桌面端

我国类脑计算处于什么水平?人工智能下神经科学启发的类脑计算。

蓝海大脑GPU

人工智能 液冷服务器 类脑计算 神经科学

实现同比、环比计算的N种姿势

葡萄城技术团队

数据分析 BI数据分析 同比 环比

Cilium 多集群 ClusterMesh 介绍

Se7en

“软件定义汽车”的数字化之变,华为云低代码平台带来了什么?

脑极体

玩了一场剧本杀,同车队友“不是人”

脑极体

时序数据库在监控运维平台中的应用

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

如何开发 LAXCUS 分布式应用软件(四):编写边缘端软件

LAXCUS分布式操作系统

并行计算 端边云协同架构 分布式操作系统 分布式应用软件

云图说|华为云帮助中心最佳实践:源自项目实战的上云指导

华为云开发者联盟

最佳实践 华为云 云图说 帮助中心 业务上云

String源码解析-String的使用注意2

zarmnosaj

5月月更

在字节跳动,一个更好的企业级SparkSQL Server这么做

字节跳动数据平台

基于 Agora SDK 实现 Windows 端的一对一视频通话(基于3.6.2版本)

声网

人工智能 音视频 sdk

【刷题第五天】1. 两数之和

白日梦

5月月更

GPU分类和应用现状分析

Finovy Cloud

人工智能 云计算 gpu GPU服务器

“四大高手”为你的 Vue 应用程序保驾护航

葡萄城技术团队

维护版式文档技术生态 国际PDF协会向福昕软件发来感谢信

联营汇聚

深入剖析 split locks,i++ 可能导致的灾难

火山引擎开发者社区

架起医院就诊“快车道”,YRCloudFile 打造智慧 PACS 存储系统

焱融科技

云计算 分布式 高性能 文件存储 智慧医疗

Hadoop Echarts

Emperor_LawD

hadoop 5月月更

SOLID面向对象规则中的开放-封闭原则受到挑战_语言 & 开发_Jan Stenberg_InfoQ精选文章