敏捷开发中的设计原则

来源:互联网 发布:牛头702在淘宝上叫什么 编辑:程序博客网 时间:2024/05/01 05:20

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

在《敏捷软件开发:原则、模式和实践》一书中提出几种设计原则:

  • 单一职责原则(The Single Responsibility Principle,简称SRP)
  • 开放-封闭原则(The Open-Close Principle,简称OCP)
  • Liskov替换原则(The Liskov Substitution Principle,简称LSP)
  • 依赖倒置原则(The Dependency Inversion Principle,简称DIP)
  • 接口隔离原则(The Interface Segregation Principle,简称ISP)

我们使用这些原则来消除程序中的臭味,但是在没有臭味的时候还是不要随意的使用原则,否则容易导致不必要的复杂性。


单一职责原则(SRP)

就一个类而言,应该仅有一个引起它变化的原因。当然不光类需要单一职责,方法更要职能单一,这个在Uncle Bob的另一本书《Clean Code》中被反复的提到了。

开放-封闭原则(OCP)

这个原则要分为2部分来谈:1、对于扩展是开放的;2、对于更改是封闭的。

为了达成这样的要求,关键在于抽象。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,所以它对于更改可以是关闭的,同时通过这个抽象体的派生,也可以扩展此模块的行为。

OCP的主要核心是抽象和多态。也有人说OCP是面向对象设计的核心所在。要多加注意啥。

Liskov替换原则(LSP)

子类型必须可以替换它们的基类型。

这最早是由Barbara Liskov提出的,所以就叫做Liskov替换原则。

IS-A关系是面向对象的基本技术之一。如果一个新类型的对象被认为和一个已有类的对象之间满足IS-A关系,那么这个新对象的类应该是从这个已有对象的类派生,即继承。在OOD中,IS-A关系是就行为而言的,对象的行为才是软件真正所关注的问题。

依赖倒置原则(DIP)

1、高层模块不应该依赖于底层模块。二者都应该依赖于抽象。

2、抽象不应该依赖于细节。细节应该依赖于抽象。

这些不同于以前大家写程序的方式--细节确定后再抽象出接口或是抽象类来。这样抽象是依赖于细节的。这么做有可能导致抽象只是为这个细节服务的,以后再想通过该抽象增加其他细节,可能会出现各种各样的问题。

所以抽象不能依赖于细节,要倒置过来。首先确定好高层次的抽象,再依照它完成细节。这样所有的细节都有共同的标准,不像之前可能搞着搞着就出问题了。

DIP有助于构建良好的程序层次,高层次类都通过抽象使用下一层,这样高层就不依赖低层次,也就没有了直接的关联,层次就清晰了。

这样抽象是属于高层的。

当然了如果某个低层次的类是固定不变的,如String。我们也没啥需要通过一个接口调用。

如何找出抽象?我觉得应该通过系统的隐喻。

接口隔离原则(ISP)

不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。

如果类的接口不是内聚的,就表示该类具有“胖”的接口。类的“胖”接口可以分解成多组方法。每组方法都服务于一组不同的客户程序。我们可以分出多个接口,每个接口都服务于一个客户程序,而“胖”类实现了所有这些接口,那么不同的客户通过不同的接口访问这个“胖”类,这些接口是相互隔离的。这就是接口隔离原则的大体思路。

还有很多别的设计方法,待以后再慢慢加。

原创粉丝点击