面向对象编程的设计原则
1. 面向对象编程
1.1 编程的本质
编程的目的: 用计算机解决现实世界的问题
编程的过程:在计算机所能理解的“模型”(解空间) 与 现实世界(问题空间) 之间建立一种联系。
模型是领域问题分析与抽象,也就是说模型是用于解决现实世界的领域问题的
模型是软件系统设计与抽象,也就是说模型要能被计算机所理解,具有可行性;对已有软件系统逆向设计也可以获得模型。
对模型进行开发和实现的结果就是软件系统。
软件系统是用来解决领域问题,模型是软件系统与领域问题之间的桥梁
1.2 什么是面向对象编程
第一个成功的面向对象语言 Smalltalk 描述:
万物皆为对象, 对象包含数据和对自身的操作, 理论上讲,可从要解决的问题身上提出所有概念性的组件,然后在程序中将其表达为一个对象
程序是对象的集合, 他们相互发送消息,告知彼此要做什么。可以把消息理解为一个调用请求, 它调用的是目标对象的一个函数。
每个对象都有自己的存储空间, 可以容纳其他对象。通过封装现有对象,可产生新型对象。所以,尽管对象的概念非常简单,但在程序中却可达到任意高的复杂程度。
每个对象都有一种类型。根据语法,每个对象都是某个“类”的一个“实例”。其中,“类”(Class)是“类型”(Type)的同义词。一个类最重要的特征就是“能将什么消息发给它?”。
同一类所有对象都能接收相同的消息(里氏替换原则)。
C++ 和 Java 等后期的面向对象的编程语言, 都是在这个定义的基础上设计的。
1.3 对象
对象具有属性, 行为和标识
属性: 每个对象可以有自己的数据
行为: 每个对象可以产生行为(方法)
标识: 每个对象都有唯一的地址, 以区别于其他的对象
1.4 面向对象的三要素
封装: 定义接口, 隐藏实现细节(访问控制)
继承: 是is-a关系, 是实现代码复用的一种方式, 也是多态的前提
多态: 后期绑定, 向上转型, 可让程序更加灵活, 扩展性更好; 是使用面向对象语言编程的核心.
1.5 面向对象编程
面向对象编程不是使用面向的编程语言写代码, 而是利用多态特性编程
1.6 面向对象设计的目的
强内聚, 低耦合, 从而使系统
易扩展 - 添加新功能更加容易
更健壮 - 不容易被粗心的程序员破坏
可移植 - 能够在多样的环境下运行; 比如可以本地运行, 也可以远程运行
易维护 - 容易理解, 容易维护
2. 面向对象设计的基本原则
面向对象的设计原则, 是为了达到设计目标, 总结出来的指导原则
框架是用来实现某一类应用的结构性的程序, 是对某类架构法案可复用的设计与实现
框架与工具区别: 框架调用开发人员的代码, 而工具是被开发人员调用的.
1.1 软件设计的 "臭味"
软件设计的目的, 是让软件达到 "强内聚, 松耦合", 从而使软件
易扩展 - 添加新功能更加容易
更健壮 - 不容易被粗心的程序员破坏
可移植 - 能够在多样的环境下运行; 比如可以本地运行, 也可以远程运行
易维护 - 容易理解, 容易维护
与之相反, 一个不好的软件, 就会发出如下的 "臭味":
僵硬 : 不易改变; 不容易对系统进行改动, 因为每个改动会迫使其他部分的改动
脆弱: 只想修改A, 结果B被意外破坏.
不可移植 - 不能适应环境的变化
导致误用的陷阱 - 做错误的事比做正确的事更容易, 程序员容易破坏原有的设计
晦涩 - 代码难以理解
过度设计, 复制-粘贴代码
1.2 开闭原则(OCP)
OCP - Open/Closed Principle
多扩展开发
对修改关闭
简而言之, 不需要修改软件软件实体(类, 模块, 函数等), 就能实现功能的扩展; 做到这点的关键是 抽象 和 多态.
1.3 依赖倒置原则
DIP - Dependency Inversion Principe
高层模块不能依赖底层模块: 调用链中前面的属于高层, 反之属于底层.
抽象不能依赖实现, 而是实现依赖抽象
DIP 倒置了什么?
模块的依赖关系
开发顺序和职责
软件的层次
高层决定底层
高层被复用
1.4 Liskov替换原则(LSP)
子类型(subtype)必须能够替换他们的基类性(base type); 换句话说: 能使用父类的地方一定可以使用子类
1.5 单一职责原则(SRP)
SRP - Single Responsibility Principe
一个模块的组成元素之间的功能相关性
一个类, 只能有一个引起它的变化的原因
1.6 接口分离原则
ISP - Interface Segregation Principe
不应该强迫客户程序依赖他们不需要的方法
评论