面向对象初步总结
前言:
新技术层出不穷,让人有点应接不暇,岁月在一天一天老去,让人有点跟不上时代的感觉,如果让自己“宝刀未老”,很多人都想过这个问题,我们不可能学会所有的技术,也不可能像国外程序员做到四五十岁,国内有三十岁转行的说法。如何保持自己的核心竞争力呢?什么是核心竞争力呢?毋庸置疑,经验和思想。OO就是一种思想,研发思想是可以传承的,未来一段时间是主流的开发思想。所以学好OO还是有前途+钱途。
概况:
主要讲解以下知识
1.为什么要使用面向对象?(与面向过程比较)
2.面向对象特点?
3.面向对象分OOA 、OOD、OOP 各部分作用?(结合设计模式各自在研发过程的中的应用)
第一为什么要使用OO?
面向过程:把问题看做一系列需要完成的任务,按照一定顺序进行解决。实质:函数的逐步执行
缺点:
1.软件的重用性差:相同代码复制多次应用 vs OO中 代码重用(继承)、设计、分析模型的重用(思路的重用)
2.可维护性差:实践证明,用面向过程开发出的软件,维护时费用和成本很高,因其可修改性差,维护难度增加 vs OO代码可读性好,由于继承存在,即使需求有变,局部代码修改
3.满足用户需求性差 结构化开发软件,本质就是分解,自顶向下大系统分解小系统。结构化的功能基于“过程” 来构造系统,如果用户需求变化了,对设计来说是灾难性的,付出代价较大 vs OO 需求变化很正常,因为人的思想在变化,整个世界都在变化,OO 提供对需求不断的优化、重构、升级(常用工厂模式)。以对象为中心去处理问题。
除此之外:OO易于扩展,由于继承、封装、多态的特性,可以设计出高内聚、低耦合的系统,这样易于扩展、升级
第二 面向对象特点?
封装、继承、多态:重载和覆盖(详见:http://www.cnblogs.com/lei2007/archive/2013/06/14/3135351.html)
第三面向对象分OOA 、OOD、OOP 各部分作用?(结合设计模式各自在研发过程的中的应用)
OOA:提取用户需求的过程,这个过程关键识别对象、分析对象属性、明确各个对象之间关系、uml展示 forOOD
OOD:面向对象设计应遵循的原则:
1. 单一职责原则 SRP:一个类只能承担一个职责,身兼数职,造成高耦合。
2. 开放封闭原则OCP:“对扩展开放,对修改封闭”,即:“被调用者开放扩展,调用者封闭修改”, 实现开开放封闭原则的核心思想就是对抽象编程.对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对其进行任何尝试的修改。例如:Door对象是被其它对象例如人People调用,那么Door就是被调用者,People就是调用者。Door对象可以扩展为“防盗门”、“防火门”、“逃生门”等,但People在调用的时候不需要关注具体是什么门,只需要调用这些门公共的“开门、关门”等操作即可。
3.替换原则LSP: 其核心思想是:子类必须能够替换其基类。这一思想体现为对继承机制的约束规范,只有子类能够替换基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础。
4.依赖反转原则DIP:核心思想是:依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。基于接口编程,而不是基于实现编程
5.接口隔离原则ISP:核心思想是:使用多个小的专门的接口,而不要使用一个大的总接口. 具体而言,接口隔离原则体现在:接口应该是内聚的,应该避免“胖”接口。一个类对另外一个类的依赖应该建立在最小的接口上,不要强迫依赖不用的方法,这是一种接口污染。
总结:针对接口编程,而不是针对实现编程
(结合:http://blog.csdn.net/yunhua_lee/article/details/5105524)
OOP:面向对象编程是一种实现方法,每个对象代表某一个类的实例进行研发
结合设计模式:
如果仅仅使用工厂模式,在判断使用哪一个工厂的时候,仍然需要条件判断,一旦增加工厂类,又要改变客户端实例代码。为了解决这个问题,我们可以使用反射技术+条件外置(config配置项)做到客户端更加灵活。始终就是 抽象工厂模式。
抽象工厂模式:提供了一系列相关或相互依赖对象的接口,而不需要明确指定具体类(将抽象工厂类中的条件判断语句,用.NET中反射机制代替)
例如:肯德基和麦当劳都是工厂,都有一系列产品(汉堡,可乐,薯条)
总结
使用OO,必须站在一定高度,同时结合现实定义对象。高屋建瓴勾勒出软件架构全貌。从软件工程的角度来看,在设计时结合客户需求、具体业务,定义对象、属性、行为、哪些需要封装、哪些需要暴露接口。结合业务,否则设计变成空中楼阁。
ps:面向对象、面向接口、面向方面区别:
面向对象编程就是一堆对象,通过封装、继承、多态等更加有效的组织程序。(面向对象是对复杂问题的分解)
面向接口编程就是一堆接口,通过接口规约对象的属性和方法,是面向对象一部分。
tks:李天平老师的《亮剑.net》