关于面向对象的真面目

关于面向对象的真面目

面向对象是软件开发的综合技术

我们先从一个简单的问题开始介绍。

“为什么要基于面向对象来开发软件?”

不管谁问这样的问题,笔者都会这样回答:

“为了轻松地开发软件。”

可能有的人听到“轻松”二字会感觉很意外。这是因为当提到面向对象时,不少人仍感觉“很难,难以对付”。

面向对象包含了各种技术,几乎涵盖了从 Java、Ruby 等编程语言到需求规格书和设计内容的图形表示、可重用的软件构件群、优秀设计的技术窍门、业务分析和需求定义的有效推进方法、顺利推进系统开发的开发方法等软件开发的所有领域。

不过,这些技术单独来看是完全不同的。如果要找出它们的共同点,大概就是它们都是软件开发相关的技术,都是用来顺利推进软件开发的。

因此,如果用一句话来概括面向对象,那就是“能够轻松地进行较难的软件开发的综合技术”。

以对象为中心编写软件的开发方法

面向对象的英文是 Object Oriented,直译为“以对象为中心”。

在面向对象普及之前,主流的开发方法是“面向功能”的,具体地说,就是把握目标系统整体的功能,将其按阶段进行细化,分解为更小的部分。如果采用面向功能的开发方法来编写软件,当规格发生改变或者增加功能时,修改范围就会变得很广,软件也很难重用。

面向对象技术的目的是使软件的维护和重用变得更容易,其基本思想是重点关注各个构件,提高构件的独立性,将构件组合起来,实现系统整体的功能。通过提高构件的独立性,当发生修改时,能够使影响范围最小,在其他系统中也可以重用。

从编程语言演化为综合技术

面向对象最初是以编程语言的身份出现的,经过不断发展,逐渐被应用到了开发的各个领域。这里我们来简单回顾一下面向对象的全貌和发展过程。

面向对象的全貌和发展过程

在这里插入图片描述

面向对象起源于 1967 年在挪威设计的 Simula 67 编程语言。该语言拥有类、多态和继承等以往的编程语言中没有的优良结构,被称为最早的面向对象编程语言(Object Oriented Programming language,OOP 1)。后来,艾伦·凯率领的团队开发的 Smalltalk 沿用了该结构,确立了“面向对象”的概念。此后,具有相同结构的 C++、Objective-C、Java、C# 和 Ruby 等诸多编程语言相继被开发出来,并延续至今。

严格来说,正确的表达方式是,将面向对象编程语言(Object Oriented Programming Language)称为 OOPL,使用 OOPL 进行编程的操作称为面向对象编程(OOP)。

OOP 使得大规模软件的可重用构件群的创建成为可能,这些被称为类库或者框架。另外,创建可重用构件群时使用的固定的设计思想被提炼为设计模式。

另外,使用图形来表示利用 OOP 结构创建的软件结构的方法称为统一建模语言(Unified Modeling Language,UML)。在此基础上,还出现了将 OOP 思想应用于上流工程的建模,以及用于顺利推进系统开发的开发流程。

如今,面向对象已经成为一门覆盖软件开发整体的综合技术。虽然这些技术所涉及的领域和内容并不相同,但目的都是顺利推进软件开发。因此,通过以各种形式灵活运用前人的研究和技术窍门,有助于我们提高软件的质量和开发效率。

在混乱的状态下去理解,就会觉得很难

尽管面向对象是众多优秀技术的集大成,却经常被认为很难理解,难以对付。也有人认为不擅长抽象思考的人在学习面向对象时会感觉很难,要经过很多年才能掌握,等等。不管是多么方便的工具,如果很难理解其内涵,无法熟练使用,那就没有办法了。

不过,笔者认为,相较于技术本身的复杂性,面向对象让人感觉很难的更主要的原因在于混乱的现状。造成混乱的主要原因大致有三点:术语洪流、比喻滥用和“一切都是对象”综合征。下面我们就来分别介绍一下。

混乱之一:术语洪流

第一点是术语洪流。

想必很多人在最开始接触面向对象时都是被灌输大量陌生的术语吧。下面列举了一些具有代表性的术语,但其实人们被灌输的术语远不止这些。

