设计模式 学习笔记 之一

第1章 导论

1.1 区分优良的设计与低劣的设计

高质量的设计具有若干共同的特点,我们把这些特点列在下面:

  • 最小复杂性(Minimal complexity)。设计的首要目标应该是使复杂性降到最小。避免做“自作聪明”的设计。“自作聪明”的设计往往难以理解,导致聪明反被聪明误。应该做“简单”而“易于理解”的设计。
  • 易扩展性(Extensibility)。易扩展性指无需修改底层结构就能改进系统。
  • 松散耦合(Loose coupling)。松散耦合指设计时应把软件的各个部分之间的联系降到最少。最小化的耦合使得集成、测试和维护的工作变得容易。
  • 层次性(Stratification)。层次性指系统分解应该层次化,这样你可以在任意一个层次上考察系统并得到一个一致的认知。
  • 可重用性(Reusability)。可重用性指所设计的系统的组成部分可以被重复使用。
  • 标准技术(Standard techniques)。系统使用业界标准的、通用的技术手段和解决方案。

相反,如果你察觉到你的软件出现了以下的症状,那么系统的设计就是存在问题的。

  • 不必要的复杂性(Needless complexity)。这是最小复杂性的反面。开发人员作出了“过度设计”或者使用了“自作聪明”但难以理解的设计。
  • 僵化性(Rigidity)。僵化性是易扩展性的反面,即软件难以改进。
  • 脆弱性(Fragility)。脆弱性是松散耦合的反面。对系统的某一处修改往往牵一发而动全身,引起其它各处的修改。
  • 不必要的重复(Needless repetition)。设计中包含有重复的结构,而该重复的结构本应该使用单一的抽象来进行统一。
  • 庞杂性(Monolithicism)。庞杂性是层次性的反面。系统没有分层的概念,就像一个杂凑在一起的庞然大物。

1.2 为什么会出现低劣的设计?

我们都已经熟悉了这样的一个过程:一开始,系统的设计很简单和清晰,也满足了用户的需求,可以良好运行。但是,需求总是在发生着变化。当需要发生变化,而原先的设计没有预计到这种变化,由此引发设计也要随之变化。在现实工作中,常常是由不是很熟悉原始设计理念的开发人员修改原先的设计,因此最后的结果是一个勉强可用但已经偏离了原始设计初衷的设计方案。这样,随着需求一点点地变化,对原始设计的偏离也越来越大,设计的品质一点点下降,慢慢出现了前一节中所提及的各种症状。

但是我们不能责备变化的需求导致了低劣的设计。我们都知道需求总是在不断变化的。如果我们的设计不能在变化的需求面前保持住优良的品质,那么只能责怪我们自己的设计和实践存在毛病。

1.3 应该怎么设计以应对变化的需求?

为了让设计能在需求发生变化的动态过程中也能保持高品质,我们应该采取下面的做法:

  • 使初始设计尽可能地简单和易于理解。在初始设计时,不要去预测变化,而是假设变化不会发生。在这样的思路指导下,我们才不会做“过度设计”,才不会给设计引入不必要的复杂性。通过应用面向对象的标准技术,如抽象、封装、信息隐藏和松散耦合,得到一个简单而易于理解的设计。简单而易于理解的设计就是为应对今后的需求变化做了最好的准备。
  • 当需求真地变化时,抓住这一机会改进我们初始的设计,保证当以后再次发生同种变化时我们的设计无需再被改进。怎样来改进设计呢?关键是应用“共性变性分析”(commonality and variability analysis)技术,也称为“抽象化”(abstraction)技术,即分析在需求变化的背后,不变的是什么。把这个不变的共性抽取出来,形成一个抽象接口,让客户代码不再依赖于原先的具体实现,而是依赖于这个抽象接口。原先的实现细节和由新的需求带来的实现细节则是这个抽象接口的两套不同的实现方式。可以想见,当同种变化今后再次发生时,设计无需再作改进,而只是多了一种对抽象接口的实现方式而已。这样,抽象接口就封装了变化,使我们的设计变得健壮。当然,在改进设计的过程中,我们仍要应用抽象、封装、信息隐藏和松散耦合等技术,最终又获得一个简单、易于理解但又已经包容变化的新设计。这个新设计的品质没有降低,并为迎接下一个需要变化做好了准备。

1.4 接下来要学习什么?

在1.1节中我们讲到了优良的设计具备的一般特点。那么怎样才能使我们做出的设计具备这些特点而成为优良的设计呢?

首先,我们需要一些高屋建瓴的指导,这就是设计原则。设计原则给我们指明了设计时的方向。在设计时始终以这些原则为准绳,总是尝试去遵循这些原则,我们的设计就会更容易成为优良的设计。我们将在第二部分中介绍设计原则。

其次,我们也需要一些具体的设计样板作为参考。这些设计样板都是前人的经验总结,是被反复证明的行之有效的高质量设计方案,被称为设计模式。通过学习设计模式及何时应用它们,我们就可以站在巨人的肩膀上,活用各种设计模式来创造出高水准的设计方案。我们将在第三部分中学习常用的设计模式。

posted @ 2011-04-05 08:01  李嘉 (Justin)  阅读(185)  评论(0编辑  收藏  举报