设计模式
在我们深入 Scala 设计模式之前,需要解释一下它们实际的含义、存在的意义,以及为什么值得去精通它们。
软件是一个宽泛的主题,人们可以用它们来做数不尽的事。乍一看,所做的这些事的是完全不同的—游戏、网站、移动手机应用或用于不同产业的特殊系统。然而软件的构建构过程却有很多相似性。无论需要创建的软件为哪种类型,通常人们都需要解决相似的问题。比如,网站和游戏都需要访问数据库。同时贯穿整个时间,开发者们通过经验来学习如何为不同的任务来组织他们的代码。
设计模式的一个正式定义能够让你理解其在构件优雅高效关键中的实际价值。
The formal definition for design patterns
一个设计模式是一个用于解决反复出现的问题的可复用解决方案。它并非一段已完成的代码片段,而是作为一个模板,用于帮助解决一些特殊问题或一些列问题。
设计模式是软件开发社区通过很长的时间总结出的最佳实践。它们被认为能够帮助编写高效、可读、易测试、易扩展的代码。在某些情况下,它们可能是某些表达不够优雅的编程语言(比如 Java..)的目标实现的结果。这意味着大多特性丰富的语言可能甚至都不需要一个设计模式。Scala 就属于这种富特性语言,有些情况下,它会让一些设计模式的应用显得过时或者更加简洁。我们将会在本书中看到它是如何做到这一点的。
一个编程语言中的功能缺陷或优势同样决定了其是否能够实现相比其他语言更多的设计模式。
Scala 和设计模式
Scala 是一个混合型语言,它同时结合了面向对象和函数式编程。这不仅让他能够拥有一些经典的面向对象设计模式,同时提供了多种不同的方式来利用其特性以编写高效、可读、易测试、易扩展的代码。这种混合的性质可以使用更加清晰的技术让一些经典的设计模式变得过时,或者让不能成为可能。
设计模式的需要及其收益
每个人都需要设计模式并在编写代码之前需要深入了解他们。像我们之前提到的,它们能够帮助编写高效、可读、易测试、易扩展的代码。所有这些特性对于行业中的公司来说都是非常重要的。
尽管有些情况下更需要的是快速编写一个原型并落地,然而更常见的情况是软件的一部分代码需要不断的演变。可能你已经拥有一些对已存在的烂代码扩展经验,但无论如何,这是一项挑战并且会花费很长时间,甚至有时会感觉重写会相对简单。此外,这也可能会给系统引入新的 Bug。
代码可读性有些时候也是需要引起重视的。当然,尽管有些人使用了设计模式但仍然会让他的代码难以理解,但通常来说设计模式会带来一些帮助。大型系统通常是由很多人协同开发,每个人也必须知道到底发生了什么。同时,新加入到团队中的人员也能更简单快速的融入进来,如果他们是基于程序中写的很好的部分工作的话。
可测试性有助于在编写或扩展代码时避免开发者引入 Bug。有些情况下,代码可能会很糟或甚至没法测试。设计模式一般也能很好的解决这些问题。
虽然效率通常与算法相关,设计模式同样也能对其造成影响。比如一个对象,需要很长时间才能完成初始化,并且其实例会被应用的各个部分使用,但这是可以使用单例来代替的。你可以在本书的后续章节中看到更多正确的实例。