了解软件的实现
模型、接口和实现
了解一个软件的设计可以从三个部分着手:模型、接口和实现。这三者的关系就好比你去看代码,你会先去看有哪些类以及它们之间的关系,这就是看模型;然后你会打开一个具体的类,看它提供了哪些方法,这就相当于看接口;最后,你再来打开一个具体的方法,去看它的代码是怎么写的,这就是看实现。
-
模型
一个软件的核心部分,也有称之为抽象。理解一个设计中的模型,可以帮助建立起对这个软件整体的认知。
知道了模型的重要性,目光甚至可以不局限在某一个软件上。如果把同一个领域不同阶段的多个模型联系起来看,还能看到软件发展的趋势。
理解模型,要知道项目提供了哪些模型,这些模型都提供了怎样的能力。但还有更重要的一步就是,要了解模型设计的来龙去脉。这样,一方面,可以增进了对它的了解,但另一方面,也会减少对模型的破坏或滥用。
如Spring,有效解决了对象的创建和组装过程,让程序员拥有了一个新的编程模型。
-
接口
它决定了软件通过怎样的方式,将模型提供的能力暴露出去。它是我们与这个软件交互的入口。
如果想深入源码,去了解一个软件,接口是一个很好的指向标。可以从一个接口进入到软件中,看它是怎样完成各种基本功能的。
看接口的一个方法是找主线,看风格。先找到一条功能主线,对项目建立起结构性的了解。有了主线之后,再沿着主线把相关接口梳理出来。
查看接口,关键要看接口的风格,也就是项目作者引导人们怎样使用接口。在一个项目里,统一接口风格也是很重要的一个方面,所以,熟悉现有的接口风格,保持统一也是非常重要的。
-
实现
就是指软件提供的模型和接口在内部是如何实现的,这是软件能力得以发挥的根基。
“实现”里面的内容很多。所以,做每一个技术决策都应该结合自己所开发应用的特点,并不存在一个通用的解决方案。
每个系统的实现都有非常多的细节,不可能一上来就把所有的细节吃透。如果想了解一个系统的实现,应该从软件结构和关键技术两个方面着手。无论是软件结构,还是关键技术,都需要带着自己的问题入手,而问题的出发点就是对模型和接口的理解。
了解软件的结构,其实,就是把分层的模型展开,看下一层的模型。一方面,你要知道这个层次给你提供了怎样的模型,另一方面,要带着自己的问题去了解这些模型为什么要这么设计。
在实际的工作中,许多人以为的设计其实是这里所讲的实现。“实现”很重要,但是,它必须建立在模型和接口的基础之上。因为在一个系统的设计中,模型是最核心的部分。如果模型变了,这个软件便不再是这个软件了,而接口通常反映的就是模型。所以,模型和接口的稳定度都要比实现高,实现则是要随着软件发展而不断调整。
举个例子,很多人都知道Redis这个键值对存储性能非常好,他们学习Redis时,对其单线程模型印象深刻,因为它简单高效。但随着人们使用Redis的增多,对Redis有了进一步的需求。所以,从6.0开始,它开始支持多线程版本,以便于更好地满足人们的需求。但即便Redis改成了多线程,它还是那个Redis,它的模型和接口还是一如既往,只是实现变了而已。
了解设计三步走
之所以要把模型、接口和实现区分开来,是因为这三者的关注点是不同的,而很多人在讨论所谓的“设计”时,经常会把它们混在一起。如果在讨论的时候连“讨论的内容到底是什么”都没弄清楚,就很难得出一个清晰的结果,就有一种很混乱的感觉,问题就在于他们把不同层面的内容混在了一起。
在讨论设计时应该遵循一个顺序,先模型,再接口,最后是实现,了解设计也应如此。
在了解设计时,要按层次去了解,因为设计常常是分层的。每当打开一个层次,需要了解它的内部时,还要按照模型、接口和实现的顺序解读这个层次。实际上,当能够一层一层地去理解设计,就像一棵知识树逐渐展开一样,每一个知识节点在展开的时候,都会有下面一级更具体的内容。当头脑中有了这样一棵设计树,也就掌握了整个系统的地图,再有新需求到来时,就不会再盲目地去改代码了。