文档章节

简述“面向对象”

涅槃Ls
 涅槃Ls
发布于 2017/04/08 18:13
字数 2102
阅读 74
收藏 0
点赞 0
评论 0

先简单的说一下什么是“程序”:

  • 面向过程时:程序 = 算法 + 数据结构;
  • 面向对象时:程序 = 基于对象操作的算法 + 以对象为最小单位的数据结构。

一、什么是对象?

    对象是 人们要进行研究的任何事物,从最简单的整数到复杂的飞船等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划、概念或事件。可以说“一切皆对象”。 

    人们还发现,一切对象都可以用「数据」和「能力」来描述。比如:

  • 描述一个人「数据」就是年龄、身高体重,「能力」就是他能做什么工作,承担什么样的责任。
  • 描述一台电视,「数据」就是它的屏幕尺寸、亮度,「能力」就是播放电影电视剧等。

二、什么是面向过程?

    面向过程很好理解,可以简单理解成软件开发工程师接到需求后,会把它拆成一个一个的命令,然后串起来交给计算机去执行。

举个例子,产品经理说要把大象装进冰箱里。程序员列了几个步骤:

  • 把冰箱门儿打开。
  • 把大象装进去。
  • 把冰箱门儿关上。

上面每一个步骤,程序员都会用一个「函数」来实现。所有函数定义好了之后,依次调用就可以了:

  • openTheDoor();
  • pushElephant();
  • closeTheDoor();

需求完成,顺利交工,但产品经理说才刚刚开始 XD。

  • 「我要把大象装微波炉里」
  • 「我要把狮子也装冰箱里」
  • 「我要把大象装冰箱,但是门别关,敞着就行」......

如果还是用面向过程的方法来应付,每次需求的变更,程序员就要把整个系统通读一遍,找出可用的函数(如果没有就再定义一个),最后依次调用它们。

虽然功能都能实现,对于计算机无论程序多么的复杂,计算机总是能轻松应付,但是对于越来越杂乱无章难以阅读 难以维护管理的系统,软件开发工程师会不堪重负,纷纷操起刀走上了犯罪的道路。

 

三、什么是面向对象?

    于是人们就想,能不能让计算机直接模拟现实的环境,用人类解决问题的思路、习惯、步骤来设计相应的应用程序?这样的程序,人们在读它的时候,会更容易理解,也不需要再把现实世界和程序世界之间来回做转换。

首先看一下面向对象的三大特性:

  • 封装:找到变化并且把它封装起来,你就可以在不影响其它部分的情况下修改或扩展被封装的变化部分,这是所有设计模式的基础,就是封装变化,因此封装的作用,就解决了程序的可扩展性。 
  • 继承:子类继承父类,可以继承父类的方法及属性,实现了多态以及代码的重用,因此也解决了系统的重用性和扩展性,但是继承破坏了封装,因为他是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破坏了系统的可扩展性,所以继承需要慎用。 
  • 多态:接口的多种不同的实现方式即为多态。接口是对行为的抽象,刚才在封装提到,找到变化部分并封装起来,但是封装起来后,怎么适应接下来的变化?这正是接口的作用,接口的主要目的是为不相关的类提供通用的处理服务,我们可以想象一下。比如鸟会飞,但是超人也会飞,通过飞这个接口,我们可以让鸟和超人,都实现这个接口,这就实现了系统的可维护性,可扩展性。 

面向对象是为了解决系统的可维护性,可扩展性,可重用性而应运而生的。

 

四、怎样实现面向对象?

    前面说过 对象可以用「数据」和「行为」来描述,相当于对象成了一个黑匣子,那我们怎么知道对象具有什么样的能力呢? 这个问题的关键就是接口。

    对象把它的能力通过接口的方式公布出来,自己则成为接口的实现者。

    这样调用者就不用关心接口背后的对象是什么东西,如何实现的了。

    我们还以上面“大象”的需求为例,产品经理现在说要把大象放洗衣机里,通过我们的分析,洗衣机也需要有「开门」、「关门」的能力。

    那么我们就可以抽象出一个接口来,它就是「开门」和「关门」的能力集合,假设我们称之为「大象の家」接口。

    我们的对象冰箱、微波炉、洗衣机都实现「大象の家」的接口,尽管实现方式不一样,但是在外界看来,它们都是一样的,都是可以盛放大象的容器。

这样我们编程的时候就可以这样写:

  • 向大象の家下达「开门」的命令。
  • 向大象下达「进冰箱」的命令。
  • 向大象の家下达「关门」的命令。

至于 大象の家 到底是个什么东西,我们可以不关心。即使哪天变成了马桶,「开门」和「关门」的具体实现交给负责马桶对象的同事,我们只管调用就可以了。

专业点讲,面向对象是一种思想:

  • 他让我们在分析和解决问题时,把思维和重点转向现实中的 客体 中来;
  • 然后通过UML工具理清这些客体之间的联系;
  • 最后用面向对象的语言实现这种 客体 以及 客体之间 的联系。

五、面向对象的三大步骤

1、面向对象的 分析(OOA)

    首先是分析需求,先不要思考怎么用程序实现它,先分析需求中稳定不变的客体都是些什么,这些客体之间的关系是什么。

2、面向对象的 设计(OOD)

    把第一步分析出来的需求,通过进一步扩充模型,变成可实现的、符合成本的、模块化的、低耦合高内聚的模型。

3、面向对象的 编程实现(OOP)

    使用面向对象的思想来实现模型 。

