面向对象编程的设计原则

用户头像
满山李子
关注
发布于: 2020 年 06 月 14 日

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

  • 不应该强迫客户程序依赖他们不需要的方法



用户头像

满山李子

关注

还未添加个人签名 2018.09.18 加入

还未添加个人简介

评论

发布
暂无评论
面向对象编程的设计原则