敏捷软件开发 - 原则、模式与实践 —— 敏捷设计(三)开放-封闭原则

Java工资单:敏捷软件开发原则与实践的案例研究 敏捷开发是一套适应不断变化需求的软件开发方法论。它倡导跨功能团队的协作、客户合作、以及在开发周期中频繁地交付产品增量。敏捷宣言中提出的价值观和原则为软件开发提供了指导。敏捷宣言:1. 个体和互动高于流程和工具2. 可工作的软件高于详尽的文档3. 客户合作高于合同谈判4. 响应变化高于遵循计划依赖倒置原则(Dependency Inversion Principle, DIP)要求高层模块不应该依赖于低层模块,两者都应该依赖于抽象。具体来说,这意味着系统的设计应遵循依赖抽象,不依赖具体实现。 阅读详情

本文为敏捷软件开发 - 原则、模式与实践系列的一部分。

本文对应原书第9章。

开放-封闭原则 (OCP - The Open/Closed Principle)

软件实体(类、模块、函数等等)应该是可以扩展的,但是不能修改的。
对于扩展是开放的。对于更改是封闭的。

关键是抽象

一般而言,无论模块是多么的“封闭”,都会存在一些无法对之封闭的变化。没有对于所有的情况都贴切的模型。既然不可能完全封闭,那么就必须有策略的对待这个问题。也就是说,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离这些变化。

我们如何知道哪个变化有可能发生呢?我们进行适当的调查,提出正确的问题,并且使用我们的经验和一般常识。最终,我们会一直等到变化发生时才采取行动。

  • 只受一次愚弄
    为了防止软件背负不必要的复杂,我们会允许自己被愚弄一次。这意味着我们最初编写代码时,假设变化不会发生。当变化发生时,我们就创建抽象来隔离以后发生的同类变化。简而言之,我们愿意被第一颗子弹击中,然后我们会确保自己不再被同一只枪发射的其他任何子弹击中。

  • 刺激变化
    如果我们决定接受第一颗子弹,那么子弹到来的越早、越快就对我们越有利。我们希望在开发工作展开不久就知道可能发生的变化。查明可能发生的变化所等待的时间越长,要创建正确的抽象就越困难。因此,我们需要去刺激变化。我们已在前面介绍过一些方法来完成这项工作。

    • 我们首先编写测试。
    • 我们使用很短的迭代周期进行开发
    • 我们在加入基础结构前就可发特性,并且经常性地把那些特性展示给涉众。
    • 我们首先开发最重要的特性。
    • 尽早地、经常性地发布软件。

结论

在许多方面,OCP都是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处(也就是,灵活性、可重用性以及可维护性)。然而,并不是说只要使用一种面向对象语言就是遵循了这个原则。对于应用程序中的每个部分都肆意地进行抽象同样不是一个好主意。正确的做法是,开发人员应该仅仅对程序中呈现出频繁变化的那些部分做出抽象。拒绝不成熟的抽象和抽象本身一样重要。

完整内容请查看敏捷软件开发 - 原则、模式与实践系列

基于PLC1200与CB1241的RS485从站Modbus Rtu通信实战指南 本文提供了一份详细的西门子S7-1200 PLC与CB1241 RS485通讯板实现Modbus RTU从站通信的实战指南。内容涵盖从硬件接线、博途软件组态、关键参数设置到程序调试与测试的全过程,重点解析了Modbus_Slave指令配置与数据块映射,帮助工程师快速掌握工业自动化系统中的数据采集与设备接入技术。 阅读详情

相关推荐

VS2019中C++动态链接库(DLL)的创建与调用

VS2019中C++动态链接库(DLL)的创建与调用,及一些进阶技巧。

qq_42232522的博客 7563

深入函数式编程:实践与应用常见设计模式

函数式编程的思想在JavaScript社区中得到了越来越多的关注和应用。尽管它强调纯函数、不可变性和无副作用,与传统的面向对象设计模式有所不同,但我们会发现很多传统设计模式的概念在函数式编程中同样具有实际应用的价值。在本文中,我们将深入研究函数式编程中常用的8个设计模式,并通过实例演示它们在实际应用中的深层次实践。通过这些深入实践的例子,我们更全面地理解了函数式编程中常见设计模式的应用。这些模式的深层次实践展示了如何在实际项目中灵活应用函数式编程的思想,创造出更为清晰、可维护且高度抽象的代码。

