Wikipedia

抽象是指为了某种目的,对一个概念或一种现象包含的信息进行过滤,移除不相关的信息,只保留与某种最终目的相关的信息。例如,一个皮质的足球,我们可以过滤它的质料等信息,得到更一般性的概念,也就是球。从另外一个角度看,抽象就是简化事物,抓住事物本质的过程。

「抽」即抽离,「象」指具象,「抽象」的过程就是从具象事物中归纳出共同特征,抽取出一般化的概念的过程

抽象的英文 abstract,来自拉丁文 abstractio,它的原意是排除、抽出

抽象和语言是一体的

抽象思维,又称词(概念)的思维或者逻辑思维,是指用词(概念)进行判断、推理并得出结论的过程。当我们说「牛」的时候,说的就是「牛」的抽象,它代表了所有牛共有的特征,当你在程序中创建 Cow 这个类的时候,道理也是一样。在生活中,我们只见过一头一头具象的牛,「牛」作为抽象的存在,即看不见也摸不着

语言是明晰概念的基础,也是抽象思维的基础,在构建系统的时候,需要花时间去斟酌、推敲语言层面的东西,比如命名。好的命名意味着你能够在抽象层面把握系统, 而当你在命名时感到别扭或者难以找到合适的名称时,你可能需要重新梳理一下自己对系统的抽象是否正确合理

Creating good names is hard, but it should be hard, because a great name captures essential meaning in just one or two words. ---Joel Spolsky(Stack Overflow 创始人)

抽象具有层次性

抽象具有三个特点:

  1. 抽象是忽略细节的
  2. 抽象代表了共同性质
  3. 抽象具有层次性,抽象层次越高,内涵越小,外延越大,也就是说它的涵义越小,泛化能力越强

越抽象,越通用,可扩展性越强,然而其语义的表达能力越弱;越具体,越不好延展,然而其语义表达能力很强。所以,对于抽象层次的权衡,是我们系统设计的关键所在

重复代码是抽象的缺失

每当遇到重复的代码片段时,你应该打消复制粘贴的念头,强迫自己对代码进行抽象,并赋予一个合理优雅的命名(测试代码除外)

强制类型转换可能意味着抽象层次有问题

SOLID 原则中的「里氏替换原则」指代码中的父类应该可以直接替换成子类而不影响代码功能,这也意味着父类正确抽象了子类的行为。而如果需要用到强制类型转换将父类强行转换成子类,意味着「里氏替换原则」没有被满足,子类的行为超出了其父类所抽象的范围