敏捷软件开发读书笔记(三)

敏捷设计

  如果敏捷性(Agility)是指以微小增量的方式构建软件,那么究竟如何去设计软件呢?又如何去确保软件具有灵活性、可维护性以及可重用性的良好结构呢?

在敏捷团队中,全局视图和软件一起演化。在每次迭代中,团队改进系统设计,使设计尽可能的适合当前系统。团队不会花费许多时间去预测未来的需求和需要,也不会试图在今天就构建一些基础结构去支撑那些他们认为明天才会需要的特性。他们更愿意关注当前的系统结构,并使它尽可能的好。

那么怎么才能保证全局视图和软件一起演化呢?在软件出现下面任何一种气味时,就表明软件正在腐化。敏捷团队的成员就会采取一些动作来阻止软件的腐化。下面列举的就是常见的设计的臭味——腐化软件的气味[1]

1. 僵化性(Rigidity):很难对系统进行改动,因为每个改动都会迫使许多对系统其他部分的其他改动。

2.脆弱性(Fragility):对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出现问题。

3.牢固性(Immobility):很难解开系统的纠结,使之成为一些可在其他系统中重用的组件。

4.粘滞性(Viscosity):做正确的事情比做错误的事情要困难。

5.不必要的复杂性(Needless Complexity):设计中包含有不具任何直接好处的基础结构。

6.不必要的重复(Needless Repetition):设计中包含有重复的结构,而该重复的结构本可以使用单一的抽象进行统一。

7.晦涩性(Opacity):很难阅读、理解。没有很好的表现出意图。

是什么激发了软件的腐化呢?在非敏捷环境中,由于需求没有按照初始设计预见的方式进行变化,从而导致了设计的退化。通常,改动都很急迫,并且进行改动的开发人员对于原始的设计思路并不熟悉。因而,虽然对设计的改动可以工作,但是它却以某种方式违反了原始的设计。随着改动的不断进行,这些违反渐渐地的积累,设计开始出现臭味。

然而,我们不能因为设计的退化而责怪需求的变化。作为软件开发人员,我们对于需求变化有非常好的了解。事实上,我们中的大多数人都认识到需求是项目中最不稳定的要素。如果我们的设计由于持续、大量的需求变化而失败,那就表明我们的设计和实践本身是有缺陷的。我们必须要设法找到一种方法,使得设计对于这种变化具有弹性,并且应用一些实践来防止设计腐化。

与传统的软件开发方法惧怕需求变化相反,敏捷团队依靠变化来获取活力。团队几乎不进行预先设计,因此,不需要一个成熟的初始设计。他们更愿意保持系统设计尽可能的干净、简单,并使用许多单元测试和验收测试作为支援。这保持了设计的灵活性、易于理解性。团队利用这种灵活性,持续的改进设计,以便于每次迭代结束所生成的系统都具有最适合于那次迭代中需求的设计。

上面的描述非常美好,读者不仅会问:敏捷开发人员如何知道要做什么的呢?

答案是:

(1)、他们遵循敏捷实践去发现问题;

(2)、他们应用设计原则去诊断问题;

(3)、他们应用适当的设计模式去解决问题。

软件开发的这三个方面的相互作用就是设计。

总结来说:敏捷设计是一个过程,不是一个事件。它是一个持续的应用原则、模式以及实践来改进软件的结构和可读性的过程。它致力于保持系统设计在任何时间都尽可能得简单、干净以及富有表现力[1]

设计原则

设计原则有助于开发人员消除设计中的臭味,并为当前的特性集构建出最好的设计。值得强调的是:这些设计原则是数十年软件工程经验来之不易的成果。它们不是某一个人的成果,而是许许多多软件开发人员和研究人员思想和著作的结晶。虽然在此把它们表述为面向对象设计的原则,但是事实上它们只是软件工程中一直存在的原则的特例而已。

这些原则如下:

1.单一职责原则(The Single Responsibility Principle,简称SRP):就一个类而言,应该仅有一个引起它变化的原因[1]。在SRP中,我们把职责定义为“变化的原因()”。如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责。软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。事实上,我们将要论述的其余原则都会以这样或那样的方式回到这个问题上。