xkl_123的博客 1746

Jetson编译安装pycuda

可使用nvcc --version查看是否有信息输出,若没有,且安装cuda的情况下,需要手动将CUDA 的路径添加到环境变量中。编译生成_pvt_struct.cpython-38-aarch64-linux-gnu.so文件。基于jetson orin nano jetpack512模块上安装pycuda。4、获取pycuda源码(版本根据实际情况获取)2、进入conda环境并安装cuda工具包。9、若未检测出来需要清除并强制编译。7、编译成功后安装pycuda。5、配置编译并设置环境变量。

qq_48175141的博客 972

函数式编程的理解

这些示例展示了函数式编程在Python、JavaScript和Java中的一些特性和用法,包括高阶函数、纯函数、不可变性和延迟计算。

ydl1128的博客 1472

手把手教你学simulink(16.8)--基于Simulink的小波变换滤波器(Wavelet Transform Filter)项目

基于Simulink的小波变换滤波器(Wavelet Transform Filter)项目的详细实例介绍。这个项目将重点放在小波变换滤波器的设计、实现和仿真上,帮助你理解和应用小波变换滤波器在信号处理中的作用。

MHD0815的博客 534

【100%通过率】华为od统一考试B卷【需要打开多少监视器】JAVA&Go 实现

某长方形停车场,每个车位上方都有对应监控器,当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时,监控器才需要打开:给出某一时刻停车场的停车分布,请统计最少需要打开多少个监控器

MISAYAONE的博客 1万+

大模型时代的程序设计·构建未来软件的蓝图 | 好书推荐

在人工智能和机器学习主导的大模型时代背景下,设计模式的知识对于软件开发从业者来说变得尤为重要。这些模式作为构建灵活、可扩展系统的基石,在新兴技术快速发展的环境下,帮助开发者应对挑战。以下书单涵盖了设计模式的经典原则及其在现代技术中的应用,旨在为软件工程师、系统架构师等专业人员提供与时俱进的参考,帮助他们适应技术革新的浪潮。小编推荐这个关于设计模式的书单,希望可以帮助从业者更好地理解其在现代技术环境中的实际应用,从而在激烈的竞争中获得优势。《设计模式:可复用面向对象软件的基础》(典藏版)

mama19971023的博客 834

