若想捉大鱼,就得潜入深渊。深渊里的鱼更有力,也更纯净。硕大而抽象,且非常美丽。——大卫·林奇
1.1 什么是抽象
“抽”是抽离,“象”是具象,抽象的过程就是从“具象”事物中归纳出共同特征,“抽取”得到一般化概念的过程。
1.2 抽象和语言是一体的
CodeReview 过程中命名的重要性:
命名的好坏,在很大程度上反映了我们对一个概念的思考是否清晰,我们的抽象是否合理,反应在代码上就是,代码的可读性、可理解性是不是良好,以及我们的设计是不是到位。
1.3 抽象的层次性
抽象的三个特点:
1.抽象是忽略细节的
2.抽象代表了共同性质
3.抽象具有层次性。抽象层次越高,内涵越小,外延越大
1.4 软件中分层抽象无处不在
越是复杂的问题越需要抽象,分层是分而治之,抽象是问题域的合理划分和概念寓意的表单。
1.5 复杂代码是抽象的缺失
复杂代码是典型的代码坏味道,其本质问题就是抽象的缺失。
领域模型训练
我们可以对自己工作中的问题域进行建模,当然也可以通过阅读一些优秀源码背后的模型设计来学习如何抽象、如何建模。比如,我们知道Spring的核心功能是Bean容器,那么在看Spring源码的时候,我们可以着重去看它是如何进行Bean管理的?它使用的核心抽象是什么?不难发现,Spring是使用了BeanDefinition、BeanFactory、BeanDefinitionRegistry、BeanDefinitionReader等核心抽象实现了Bean的定义、获取和创建。抓住了这些核心抽象,我们就抓住了Spring设计主脉。