2.开放封闭原则(The Open-Close Principle,简称OCP):软件实体(类、模块、函数等等)应该是可以扩展的,但是不可以修改的。遵循开放封闭原则设计出的模块具有两个主要的特征。它们是:(1)、对于扩展是开放的。这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。换句话说,我们可以改变模块的功能。(2)、对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。模块的二进制可执行版本,无论是可链接的库、DLL或者Java的.jar文件,都无需改动。

3.Liskov替换原则(The Liskov Substitution Principle,简称LSP):子类型必须能够替换掉它们的基类型。OCP原则是OOD中很多说法的核心。LSP是使OCP成为可能的主要原则之一。正式子类型的可替换性才使得使用基类类型的模块在无需修改的情况下就可以扩展。这种可替换性必须是开发人员可以隐式依赖的东西。

4.依赖倒置原则(The Dependency Inversion Principle,简称DIP):(1)、高层模块不应该依赖于底层模块。二者都应该依赖于抽象。(2)、抽象不应该依赖于细节。细节应该依赖于抽象。使用传统的过程化设计所创建出来的依赖关系结构,策略是依赖于细节的。面向对象的程序设计倒置了依赖关系结构,使得细节和策略都依赖于抽象,并且常常是客户拥有服务接口。事实上,这种依赖关系正式好的面向对象设计的标志所在。

5.接口隔离原则(The Interface Segregation Interface,简称ISP):不应该强迫客户依赖它们不用的方法[3]。如果强迫客户程序依赖于那些它们不适用的方法,那么这些客户程序就面临着由于这些未使用方法的改变所带来的变更。这就无意中导致了所有客户程序之间的耦合。我们希望尽可能地避免这种耦合,因此我们希望分离接口。

 总结

  敏捷软件开发方法正是认识到软件开发的这一本质特征而提出的革新性开发方法。使用敏捷开发方法会给我们带来巨大的好处。当然要完全做到也是很困难的。这不仅需要对敏捷的深刻理解,更需要敏捷团队成员的共同努力。

时间: 2024-08-29 16:50:41

敏捷软件开发读书笔记(三)的相关文章

《敏捷软件开发读书笔记之一》

要想成为一名优秀的软件开发者,需要熟练应用编程语言和开发工具,更重要的是能够领悟代美代码背后的原则和前人总结的经验——这正是本书的主题.本书凝聚了世界级软件开发大师RobertCMartin数十年软件开发和培训经验,不仅是一部深入浅出.生动易懂的面向对象原则与模式著作,而且还是一部通俗的敏捷方法导引书和快速实用UML教程.分为敏捷开发,敏捷设计,薪水支付案例研究,打包薪水支付系统,气象站案例研究和ETS案例研究六个部分,包含30个章节.以下是我对前两个部分的认识及见解: 以下六章是对第一部分敏捷

《敏捷软件开发读书笔记之三》

以下是我从最后两个部分:气象站案例研究和ETS案例研究中得到的一些收获,以及个人的一些认知及见解: “OBSERVER模式”又称为回归为模式,其最大的推动力来自开放封闭原则.使用这个模式的动机就是为了在增加新的观察对象时可以无需更改被观察的对象.这样,被观察对象就可以保持封闭.Observer是一个抽象类,具体的DigitalClock依赖于它,Subject的具体方法也依赖于它.因此,依赖倒置原则也运用于其中,Subject 不具有抽象方法,故它与Clock间的依赖关系可能违反了DIP.但是,

《敏捷软件开发读书笔记之二》

接下来,我将向大家介绍第三部分“薪水支付案例研究”和第四部分“打包薪水支付系统”这两部分的认识,以及从中得到的收获: 以下是我从第三部分“薪水支付案例研究”中学到的相关知识以及个人的一些总结: Command模式的简单性掩盖了它的多功能性,此模式可以应用于多种能够不同的美妙用途,范围涉及数据库事物操作,设备控制,多线程核心以及GUI的Do/Undo管理,此模式是在实际的软件开发中是非常有用的. TEMPLATE METHOD模式和STRATEGY模式都可以用来分离高层的算法和低层的具体 实现细节