UG NX二次开发(C#)-外部模式-批量删除某些图层中的体对象和曲线对象

在 UG NX中,有时需要批量删除某文件夹下多个.prt文件中固定一些图层中的体对象和曲线对象,这时如果采用手动逐个打开模型,并选择针对的图层删除,即耗时也容易遗漏,因此采用外部模式来处理比较方便。本文介绍批量删除某些图层中的体对象和曲线对象。

GimiGimmy 3035

【Go工程化实践】:为什么顶尖团队都用这6种函数设计模式?

掌握Go函数最佳实践,提升代码可维护性与团队协作效率。本文详解6种高频率使用的函数设计模式,涵盖错误处理、接口抽象与依赖注入等场景,揭示顶尖团队的工程化方法。实用技巧值得收藏。

PixelStream的博客 940

【超详细】MIT 液态神经网络(LNNs)——深度学习新动向

输入可以是任何形式的时间序列数据,其中表示时间。例如传感器读数、金融市场数据、语音信号等。

allein_STR的博客 2611

使用 MATLAB/Simulink + Communications Toolbox + 5G Toolbox,构建一个2×2 MIMO-OFDM通信系统

本文通过Simulink+CommunicationsToolbox构建2×2 MIMO-OFDM通信系统,重点实现信道均衡滤波器(ZF与MMSE)的设计与应用。详细介绍了系统架构、建模步骤(包括信道估计、均衡器实现)和仿真场景设计,通过BER、星座图和EVM对比分析验证了MMSE均衡器在抑制噪声和信号恢复方面的优势。文章总结了MIMO均衡的核心原理与实践经验,并提出了扩展至大规模MIMO、深度学习均衡器等优化方向,为无线通信系统设计提供实用指导。

amy_mhd的博客 127

函数式编程:探索高效、灵活的编程范式

通过深入学习和应用函数式编程的原则和技术,开发人员可以提高代码的可靠性、可扩展性和可测试性,从而更高效地构建复杂的应用程序。函数式编程是一种强大、灵活且受欢迎的编程范式,它的核心思想是将计算过程看作是函数之间的转化。函数式编程强调使用纯函数、避免共享状态和可变数据,以及利用高阶函数和lambda表达式等概念来实现代码的简洁和可复用性。通过函数的组合和变换,可以处理事件流和异步操作,实现响应式的数据流和交互。由于纯函数和不可变性的特性,函数之间的依赖关系更清晰,代码的逻辑更易于理解和调试。

鑫和皓的博客 280

2025年最新雷电模拟器9.22安装Magisk面具和LSPosed框架完整图文教程 文章末尾附所需软件下载

操作环境:雷电模拟器9.0.22 虚拟系统版本android 91、设置-其他设置-Root权限-开启2、设置-性能设置-System.vmdk可写入3、安装Magisk-18a0b94a-delta(25205).apk,运行并给予root权限4、选择右上角安装弹出“允许“magisk Delta”访问您设备上的照片、媒体内容和文件吗?“选择允许,然后结束magisk进程。5、从新运行magisk选择右上角安装-选择修补boot镜像中的vbmeta和安装到Recovery。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 7102

敏捷软件开发 - 原则、模式与实践

起源 《敏捷软件开发 - 原则、模式与实践》是我接触到的第一本系统介绍软件设计的书籍,深刻影响了个人的软件开发习惯。它并不难懂,我一直推荐给身边的各个层次的程序员学习。 可对于一本接近500页的图书,很多人还是望而却步。一直都想写个关于这本书的速读,使更多的人了解它。但是最近又重新学习了一遍发现它之所以有价值不仅仅在于书中总结的原则和模式,更在于它提供的如何运用这些原则、模式的实践例子。忽略了大量...

feifeilb的博客 2377

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

敏捷软件开发——开放封闭原则OCP

敏捷软件开发——开放封闭原则OCP 首先,让我们分析一下背景。什么是软件开发过程中最不稳定的因素?——答案是需求!需求在软件开发过程中时时刻刻都可能发生变化。那么,如何灵活应对变化是软件结构设计中最重要也是最困难的一个问题。好的设计带来了极大了灵活性,不好的设计则充斥着僵化的臭味。这样,也就引出了本文的主题:【开发封闭原则】。       下面,就来简单扼要的介绍一下什么是【开放封

2432

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

敏捷开发笔记(第9章节)--开放-封闭原则(OCP)

​Ivar Jacobson曾说过,“任何系统在其生命周期中都会发生变化。如果我们期望开发出的系统不会再第一版后就被抛弃你就必须牢牢记住一点”。Bertrand Meyer在1988年提出著名的开发-封闭原则(The Open - closed Principle,简称OCP)为我们提供了指引。

stupid的博客 2464

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

《敏捷软件开发──原则、模式与实践》阅读笔记

《敏捷软件开发──原则、模式与实践》阅读笔记 《敏捷软件开发──原则、模式与实践》阅读笔记 Table of Contents 1. 敏捷开发 1.1. 敏捷联盟宣言 1.2. 敏捷开发的原则 2. 极限编程 3. 设计原则 3.1. 单一职责原则(SRP) 3.2. 开放——封闭原则(OCR) 3.2.1. 遵循开放──封闭原则设...

weixin_30855761的博客 666

敏捷软件开发:原则、模式与实践 第七至九章读书笔记

第七章 敏捷设计 拙劣设计的症状定义: 僵化性(Rigidity): 设计难以改变 对软件进行一个单一改动,却引发一系列有依赖关系模块的连锁改动 脆弱性(Fragility): 设计易于遭到破坏 对软件进行单一改动时,程序的许多其他地方就会出现问题 牢固性(Immobility): 设计难以重用 设计中包含了对其他系统有用的部分,但是把这部分从系统中分离出来代价和风险很大 粘滞性( Viscos...

文森猫的记录 614

《敏捷软件开发:原则、模式与实践》读书笔记

1、敏捷软件开发宣言 个体和交互         胜过 过程和工具 可以工作的软件     胜过 面面俱到的文档 客户合作           胜过 合同谈判 响应变化           胜过 遵循计划 2、面相对象设计的原则 单一职责原则 开放-封闭原则 Liskov替换原则 替换原则 依赖倒置原则 接口隔离原则 重用发布等价原则 共同封闭原则

backard的专栏 2418

软件开发之设计原则和模式

<br /><br />    软件开发是一项高强度的脑力劳动过程,到目前为止尚没有办法使软件开发完全机械化,只能靠人脑去设计,也无法保证一个软件完全没有错误。同硬件产品相比,一方面是同功能的软件产品不再需要一个生产过程,只需要拷贝就行了,而硬件产品却需要重复生产;另一方面,软件产品功能需求的变化远比硬件产品多。这就造成软件产品和硬件产品在成型之后面临的问题是不同的,软件产品主要是应付用户功能需求的变化和扩展,硬件产品主要着眼于如何大规模地生产。硬件产品的大规模生产可以交给机器去执行,而软件产品的需求变化还

anguangqing的专栏 5293

敏捷软件开发之敏捷设计原则

第七章 什么是设计模式 1. 源代码是软件系统的主要设计文档 我们不应该认为软件设计就是一组和代码分离的UML图,UML图只是描述了设计的一部分。 软件项目的设计是一个抽像的概念。它和程序的概括形状、结构以及每一个模块、类和方法的详细形状和结构有关。 设计的最终体现在 源代码 中。 2.设计中臭味——腐化软件的气味 僵化性: 耦合性高,模块组件件关系太紧密,依赖性高,一动全动。 脆弱性: 改...

mac终端命令小入门 421

敏捷软件开发总结——开放-封闭原则(OCP)

开放-封闭原则(OCP)的意义 任何系统在其生命周期中都会发生变化,那么怎样的设计才能面对需求变化而保持相对稳定?著名的开放-封闭原则(OCP)为我们提供了指引。 如果程序中的一处改动就会造成连锁反应,导致一系列相关模块改动,那么设计就具有僵化性。OCP建议我们对此重构,这样以后改动就只需要添加新的代码,而不必修改已经正常运行的代码。 关键是抽象 策略(Strategy)模式和模板方法(Templ...

take it easy 644

敏捷软件开发原则,模式与实践书摘

敏捷软件开发原则,模式与实践书摘。 拙劣设计的症状: 僵化性(Rigidity):很难对系统进行改动,因为每个改动都会迫使许多对系统其它部分的其它改动脆弱性(Fragility):对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出现问题牢固性(Immobility):很难解开系统的纠结,使之成为一些可在其他系统中重用的组件粘滞性(Viscosity):做正确的事情比做错误的事情要

CPP_CHEN的专栏 1856

敏捷软件开发 - 原则、模式与实践 —— 敏捷设计(七)包的内聚性原则

本文为敏捷软件开发 - 原则、模式与实践系列的一部分。 本文对应原书第20章前半部分 包的内聚性原则 重用发布等价原则(REP - The Reuse/Release Equivalence Principle) 重用的粒度就是发布的粒度 REP指出,一个包的重用粒度可以和发布粒度一样大。我们所重用的任何东西都必须同时被发布和跟踪。简单的编写一个类,然后声称它是可重用的做法是不现实的。只有在建立一...

feifeilb的博客 456

《敏捷软件开发》学习笔记:敏捷设计原则

遵循敏捷实践去发现问题;应用设计原则去诊断问题;应用适当的设计模式去解决问题。 软件开发这三个方面件的相互作用就是设计。

七月南风 1027

推荐:《敏捷软件开发、原则、模式与实践》电子版

 内容简介 在这本书中,享誉全球的软件开发专家和软件工程大师Robert C.Martin将向您展示如何解决软件开发人员、项目经理及软件项目领导们所面临的最棘手的问题。这本综合性、实用性的敏捷开发和极限编程方面的指南,是由敏捷开发的创始人之一所撰写的。   ·讲述在预算和实践要求下,软件开发人员和项目经理如何使用敏捷开发完成项目。   ·使用真实案例讲解如何用极限编程来设计、测试、重构和结

Scrum中文网-博客 1318
上一篇: 敏捷软件开发 - 原则、模式与实践 —— 敏捷设计(二)单一责任原则
下一篇: 敏捷软件开发 - 原则、模式与实践 —— 敏捷设计(四)里氏替换原则
feifeilb
博客等级 码龄22年 22粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值