六、面向过程到面向对象思维如何转变? 

    通常情况下软件开发工程师在拿到一个需求的时候,第一个反应就是如何实现这个需求,这是典型的面向过程的思维过程,而且很快就可能实现了它。

    而面向对象,面对的却是客体,第一步不是考虑如何实现需求,而是进行需求分析,就是根据需求找到其中的客体,再找到这些客体之间的联系。

    因此面向过程和面向对象的思维转变的关键点,就是在第一步设计,拿到需求后,一定先不要考虑如何实现它,而是通过UML建模,然后按照UML模型去实现它。

 

 

小结:

    从 面向过程 到 面向对象 是一个日积月累过程。

    这就印证了三年前我入Java坑时,讲师在讲解“面向对象”时说【初学者可以先不要深层次的理解什么是”面向对象”,一两年后自己就会悟出来并且用的得心应手】。

    共勉!

 

多谢以下两位博主的资料:

什么是对象,为什么要面向对象,怎么才能面向对象?

五分钟理解什么是面向对象

 

© 著作权归作者所有

共有 人打赏支持
涅槃Ls

涅槃Ls

粉丝 6
博文 12
码字总数 41086
作品 0
深圳
QA/测试工程师
你想要的Python面试都在这里了【315+道题】

写在前面 近日恰逢学生临近毕业,课程后期大家“期待+苦逼”的时刻莫过于每天早上内容回顾和面试题问答部分【临近毕业每天课前用40-60分钟对之前内容回顾、提问和补充,专挑班里不爱说话就的...

p柯西
06/12
0
0
Python基础面试题80问 Python自动化开发

为什么学习Python? 2. 通过什么途径学习的Python? 3. Python和Java、PHP、C、C#、C++等其他语言的对比? 4. 简述解释型和编译型编程语言? 5. Python解释器种类以及特点? 6. 位和字节的关...

zhouzhou2018
05/24
0
0
如此理解面向对象编程

从Rob Pike 的 Google+上的一个推看到了一篇叫《Understanding Object Oriented Programming》的文章,我先把这篇文章简述一下,然后再说说老牌黑客Rob Pike的评论。 先看这篇教程是怎么来讲...

阿酷
2012/12/17
5.9K
29
JAVA 高级面试题

烧一根不均匀的绳要用一个小时,如何用它来判断半个小时? 两头同时烧 2. 4,4,10,10,加减乘除,怎么出24点? (10*10-4)/4 3. 如果你有无穷多的水,一个容积为3L的和5L的提桶,你如何准确...

HashTable
2016/07/25
147
0
媒体评选全球十所最适合应用开发者攻读学府

近日,BusinessInsider出炉了一份“全球十所最优秀的应用开发者学校”排行榜,为广大意欲寻求应用开发作为 养家手艺 人生理想的学子们提供了参考。 第十名:普林斯顿大学 简述:因工程与应用...

oschina
2013/03/06
5K
63
测试你的Python 水平----5

1、问:面向对象编程的基本特性有哪些? 答:抽象,封装,继承和隐藏。 2、问:请简述python垃圾回收机制? 答: (1)引用计数:python对于每一个对象都维护一个对指向该对象的引用的计数;当...

jastme
2015/09/16
42
0
Doxygen详细介绍(三)(Doxygen注释风格)

5 Doxygen的注释风格 5.1 综述 在每个代码项中都可以有两类描述, 这两类描述将在文档中格式化在一起: 一种就是brief描述, 另一种就是detailed。 两种都是可选的,但不能同时没有。 顾名思义,...

乐搏学院
2016/12/08
6
0
异常相关概念

[x] Error 和 Exception有什么区别 [x] 什么是受检查的异常,什么是运行时异常 运行时异常与一般异常有何异同 [ ] 什么是异常链 [x] throw 和 throws 有什么区别? [ ] 简述一个你最常见到的...

AmorFatiYJ
2017/12/22
0
0
架构设计目录

架构引用维基百科:软件体系结构是构建计算机软件实践的基础。与建筑师设定建筑项目的设计原则和目标,作为绘图员画图的基础一样,一个软件架构师或者系统架构师陈述软件构架以作为满足不同客...

zting科技
2017/01/10
0
0
PHPer面试指南-PHP 篇

本书的 GitHub 地址:https://github.com/todayqq/PHPerInterviewGuide PHP 篇收集了一些常见的基础、进阶面试题,基础的面试题不再作答。 基础篇 Get 和 POST 的区别 Cookie 和 Session 的区...

angkee
01/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

pbgo: 基于Protobuf的迷你RPC/REST框架

https://www.oschina.net/p/pbgo

chai2010
27分钟前
0
0
rsync工具介绍、常用选项以及通过ssh同步

linux下的文件同步工具 rsync rsync是非常实用的一个同步工具,可以从a机器到b机器传输一个文件,也可以备份数据,系统默认没有这个工具,要使用命令 yum install -y rsync 安装。 rsync的命...

黄昏残影
43分钟前
0
0
OSChina 周四乱弹 —— 表妹要嫁人 舅妈叮嘱……

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @哈哈哈哈哈嗝:一定要听——The Pancakes的单曲《咁咁咁》 《咁咁咁》- The Pancakes 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :...

小小编辑
今天
145
4
流利阅读笔记30-20180719待学习

重磅:让人类得老年痴呆的竟是它? Lala 2018-07-19 1.今日导读 去年奥斯卡最佳动画长片《寻梦环游记》里有一句经典台词:“比死亡更可怕的,是遗忘”。在电影中,年迈的曾祖母会重复说一样的...

aibinxiao
今天
3
0
1.16 Linux机器相互登录

Linux机器之间以密码方式互相登录 运行命令#ssh [ip address],标准命令:#ssh [username]@ip, 如果没有写用户名,则默认为系统当前登录的用户 命令#w查看系统负载,可查看到连接到该主机的...

小丑鱼00
今天
0
0
about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
2
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
1
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部