敏捷软件开发读书笔记(一)

第一部分 敏捷开发 2001年初,由于看到许多公司的软件团队陷入了不断增长的过程的泥潭,一批业界专家聚集在一起概括出了一些可以软件开发团队具有快速工作.响应变化能力的价值观(value)原则.他们称自己为敏捷(Agile)联盟.在随后的几个月中,他们创建出了一份价值观声明.也就是敏捷联盟宣言(The Manifesto of the Agile Alliance). 敏捷联盟宣言如下: 1.个体和交互胜过过程和工具. 人是获得成功的最为重要的因素.如果团队中没有优秀的成员,那么就是使用好的过程也

敏捷软件开发:原则、模式与实践(笔记)

一.敏捷软件开发宣言 1.个体和交互 > 过程与工具 a)人是获得成功最为重要的因素: b)合作.沟通以及交互能力要比单纯的编程能力更为重要: c)团队的构建要比环境的构建重要. 2.可以工作的软件 > 面面俱到的文档 a)文档应该短小并突出主题: b)在给新的团队成员传授知识方面,最好的两份文档是代码和团队: c)直到迫切需要并且意义重大时,才来编制文档. 3.客户合作 > 合同谈判 a)成功的项目需要有序.频繁的客户反馈. 4.响应变化 > 遵循计划 a)构建计划时,应该确保计

2017.07.07 IT项目管理笔记整理 第10章 敏捷软件开发

什么是敏捷软件开发方法 1.敏捷方法是一类软件开发流程的泛称: 2.敏捷方法是相对于传统的瀑布式软件过程提出的: 3.敏捷方法可以用敏捷宣言(4条).敏捷原则(12条)来概括: 4.敏捷原则通过一系列的敏捷实践来体现出来: 敏捷开发软件的特点:1敏捷软件开发更强调程序员与业务专家.用户之间的紧密合作,面对面的沟通,认为这种方式更有效 2能够很好地根据需求的变化编写代码 3频繁交付新的软件版本 4采用紧凑和自组织的软件开发团队 5更注重个体在软件开发中的作用 敏捷软件开发的方法有:1极限编程 2.

敏捷软件开发原则

敏捷软件开发原则 ----<敏捷软件开发原则.模式与实践>学习笔记 最近在系统地学习并且有意地在工作中实践敏捷软件开发,文章乍看起来,都是一些说教性.理论性,比较无聊的东西. 但是如果静下心来结合自己自身的经历.思考地去阅读,可能会发现,有的观点确实很赞同,然而有的可能会有自己的想法. 以下是在<敏捷软件开发 原则.模式与实践>一些读书笔记,斜体字是直接摘录于书本,非斜体字是自己的一些理解.   一.尽早的,持续地交互有价值的软件来使客户满意.初期交付的系统功能越少,最终交付的系统

《大型网站技术架构》读书笔记三:大型网站核心架构要素

一.性能—响应时间决定用户 (1)浏览器端: ①浏览器缓存: ②使用页面压缩: PS:Gzip压缩效率非常高,通常可以达到70%的压缩率,也就是说,如果你的网页有30K,压缩之后就变成了9K左右.想要启用Gzip压缩,提高浏览速度,可以浏览这篇文章:http://www.chinaz.com/web/2012/1017/278682.shtml ③合理布局页面: CSS:把样式表置于顶部:避免使用CSS表达式(expression_r):使用外部JavaScript和CSS:削减JavaScri

敏捷软件开发简述

前言:由于我读了邹欣老师的<构建之法:现代软件工程(第二版)>,因此对敏捷软件开发有了比较大的兴趣.于是我在网上找了一些论文,比如Requirements Engineering and Agile Software Development.A decade of agile methodologies: Towards explaining agile software development.在读了这些论文之后,对敏捷软件开发有了大致的了解.这篇博文主要是简单介绍敏捷软件开发,重点集中在主