全网最适合入门的面向对象编程教程:00 面向对象设计方法导论

news/2024/6/30 23:15:52

全网最适合入门的面向对象编程教程:00 面向对象设计方法导论

1.1 面向过程编程与面向对象编程 OOP

在嵌入式开发中,我们往往使用 C 语言进行编程,将待完成的问题看作一系列需要完成的任务,函数则用于完成这些任务,解决问题的焦点集中于函数,这就是所谓的面向过程编程。

与之相对的是面向对象编程,它把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数,相同属性和操作方法的对象被抽象为类。以在工业制造上,使用模具来铸造机壳和零件为例,类就是模具,而对象就是使用模具生产出的零件,即类的实例。

以把大象装进冰箱为例,二者区别如下图所示:

image

1.2 软件危机与 OOP 思想的提出

**“史前时期最骇人的景象,莫过于一群巨兽在焦油坑里做垂死前的挣扎。不妨闭上眼睛想像一下,你看到了一群恐龙、长毛象、剑齿虎正在奋力挣脱焦油的束缚,但越挣扎,焦油就缠得越紧,就算他再强壮、再厉害,最后,都难逃灭顶的命运。过去十年间,大型系统的软件开发工作就像是掉进了焦油坑里…… ” **
——佛瑞德·布鲁克斯

早期的编程语言,如汇编语言、只有 0 和 1 的机器语言,本质上是面向机器编程。他们开始认为编程的设计应该符合人类习惯和逻辑思维的语句,如 add 用于加法运算、sub 用于除法运算、cmp 用于比较两个数的大小。

但 CPU 指令集(汇编语言)还是比较抽象,人们有了一个自然的需求,能不能按照人容易理解的思维写程序后把写出来的程序自动翻译成机器语言呢?后来,计算机科学家们发现所有程序可以化为三种结构构成:顺序结构、分支结构和循环结构。

Fortran、C 等所谓的高级编程语言便应运而生,这样的语言关注逻辑处理过程,在面对编程问题时,往往采用结构化范型来完成软件开发,人们将软件的生存周期分为需求分析、总体设计、详细设计、编程和测试几个阶段,强调系统的模块结构,以及模块的划分,模块间的数据传送及调用关系。

然而随着软件需求的快速增长,面向过程的设计方法使得大型软件更容易被设计成面条式程序,长长的过程调用执行,像一根面条。大型项目最后由这样一根一根面条组成,就成了一个毛线团,变得难以维护和修改。

image

1968 年,北大西洋公约组织(NATO)在联邦德国的国际学术会议创造软件危机(Software crisis)一词。而 1960 年代中期开始爆发众所周知的软件危机,为了解决问题,在 1968、1969 年连续召开两次著名的 NATO 会议,并同时提出软件工程的概念。1972 年,艾兹赫尔·戴克斯特拉于计算机协会图灵奖的演讲:

软件危机的主要原因,把它很不客气地说:在没有机器的时候,编程根本不是问题;当我们有了计算机,编程开始变成问题;而现在我们有巨大的计算机,编程就成为了一个同样巨大的问题。
—艾兹赫尔·戴克斯特拉,《Communications of the ACM》

image

软件危机使人们认识到中大型软件系统与小型软件有着本质性差异:

  • 大型软件系统开发周期长、费用昂贵、软件质量难以保证、生产率低,它们的复杂性已远超出人脑能直接控制的程度;
  • 大型软件系统不能沿袭工作室的开发方式,就像制造小木船的方法不能生产航空母舰一样。
    image

软件的存在已经有数十年的历史了,一直到了 1980 年代的面向对象技术才解决了一部分在软件危机上的窘境。人们开始重新审视软件编程这件事情的本质,除了一部分科学计算或者其他特定目的的软件,大部分的软件是为了解决现实世界的问题,企业的库存管理、银行的账务处理等等。所以,软件编程的本质是程序员用代码的方式使现实世界的事务运行在计算机上,计算机软件是为了解决现实世界的问题而开发出来的,那么软件编程这件事情应该关注的重点是客观世界的事物本身,而不是程序员的思维方式或者计算机的指令。

如果软件编程的重点是客观世界的事物本身,那么编程语言如何才能更好地满足这一需求?面向对象编程应运而生,它提出一切皆对象,客观世界的用户、账号、商品是对象;创建、组合、关联这些对象的工厂、适配器、观察者也是对象;将所有这些对象分析、设计、开发出来,一个软件系统就完成了,这个软件系统灵活、强大,最重要的是可以根据需求变化快速更新维护。

1.3 面向对象方法学

