《面向对象葵花宝典》是网友爱技术的华仔的一个技术专栏里的文章,我在逐篇阅读之后,最大的感觉就是这个面向对象编程系列是货真价实的来自技术前线工程师的经验之作,是作者工作经验的总结和升华,对面向编程的方方面面有指导意义,在这里强烈推荐给面向对象领域的朋友们,原文链接如下:http://blog.csdn.net/column/details/oobaodian.html
以下是个人阅读之后,基于xMind做的读书笔记的整理,将我个人认为特别有价值或者说对我比较有感触的知识点,记录如下,以便随时翻阅。
面向对象概述
史前时代:面向机器
-
面向过程
面向过程是一种以“过程”作为中心的编程思想,其中过程的含义就是“完成一件事情的步骤”
面向过程其实是一种“机械的思想”,它就像流水线一样,一个阶段衔接一个阶段,每个阶段都有自己的输入、处理、输出,而在流水线上流动的就是我们的原料或者中间产品,每个阶段都有一个机械进行处理,最后的输出就是我们的产品
在运用面向过程的方法时,你也需要设计这样一条程序流水线:将程序划分为不同的阶段,设计好各个阶段如何衔接,然后定义好每个阶段需要处理的数据。
-
面向对象
与面向过程的方法相比,面向对象不再局限于计算机的机器本质,而更加侧重于对现实世界的模拟。
面向对象这种对现实世界的模拟的思想,其本质上就是“人的思想”,这是一个质的飞跃,意味着程序员可以按照人的思想来观察、分析、设计系统。
如果说面向过程像一条流水生产线,那么面向对象就像是一个足球队。没有哪个人能够在一场比赛开始的时候,就精确指定每个队员的每一次跑动,每一次出脚,每一次传球。。。 而只能指定队员的角色(前锋、中场、后卫、门将),然后由队员门自己根据情况做出反应。所以世界上有两个一样的生产线,但绝对不会存在两场一模一样的比赛。
面向过程中有“程序=算法+数据结构”的经典总结,面向对象也有类似的总结: “程序=对象 + 交互”。
面向过程有流水线的这个缺点,即:流程和原料相对固定,扩展比较麻烦。而面向对象正是为了解决面向过程的这个缺点儿诞生的,因此面向对象其实也不是什么复杂和玄妙的技术,面向对象思想的核心是“可扩展性”!
既然面向对象思想的核心是“可扩展性”,那么其适用范围就显而易见了:经常变化的地方就是面向对象应用的地方。
软件属性全图(成本,性能,可靠性,安全性,可维护性,可移植性,可伸缩性,可扩展性)
可以看到,“可扩展性”只是软件质量属性中很小的一部分,其它的属性都不是面向对象能够解决的。明白了面向对象的特点和适用范围,是应用面向对象的关键,经过前面的分析,我们知道,面向对象不是瑞士军刀,而只是一个普通的锤子而已,千万不要拿着锤子到处敲!
-
面向对象会导致性能降低?
- 从数据我们可以看出,如果你的业务流程中涉及了磁盘、网络、数据库等操作,那么性能就一下子降到了毫秒级。 因此,对于复杂的业务系统来说,性能的好坏是由设计来决定的,而不是由语言来决定的,更不会因为采用了面向对象而导致性能的降低!
面向对象理论
-
类
类就是一组相似事物的统称。
“如何定义类“? “只要有相似点的就是同一类“!
角度决定看法! 如何划分类:站在你的观察角度,具有相似点的事物就是同一类!
名词是属性,动词是方法。
设计属性的一个基本原则:属性最小化原则,即: “属性不可再分”!
设计方法的一个基本原则:方法单一化原则,即:一个方法只做一件事!
-
对象
类的实例。
现实对象-> 归纳概括-> 现实类-> 抽象模拟-> 软件类-> 实例化-> 软件对象-> 活动交互-> 程序
“软件类来源于现实类,但高于现实类”: 现实类在软件类中必须有对应,但并不是完全一 一对应的; 软件类并不一定是现实存在的
-
接口
“接口”是我见过的面向对象领域中滥用、乱用、误用最多的术语
接口是一组相关的交互功能点定义的集合。
-
抽象类
抽象类是一种特殊的类,其特殊性在于抽象类只能用于继承,不能被实例化
-
抽象类和接口有什么区别,为什么有了接口,还要有抽象类?
- 抽象类本质上还是类,强调一组事物的相似性,包括属性和方法的相似性;而接口只强调方法的相似性,并且仅仅体现在方法声明上的相似性,而没有方法定义上的相似性。(代码复用)
-
抽象
“抽取出来比较像的部分”
抽象的详细含义:抽取多个对象或者类中比较像的部分。
“属性类似”
“行为类似”
抽象的作用: 抽象最主要的作用是“划分类别”,而划分类别的主要目的其实还是“隔离关注点,降低复杂度”。因为这个世界太复杂了,复杂到一个人不可能同时关注所有的内容。心理学上的研究证实,人同时能关注的事务不超过 7+/-2 个。可以想象,如果没有抽象分类,我们将面对一个混沌的世界,同时关注如此多的内容,即使是天才,估计也要崩溃。
-
三大核心特征
-
封装
“保护隐私”
“隔离复杂度”
-
继承
继承类似生物学上的“遗传”,“龙生龙,凤生凤,老鼠生来会打洞”
面向对象的继承意味“子类”遗传了了某些“父类”的属性和方法。
抽象:是分析和设计过程中的一个动作,一个技巧,通过抽象得出类
继承:是实现过程中的一个动作,基于抽象结果,通过编程语言的特性,完成抽象图的模拟。
-
多态
“多胎”,多态的形态再多也只能局限在子类的个数,即“胎”数
多态的特性在面向对象编程的领域中具有十分重要的作用。多态屏蔽了子类对象的差异, 使得调用者可以写出通用性的代码,而无需针对每个子类都需要写不同的代码。
-