继承、泛化、特化、超类、子类、接口、多重继承、属性、关联、集合、委托、重写、重载、访问控制、构造函数、包、异常、垃圾回收机制、框架、类库、组件、设计模式、用例、建模、UML、重构、敏捷开发流程、RUP、XP……

对大量术语感到混乱的开发者

在这里插入图片描述

简直就是术语大集合!在深入了解技术内容之前就被这么多术语吓退的人应该不在少数吧。

存在如此大量的术语的原因如下所示。

首先是面向对象所涉及的范围很广。如今面向对象几乎涵盖了软件开发的所有领域,在这些领域中,之前没有的新结构和新思想层出不穷。这些术语中也有不少英文词汇,可以说这是以欧美为中心迅速发展起来的技术的宿命。此外,还有一些词语被作为业界的宣传用语而被过度解释。像这样,术语多少本身源自该技术的广度,从一定意义上来说也是没有办法的事情。

而更本质的问题是基本术语的定义混乱,我们将在随后的第三点中对此进行讨论。

混乱之二:比喻滥用

第二点是比喻滥用。

这与其说是技术本身的问题,倒不如说是说明方法的问题。一般来说,比喻并不一定就是不好的。使用恰当的比喻能够直截了当、形象地说明内容;反之,如果比喻不恰当或者使用过度,就有可能造成混乱。尤其是在仅通过比喻来说明编程语言等的具体结构的情况下,由于每个人的理解各不相同,所以特别容易造成误解。

我们来举例说明一下。面向对象的基本结构有时会像下面这样说明。

对使用比喻进行的说明感到混乱的开发者

在这里插入图片描述

“动物是超类,哺乳类和鱼类是子类。既产卵又用乳汁哺乳幼仔

的鸭嘴兽也就相当于爬虫类和哺乳类的多重继承。”“人具有‘出生年月日’的属性。如果给小王这样具体的一个人发

出‘请告诉我你的年龄’的消息,就会得到‘28 岁’的回答。”

“正如医院里的医生、护士和药剂师互相联系、协同工作一样,对象也是通过在计算机中互相发送消息来进行工作的。”

从直观理解 OOP 的结构来说,这样的讲解也不一定就是不好的做法。不过,如果只强调比喻而不详细介绍编程语言的结构和目的,那么就只有比喻能给人留下深刻的印象,而且听众很有可能会根据自己的理解,对实际的结构产生错误的认识。特别是在不考虑系统化范围,即计算机的作业范围的情况下乱用比喻,再加上随后介绍的“一切都是对象”综合征的影响,读者就有可能会产生“当使用面向对象时,可以直接将现实世界表示为程序”的重大误解。

混乱之三:“一切都是对象”综合征

第三点是“一切都是对象”综合征。

面向对象的含义是“以对象为中心”。如果按照字面意思进行解释,那么现实世界的人、组织、事件、计算机系统的功能、系统管理的信息和程序的构成元素等一切事物都可以说是对象。这里,我们将这种极端的抽象称为“一切都是对象”综合征。

“一切都是对象”综合征

在这里插入图片描述

这种极端看法大概源自“万物都是变化的”这一点。立足于这种观点是很难说明和理解编程语言的结构,以及现实世界中业务流程的整理方法等具体技术的。尽管如此,但就像“正如现实世界是由对象(物)组成的,在面向对象中,程序也是以对象为中心创建的”这句话所说的那样,我们经常会见到实际上不同的对象都被解释为“对象”这一个词语的情况。这样的解释的确会对直观理解面向对象的结构有所帮助,但反过来也有可能引起“只要使用面向对象,就可以直接将现实世界表示为程序”的误解。

不过,这种混乱并不只是说明方法的问题,也是面向对象本身的问题。这是因为面向对象的技术范围很广,比如对象和类等词语有时指编程语言的结构,但在其他情况下也指管理的信息、现实世界的人和物。

“一切都是对象”综合征才是造成面向对象混乱的最大原因)。

三种混乱增大了理解的难度

在很多情况下,以上为大家介绍的三点引发混乱的原因,即术语洪流、比喻滥用和“一切都是对象”综合征会同时出现。也就是说,在讲解面向对象时,讲解的人往往会一下子介绍很多陌生的术语,并以比喻为中心,只强调现实世界和程序结构的共同之处。然而,这样的讲解非但不能让人正确地理解该技术,反而会容易引起混乱和误解。

