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

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

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

本文对应原书第9章。

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

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

关键是抽象

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

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

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

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

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

结论

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

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

智能座舱语音测试避坑指南:从唤醒率到方言识别,这些场景你测全了吗? 本文深入解析智能座舱语音测试的关键场景与避坑指南,涵盖唤醒率测试、方言识别、多音区交互等复杂场景。通过实战案例与自动化测试方案,帮助开发者全面提升语音系统的可靠性与用户体验,特别关注环境噪声干扰与方言覆盖策略。 阅读详情

相关推荐

使用python获取同花顺免费版和同花顺远航版自选股数据用于量化交易

在做量化交易时,有时需要在盘中实时监控同花顺自选股的数量,以便灵活地自定义提醒、捕捉买卖时点等。那么,如何使用python获取同花顺自选股数据呢?

tzzqn2008的专栏 3682

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

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

xkl_123的博客 1746

DDR3性能优化实战:如何用Xilinx MIG控制器实现800MHz稳定读写(7系列FPGA版)

本文深入探讨了在Xilinx 7系列FPGA上使用MIG控制器实现DDR3存储器800MHz稳定高速读写的实战优化技巧。文章聚焦于高级时序调优、Bank Machine调度策略、用户接口设计优化以及利用ILA进行信号完整性调试,旨在帮助工程师突破性能瓶颈,实现接近理论峰值的稳定带宽,并为进一步冲刺更高频率提供进阶调参指南。

seed的博客 778

函数式编程的理解

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

ydl1128的博客 1472

Simulink中通过MEX与MinGW实现C/C++结构体变量的高效导入

本文详细介绍了在Simulink中通过MEX工具链与MinGW编译器,高效导入C/C++结构体变量的完整流程。文章从需求背景出发,逐步讲解了MinGW环境配置、.h文件编写规范、核心导入命令Simulink.importExternalCTypes的使用,以及如何在MATLAB Function模块和总线创建器中调用自定义结构体,旨在实现模型与代码的无缝对齐,为后续仿真和代码生成奠定坚实基础。

weixin_29056781的博客 344

CAPL编程的催化剂——CAPLdll的实现

CANoe作为一款功能强大的总线开发及测试工具,不仅仅是因为其丰富的库函数,最重要的是其兼容了多种编程语言,可以实现灵活的开发,极大的解决了纯CAPL编程所带来的限制,如通过动态链接库(DLL)来实现复杂函数的编写,使其能够在CAPL中可以调用,下面将对DLL的实现进行分析。capldll.cpp这个文件初看相当复杂,从整体上来说,这段代码主要包含了两部分:自定义函数实现和回调函数定义,今天的主要任务是实现自定义函数,这里的函数定义与普通函数定义差不多,只是利用了CAPL的格式。在VS2017工程中打开。

车载控制器AutoSAR软件开发工程师 4648

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

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

mama19971023的博客 834

YOLOv8改进策略【YOLO和Mamba】| 2024 VM-UNet,高效的特征提取模块VSS block 二次创新提高精度

VM-UNet模型设计的出发点是解决现有CNN-based和模型在医学图像分割中的局限性,利用(SSMs)的优势,提出一种更有效的医学图像分割模型。具体来说,CNN-based模型在捕捉长距离信息方面存在不足,而模型由于自注意力机制的二次复杂度导致计算负担较重。SSMs模型如Mamba不仅在建模长距离依赖方面表现出色,还具有线性计算复杂度,这为VM-UNet的设计提供了理论基础。

Limiiiing的博客 622

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

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

PixelStream的博客 940

用C#+Avalonia写跨平台串口工具:Windows/macOS/Linux通吃,还能解析Modbus+画实时曲线

不管是串口还是蓝牙,核心操作都是“打开连接、发数据、收数据、关连接”,先定义一个// 通信设备接口:统一串口/蓝牙的操作// 连接状态变化事件(UI层订阅)// 接收数据事件(收到数据后触发)// 通信配置(不同设备配置不同,用泛型)// 通信设备接口:统一串口/蓝牙的操作 public interface ICommDevice : IDisposable {// 连接状态变化事件(UI层订阅) event Action < bool > OnConnectionChanged;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 998

国科大学习资料--计算机视觉(胡占义、董秋雷)--2018-2019第二学期期末试卷

国科大学习资料–计算机视觉(胡占义、董秋雷)–2018-2019第二学期期末试卷 国科大学习资料–计算机视觉(胡占义、董秋雷)–2018-2019第二学期期末试卷 国科大学习资料–计算机视觉(胡占义、董秋雷)–2018-2019第二学期期末试卷 ...

无名何许人的博客 2167

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

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

鑫和皓的博客 280

WindowsServer2022蓝牙音频开启方法

为Windowsserver 2022 添加蓝牙音频驱动的方法和工具

thebestismin的专栏 2705

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

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

feifeilb的博客 2377

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

2432

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

stupid的博客 2464

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

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

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

《敏捷软件开发──原则、模式与实践》阅读笔记 《敏捷软件开发──原则、模式与实践》阅读笔记 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、付费专栏及课程。

余额充值