面向对象方法学是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,是建立在“对象”概念基础上的方法学。对于面向对象方法学,它把软件开发分为分析、设计和编程三个不同阶段。

1.3.1 面向对象分析(OOA)

OOA 面向对象分析方法指的是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题,并确定所需的对象及对象之间的交互关系。分析阶段关注的是需要完成什么,分析阶段的输出是一系列需求。

1.3.2 面向对象设计(OOD)

面向对象设计(OOD)就是在 OOA 模型的基础上运用面向对象方法进行系统设计,是将这些需求转化为实现方案的过程。设计者必须命名对象,定义其行为,指定哪些对象可以针对其他对象实施指定的行为。设计阶段关注的是如何完成。设计阶段的输出是实现方案。

1.3.3 面向对象编程(OOP)

面向对象编程(OOP)是将完美定义的设计转化为可以运行程序的过程,即用具体的数据结构来定义对象的属性,用具体的语句来实现服务流程图所表示的算法。OOP 阶段产生的程序能够紧密地对应 OOD 模型。

image

文档获取

可访问如下链接进行对文档下载:

https://github.com/leezisheng/Doc

image
本文档主要介绍如何使用 Python 进行面向对象编程,需要读者对 Python 语法和单片机开发具有基本了解。相比其他讲解 Python 面向对象编程的博客或书籍而言,本文档更加详细、侧重于嵌入式上位机应用,以上位机和下位机的常见串口数据收发、数据处理、动态图绘制等为应用实例,同时使用 Sourcetrail代码软件对代码进行可视化阅读便于读者理解。

关于文档的更多介绍可看:
学嵌入式的你,还不会面向对象??!

相关示例代码获取链接如下:

https://github.com/leezisheng/Python-OOP-Demo

image

image

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu wps odbc 连接sqlite

ubuntu桌面版办公环境,不能用office,使用wps_linux表格处理数据,大量数据写入的时候,python特别慢,需要表格连接数据库读写数据 安装sqlite odbc 首先安装sqlite的odbc sudo apt-get update sudo apt-get install unixodbc unixodbc-dev libsqlite3-devgit clone https://githu…

【Linux系列】实现SSH服务免密登录功能配置

【实验目的】实现两台linux主机可以通过SSH实现异地互连。 【实验条件】两台linux虚拟机 OoOoO:192.168.10.39 OoOoO1:192.168.10.40 改主机名: [root@localhost ~]# vim /etc/hostname在hosts文件中做映射: [root@localhost ~] #vim /etc/hosts[root@localhost ~]# reboot …

详解业财一体化的财务产品

下面这篇是笔者整理分享的关于业财一体的一篇文章,文章包含业财一体是什么?为什么做业财一体?业财一体解决方案等内容知识,想了解业财一体内容的同学可以进来看看哦!一、业财一体是什么 需要面向内部管理者、员工,建立“项目-采购-收票-回款-开票-统计报表-财务管理”全流…

线性规划的对偶问题——由拉格朗日对偶问题导出

线性规划的对偶问题可由拉格朗日函数导出,这不仅提供了另一种理解问题的视角,还揭示了原问题与对偶问题之间深刻的关系。通过构造拉格朗日函数,原问题的约束条件被整合到目标函数中,使得我们能够在拉格朗日乘子的空间中寻求最优解。通过拉格朗日函数,可以将原始线性规划问…

多屏幕切换

方式一:利用 js 代码实现(params, refs) => {$glob.group = 屏幕ID }方式二:利用大屏的交互方式“切换大屏”实现 1.点击“交互”选项卡2.点击“编辑交互实现” 3.选择“跳转大屏” ,并在下列选项中选中对应的屏幕。

社畜日记

🐮🐴 diary6.22 Day-11 签合同,每月的24号要一次支付下下个月、下下下个月、下下下下个月3个月的房租 打扫屋子差不多喷完了一瓶酒精,因为只有一个窗户通风很差,感觉要窒息了现在感觉好像也没有那么差,毕竟我太宅了,只要不出门,外面的破烂环境就和我没关系 6.21 Day-…

串行通信

串行通信有关概念串口,通常指的是串行通信接口。 串行通信(Serial Communication) 串行通信接口通用异步收发器(Universal Asynchronous Receiver/Transmitter: UART),是一种硬件接口,通常称串口 通用同步/异步收发器(Universal Synchronous Asynchronous Receiver/Transmi…

How to get all subarrays from an array by using JavaScript All In One

How to get all subarrays from an array by using JavaScript All In One JavaScript 动态生成其所有的子数组算法How to get all subarrays from an array by using JavaScript All In OneJavaScript 动态生成其所有的子数组算法difficulty: Medium / 难度: 中等 solutionsde…