由于面向对象以范围很广、难度较大的软件开发为对象,所以在技术层面上原本就非常复杂,而以上几点混乱又进一步增大了理解该技术的难度,使其本质难以被看透。

因为不理解,所以才感觉神秘

不理解的事情有时会为我们带来意外的惊喜。

如果某项技术只是比较难,让人无法理解,那么放弃学习也没什么,而面向对象所涉及的编程语言、UML 以及大规模的可重用构件等技术都很基础,而且这些技术正在不断地渗透到软件开发的实际应用场景,所以现阶段很难完全避开面向对象。

“虽然将现实世界直接表示为程序这种解释我怎么都想不通,但是由于 Java 和 UML 使用起来比较方便,所以我正在使用。”“虽然其中的个别技术非常有用,但是整体上却很难理解。”……想必抱有这些想法的人不在少数吧。

面向对象有时会被比作魔法,虽然无法用道理解释清楚,但效果很好,或者被解释为一般人难以触及的理想的开发方法。这是将“不理解但有用的事物”神秘化,并推崇为“超越人类智慧的存在”的心理在起作用。

不过,面向对象的目的是驱动逻辑电路组成的计算机,是具有实践性的一门极为有用的技术,因此完全不存在无法解释的内容。

消除这三种混乱,就能看到面向对象的真面目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/57703.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

李彦宏简介

李彦宏简介 李彦宏,1991年毕业于北京大学信息管理专业,随后赴美国布法罗纽约州立大学完成计算机科学硕士学位。在美国的8年间,李彦宏先生先后担任了道琼斯公司高级顾问,《华尔街日报》网络版实时金融信息系统设计者,以…

李彦宏回应百度落后:我们擅长技术含量高的

2019年人工智能系统学: https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw BAT中,谁是老大不好说,但是论争议性,百度确实相对较多。 一方面,“百度搜索引擎已死”的说法愈演愈烈; 另一方面&#xff0c…

李彦宏们牛在哪里?中国十大CEO简历

NO.1 李彦宏 百度公司总裁 简历: 李彦宏,1991年毕业于北京大学信息管理专业,随后赴美国布法罗纽约州立大学完成计算机科学硕士学位。在美国的8年间,李彦宏先生先后担任了道?琼斯公司高级顾问,《华尔街日报》…

李彦宏如何拯救百度?

作者 | 何加盐 本文经授权转载自何加盐(ID:ihejiayan) 他智商超群,曾经是高考状元,北大才子,留美精英。 他阳光帅气,被誉为中国互联网企业家里面,最好看的美男子。 但他也身负无数骂…

致李彦宏的公开信:百度真的乏善可陈

致李彦宏的公开信:百度真的乏善可陈 曹政 | 企业信息化 | 出处:原创-IT| 2012年06月04日 10:40 | 阅读 576 次 文/DoNews专栏作家 曹政 拜读了网上关于李彦宏在百度联盟峰会的演讲实录,对其中若干观点实在不敢苟同,如鲠在喉。特发…

又是别人家的公司!李彦宏给创新员工发超 2000 万奖金……

