抽象思维能力
软件设计是单纯的思维创造活动,其中最关键的是抽象思维。可以说,抽象是软件设计的核心,特别是在面向对象设计中,如果没有好的抽象概念,就不可能设计和编写出好的面向对象(Object Oriented, OO)程序。
抽象思维能力是一个人较为重要的思维能力,因为我们的大脑每时每刻都在进行一定的活动作业,那么活动的时候就是在调用思维能力,而抽象思维就是能够给你一个概念你能快速根据这个概念举例出具体事物。
抽象最为经典的理解就是毕加索的《牛》你可以搜索一下创作这幅画的过程,相信接下来的话就不用在看下去了。
抽象的分解意思=抽离+具象,只有抽出最为本质的特征离弃血肉之后就是抽离,具象就是根据抽离的概念(模型)迅速能够具体的想象出事物,
也许不是最开始的抽离的东西,但是你具象出来的东西一定是和原来的东西具有共同之处,否则你就抽象错了。
其实我们很早就再练习抽象思维了,比如语文课上的总结段落意思、数学课上的定理公式.....这些都是抽象思维的练习
那什么样的抽象思维是正确的呢?或者说抽象的是否良好呢?我们可以通过它的耦合性、内聚性、充分性和完整性4个指标来度量。
耦合性
强耦合使系统变得复杂,因为如果某个模块与其他模块过度相关,它就难以独立地被理解、变化或修正,通过降低耦合性,可以降低复杂性。在耦合和继承的概念之间存在着矛盾关系,继承引入了严重的耦合。一方面,我们希望类之间弱耦合;另一方面,继承又能帮助我们处理抽象之间的共性。我们通常说“组合优于继承”,正是因为继承的耦合性比较强。鉴于此,有些编程语言(比如Go语言)就直接取消了继承。
内聚性
内聚测量了单个模块(类、包、组件)内各个元素的联系程度。我们最不希望出现偶然性内聚,即完全无关的抽象被塞进同一个类或模块中。例如,考虑由狗和航天飞机的抽象组成的一个类。我们最希望出现功能性内聚,即一个类或模块的各元素一同工作,提供某种清晰界定的行为。如果Cow类的语义包含了一头牛的行为——完全是牛,只有牛而没有其他,那么它就是功能性内聚。
充分性
所谓充分,是指类或模块应该记录某个抽象设计足够多的特征,从而允许有意义的交互,否则将使组件变得无用。例如,如果我们设计Set(集合)类,应该包含从集合中添加、删除元素的操作,如果忘记设置这些操作,那么这个Set类的功能就是不充分的。好在只要我们构建一个必须使用这种抽象的客户,这种问题很早就会被发现。
完整性
完整是指类或模块的接口记录了某个抽象全部有意义的特征。充分性意味着最小的接口,但一个完整的接口意味着该接口包含了某个抽象的所有反向。完整性是一种主观判断,我们有可能做过头。为某个抽象提供全部有意义的操作会让用户不知所措,通常也是不必要的,因为许多高级操作可以由低级操作组合得到。例如,向集合里添加4个元素的操作就是不必要的接口,因为可以通过基础的Add操作得到同样的效果。
抽象是以概念(词语)来反映现实的过程,每一个概念都有一定的外延和内涵。概念的外延就是适合这个概念的一切对象的范围,而概念的内涵就是这个概念所反映的对象的本质属性的总和。例如“平行四边形”这个概念,它的外延包含着一切正方形、菱形、矩形及一般的平行四边形,而它的内涵包含着一切平行四边形所共有的“有四条边,两组对边互相平行”这两个本质属性。一个概念的内涵愈广,则其外延愈狭;反之,内涵愈狭,则其外延愈广。例如,“平行四边形”的内涵是“有四条边,两组对边互相平行”,而“菱形”的内涵除这两条本质属性外,还包含着“四边相等”这一本质属性。“菱形”的内涵比“平行四边形”的内涵广,而“菱形”的外延要比“平行四边形”的外延狭。内涵决定外延,但外延并不决定其内涵,比如“等边三角形”和“等角三角形”有相同的外延,但是却指向不同的内涵。外延和内涵也并非总是反向变化,事实并非如此,当内涵对其外延没有影响的时候,内涵的增加并不会导致外延的变小,比如“活着的人”“活着的不超过1000岁的人”。内涵虽然增加了,但其外延是一样的。[插图]抽象的层次性主要体现在概念的内涵和外延上,而这种层次性基本可以体现在任何事物上