2022年9月7日,2022百度秋日嘉年华暨百度最高奖颁奖典礼,在百度科技园顺利成功举行。百度创始人、董事长兼首席执行官李彦宏,为“大道”、“潮汐”、“拨云”三支团队分别颁发最高奖,奖金折合人民币超2000万元。 (截图自…

人物-李彦宏:李彦宏

ylbtech-人物-李彦宏:李彦宏 百度 创始人、董事长兼首席执行官 李彦宏,男,汉族, 无党派人士,1968年11月出生, 山西阳泉人,百度创始人、董事长兼首席执行官,全面负责百度的 战略规划和…

图表控件TeeChart干货分享(绘制2D、3D实时曲线---VC++示例源代码--网络首发)

最近接手了一个项目,其中涉及到MFC和实时曲线显示的问题,由于我之前从未接触过此类技术,现学现搞,把其间用到的觉得对初学者有用的东西,总结一下。 尤其是关于TeeChart控件部分,网上资料零碎,且…

winform上的统计图——新手向

今天看见一篇适合新手理解和使用WinForm Chart控件的文章 目录 图标的要素 一、图表实现 图表标题 图例 XY坐标轴 数据 二、代码实现 转载 图标的要素 这是一张普通的柱状统计图,包括了: 图表标题图例XY轴标题数据 一般在上位机中有这些要素…

老鼠屎地理信息可视化第三弹:Plotly+Pyecharts绘制地理坐标系线图

由于最近老鼠屎做的东西和地图上的线型图相关,因此在这里做一点简单总结。很多地方都调试得很不理想,希望成功的地方可以给大家带来一点点启发,不理想的地方也欢迎大神们赐教。 1 Plotly 1.1 地图上绘制线 有关pyplot的相关在老鼠屎的博文使…

Echarts 地理信息可视化:基于地图显示坐标点信息

Ecahrts 基于地理信息的可视化 Echarts 是一款基于js的交互式图表工具 这一模型可用于显示气候、地理、人流等各种信息。 1、环境 在线调试echarts的功能可以在官网,选择实例下任意一个点开: 然后在左侧的编辑框中即可编辑(其中包含了自动渲染脚本&…

数据可视化图表-散点图(Scatter plot)

本文是接着这篇内容的:https://blog.csdn.net/Cassiel60/article/details/88350442 散点图是用于研究两个变量之间关系的经典的和基本的图表。 如果数据中有多个组,则可能需要以不同颜色可视化每个组。 在 matplotlib 中,您可以使用 plt.sca…

实战PyQt5: 155-QChart图表之极坐标图表

在前面的图表中,我们使用的坐标系都是直角坐标系(也称笛卡尔坐标系), 但是有些数据序列,使用极坐标系来显示更合理(比如常见的雷达图)。QChart中,提供QPolarChart来实现用极坐标系显示的图表。 QPolarChart QPolarChart在极坐标图中显示数据…

2022-04-22 工作记录--Highcharts-图表点击事件 + 图例点击事件 + 图例格式化后的回调

Highcharts-图表点击事件 图例点击事件 图例格式化后的回调 一、前言 看似很简单的问题,其实里面有很多细节,所以做个笔记哟~❀ 如下图:上面是图表,下面是图例哟☺️ 二、官方文档 https://www.highcharts.com.cn/docs 三、…

XCL-Charts图表库简要教程及常见问题

这个Andriod图表库项目从开始至现在,热情消耗几近殆尽。还好已基本实现我想做的那些东西。趁还剩下点兴趣,把一些点非常简单的归纳一下。 所支持的图表类型: 基类 图表名称 BarChart 横/竖向柱形图及背向式柱…

使用Google Chart API 创建实时图表

实时图表可以实时显示数据。这意味着数据将永久更新以始终显示当前图表。要创建实时图表,我们使用JavaScript和Google Chart API。 这些实时图表通常用于仪表板中,以显示例如温度或价格的变化情况。应用领域多样,它们看起来确实不错。你自己看…

利用ARCGIS实现图片与excel中坐标点的匹配并绘图

一、背景 本次的实验完成的是坐标点文件与图片的匹配,已有的数据分别是点的坐标excel文件以及区域图片,来实现区域的绘制。 二、步骤 1、首先将坐标点excel文件导入ARCGIS中进行展点,数据的格式如下: 2、点击ARCGIS界面中的文件…

chatgpt赋能Python-python_plot坐标轴

Python绘图库中坐标轴的设置 介绍 Python是一种简单易学,功能强大的编程语言。它被广泛用于数据科学和可视化领域。Python绘图库中的坐标轴设置可以让我们更好地展示数据,让我们更轻松地理解数据。本篇文章将介绍Python绘图库中坐标轴设置的方法和技巧…

Unity数据可视化图表插件XCharts(折线图、柱状图、饼图、雷达图、散点图、热力图、热力图、仪表盘、环形图、极坐标、水位图等等)

文章目录 一、前言二、Unity数据可视化图表插件:XCharts1、运行效果2、文档教程 三、结束语 一、前言 点关注不迷路,持续输出Unity干货文章。 嗨,大家好,我是新发。 今天,我在GitHub上看到一个屌炸天的Unity插件&…

pyecharts0.5.x制作含地图的数据看板

引言 pyecharts作为Python的数据可视化包,其强大的功能不言而喻,Python Echart,想想就觉得牛叉。目前pyecharts有两个大的版本,一个是0.5.x版本的,一个是1.0以后版本,而且这两个版本差别很大。如果是有的…