从程序设计方法学的角度比较 SP 方法与OOP 方法

整理自 https://wenku.baidu.com/view/e2737ac684254b35eefd3491.html

文章目录

  • 从程序设计方法学的角度比较 SP 方法与OOP 方法
    • 1. 引言
    • 2. SP方法
    • 3. OOP方法
    • 4. SP方法与OOP方法的比较
    • 5. 结束语

1. 引言

二十世纪六十年代以来,随着硬件技术的迅猛发展和计算机应用领域的急剧扩大,不仅绝大多数计算机程序都采用高级语言编写,而且计算机的一些规模较大的应用软件也采用某些高级语言来编写,这时,由于一般要编写的程序的规模都比较大,因而对这些程序来说,运行时间和占存储空间的大小已经不是编写者要考虑的主要问题,而主要问题已逐渐转化为希望编写出的程序结构清晰、容易阅读、容易修改、容易验证,即希望得到好结构的程序。另一方面,20世纪60年代末到70年代初产生的“软件危机”也需要对程序设计方法、程序的可靠性等问题进行系统的研究。这也就是程序设计方法学产生的历史背景。

简单地说,程序设计方法学是讲述程序的性质以及程序设计理论和方法的一门学科。在程序设计方法学中,结构程序设计占着十分重要的位置,可以说,程序设计方法学是在结构程序设计的基础上逐步发展和完善起来的。

2. SP方法

荷兰学者 E.W.Dijkstra 等人在研究的人的智力局限性随着程序规模的增大而表现出来的不适应之后,于 1969 年提出 结构化程序设计(Structured Programming)方法,简称 SP。这是一种复杂任务时避免混乱的技术。提出了把程序结构规范化的主张,要求对复杂问题的求解过程应按我们大脑容易理解的方式进行组织,而不是强迫我们的大脑去接受难以忍受的冲击。

从程序设计方法学的角度对结构化程序设计方法进行定义如下:

由基本程序的一个固定的基集合构造出的复合程序,称为结构化程序。复合程序的复合度依赖于所使用的集合,如基集合 {顺序、条件、循环} 是构成结构化程序的最小集。

具体来说,SP 设计的思想包括以下几方面的内容:
(1)SP 是避免用 GOTO 语句的一种程序设计。
(2)SP 是自顶向下的程序设计。
(3)SP 是一种组织和编程的方法,按 SP 方法编程易于理解和修改。
(4)SP 的主要作用是使程序正确性的证明易于实现。
(5)SP 允许在设计过程中的每一步去验证其正确性。
(6)SP 讨论了如何将任何大规模和复杂的流程图转换为一种标准形式,能用几种标准的控制结构顺序、分支、重复|通过嵌套来表示。

E.W.Dijkstra 提出的这套方法,使程序具有合理的结构,以保证和验证程序的正确性。按结构化程序设计方法设计出的程序优点是:结构良好、各模块间的关系清晰简单、每一模块内都由基本单元组成。同时,由于采用了“自顶向下、逐步细化”的实施方法,能有效地组织人们的智力,有利于软件的工程化开发。

3. OOP方法

在 SP 方法的几十年实践中,给计算机软件业带来极大的进步,部分地缓解了软件危机,使用结构化的许多中小规模软件项目都获得了极大的成功。但是从九十年代初期开始,人们发现当把结构化设计方法应用于大型软件产品的开发时,似乎很少取得成功。面向对象的软件开发方法(Object-Oriented Programming,简称 OOP)六十年代后期首次被提出,经过近 20 年这种技术才逐渐得到广泛的应用。到了九十年代前期,OOP 方法已经成为人们开发软件的首选。

从程序设计方法学的角度来说,计算机求解的任何问题领域不外乎是由一些基本原始事物组成的,事物相互间存在着一定的联系。为了有效地反映客观世界,在计算机求解问题过程中,最好是建立相应的概念去直接表现组成问题领域的事物及这些事物间的相互联系。

而 OOP 的基本原理是:按问题领域的基本事物实现自然分割,按人们通常的思维方式建立问题领域的模型,设计尽可能直接自然表现问题求解的软件系统。其实质是将数据结构与其相关的操作看成一个整体,用对象描述子问题,对象族(类)形成问题空间,对象间的消息传递实现对象间的联结,从而实现用户要求。

4. SP方法与OOP方法的比较

SP 方法由瑞士的沃斯教授最早提出,其结构为:数据结构+算法=程序。然而随着软件规模的不断增长,它的不足和缺陷也愈来愈明显。在传统的 SP 设计中,数据存储与程序代码的分离还存在着一些弊端。代码的书写是结构化的,而不是模块的。因而,数据元素可以从任何代码中被访问,这就意味着,代码可以在编程者不知道的情况下被修改。这可能会导致程序的调试成为一件非常困难的事情,而程序的维护也会成为一项重要的任务,即结构化编程中修改一行代码将会造成对整个程序理解上的极大困难。其不足还体现在,依靠开发人员控制代码和数据,将会导致 可重用性的降低。造成以上现象的原因在于,采用 SP 方法设计出的程序,结构是建立在数据结构上的,而数据结构是现实世界中对象本质关系的抽象反映。由于程序所要处理的现实世界中的对象是最容易变化的部分,而变化很难被吸收于局部或某一层,因此会涉及整个程序结构

OOP 方法的出现为解决这些越来越明显的困难带来了曙光。在 OOP 的程序设计方法中,数据结构已不再是程序的基石。替代的是抽象数据类型、类和对象这些概念。数据和其结构不再分离,它们被封装在一起,与现实世界本来面貌更接近。对象的封装性将大量的实现细节封装于内部。其好处是使程序结构的复杂性降低了,使程序更易于修改,也更容易实现代码的重用。类有继承性和多态性两个最主要的特征。继承性是使类反映现实世界的层次结构,而多态性则反映了现实世界的复杂多样。OOP 允许开发人员通过继承来重用代码和数据。通过从以前的对象中继承,编程者可以更迅速地构造复杂的应用程序。其原因在于,编写新的代码总是会有可能带入错误,而重用已经过测试的代码可以使产生潜在错误的可能性达到最小。类的出现使程序的描述能力得到提高,使代码的真正重用成为可能。例如,软件开发过程中,用于界面设计的工作量常常达到 70% 以上。所以就有了很多用于开发界面的函数库。但问题在于用户很难对其进行修改扩充。其原因在于,修改函数库首先必须读懂其源代码。对用户而言,这通常是困难的,并且会引进错误。但如果提供的仅仅是类库,那么,只需要简单地继承一个类,然后,重新定义或增加新的函数就行了。

OOP 的程序,最根本的目的是使程序员能够更好地理解和管理巨大而繁杂的程序,它在 SP 的基础上完成了进一步的抽象。使用 OOP 方法绝不是要摒弃现有的 SP 方法,相反,它是在充分吸取 SP 设计优点的基础上,引入了一些新的、功能更强的概念,去开创程序设计工作的新空间。OOP 设计方法把可重复性视为软件开发的核心,通过装配可重用的部件来产生软件,而不是像 SP 编程所用的那样,是通过调用函数库中的函数去实现。要注意的是,我们这些问题的阐述是基于应用程序这一个层次进行的,事实上,在 OOP 设计中,对象内部的实现,我们往往会使用过程式的 SP 设计方法,即也会调用 C/C++ 函数库中的许多有用的函数。只是从程序的总体结构上而言,它是由一系列对象构成的,并且对象之间能够依靠某种方式进行通信和协作,来实现程序的具体功能。

SP 编程的基本思想是,把大的程序划分为许多个相对独立、功能简单的程序模块。它是以过程为中心,主要强调的是过程以及功能和模块化。任务的完成是通过一系列过程的调用和处理实现的。

OOP 编程是以对象为中心,对一系列相关对象进行操纵,发送消息给对象,再由对象执行相应的操作并返回结果,其强调的是对象。编程者在进行 OOP 编程时,不会简单地从头到尾一行一行地写代码,而是考虑应该如何创建对象,利用对象来简化程序,使开发软件相对容易。因为 OOP 设计具有这些特点,所以大大地提高了软件的开发效率。对于那些已经习惯于 SP 的设计人员来说,会有一个转变观念的过程。程序设计方法学会关注软件生命周期的各个环节,包括需求分析、总体设计以及编码、测试和维护。在选择程序设计方法时要注意到各种设计方法中各个阶段的工具,根据编程团队的知识情况来确定采用何种设计方法。

5. 结束语

在程序设计方法学的发展中,SP 和 OOP 是程序设计方法中最本质的思想方法,SP 体现了抽象思维以及复杂问题求解的基本原则,OOP 则深刻反映了客观世界是由对象组成这一本质特点。种种程序设计方法的一个主要区别在于问题分解的因子不同,思维模式不同。在计算机中数据结构和过程是密切相关的,SP 方法将数据结构和过程分开考虑,OOP 的方法组合数据和过程于对象之中。从理论上而言,OO 式方法将产生更好的模块内聚性,使软件更注重于重用与维护,但其在实践中的程序设计方法需要工具和环境的支撑,还需要考虑软件生命周期的各个环节。因而在选择程序设计方法时,需要综合考虑以上这些因素。

从程序设计方法学的角度比较 SP 方法与OOP 方法相关推荐

  1. 程序设计方法学-python

    程序设计方法学 文章目录 程序设计方法学 实例:体育竞技分析 python程序设计思维 计算思维与程序设计 基本的程序设计模式 步骤 OS库的基本使用 介绍 OS库路径操OS作 OS库进程管理 OS库 ...

  2. Python——程序设计方法学

    程序设计方法学 8.1 实例13:体育竞技分析 8.1.1"体育竞技分析"问题分析--高手过招,胜负只在毫厘之间 需求:毫厘是多少?如何科学分析体育竞技比赛? 输入:球员的水平 输 ...

  3. Python程序设计(13)-----程序设计方法学

    复习之前学过的内容 Python程序设计(6)-----基本数据类型 Python程序设计(7)-----字符串类型及其操作 Python程序设计(8)-----程序的控制结构 Python程序设计( ...

  4. 从一个程序员的角度看——微信小应用

    前言: 最近初步了解了一下微信小应用,APP端的同事也非常感兴趣,于是在公司内部做了一个小小的分享,分享的过程中有很多讨论内容,大家也是非常感兴趣和有自己的看法,当时"混乱"的场面 ...

  5. 程序员一周内了解一个行业的方法

    感觉很适合程序员阅读,毕竟搞技术的都很宅,对应一些非技术的事物,都是抱着事不关己高高挂起的态度. 原文:程序员一周内了解一个行业的方法 写得有点像做FBI的,所以看看不会有什么坏处的. 我们都是有理想 ...

  6. OSChina 周四乱弹 ——程序员的角度解读地震

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2017)请戳(这里) [今日歌曲] @OSC_JajGgv :分享轨风的单曲<拂晓车站>: &l ...

  7. python第五天 程序设计方法学

    程序设计方法学 体育竞技分析 需求:如何科学分析体育竞技比赛 输入球员的水平,能否输出比赛成绩??? 简单来说就是不断地进行比赛,最后选手的能力的而显示的输赢情况,会越来越精确 比赛规则 简单来说,两 ...

  8. Linux下程序崩溃dump时的 core文件的使用方法

    Linux下程序崩溃dump时的 core文件的使用方法 1.在启动程序前执行 ulimit -c unlimited unlimited 表示生成文件的大小限制,也可以修改为自定义的大小,例如: u ...

  9. java silk转mp3_微信小程序录音文件格式silk遇到的问题及解决方法

    不好意思,误导大家了,这种将silk解密的方式只是在小程序测试的时候可以,上线以后这种方法是不行的,还是需要使用解密转码.参见:https://github.com/kn007/silk-v3-dec ...

  10. Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法

    Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法 最近由于老师要求要在Ubuntu下QT上进程多线程服务器的开发,虽然只是单纯的调用qt的network模块,但是为了避免麻烦,我 ...

最新文章

  1. R2LIVE: 一个鲁棒实时的雷达-惯导-视觉紧耦合的位姿估计和建图系统
  2. 计算机音乐刚好遇见你乐谱,《刚好遇见你》曲谱_刚好遇见你乐谱
  3. 二叉查找树(二叉排序树)的详细实现
  4. tablayout支持改变选中文字大小,支持左右滑动,支持viewpager,支持三角可移动指示器...
  5. UserWarning: The default mode, 'constant', will be changed to 'reflect'
  6. 两个“敢”,是销售员必须懂的心法
  7. 微信硬件平台发布八大行业解决方案 成功细分着陆传统行业
  8. 今天拜读了X先生的作品,深受其益
  9. JAVA运算的类型兼容原则_Java基础语法回顾(一)
  10. 如何使用robots.txt及其详解
  11. 常用的邮箱有哪些,可用好用的邮箱大全推荐
  12. [CCC2022 J2] Fergusonball Ratings
  13. 基于XPDL2.0的过程定义
  14. 七牛云和Github如何使用PicGo设置免费图床
  15. java使用jbarcode生成条形码
  16. As的LogCat打开方法
  17. Qt QSqlQueryModel详解
  18. @Column注解解析
  19. Mac 上 VMware 安装 win7 虚拟机如何添加磁盘
  20. 关于计算几何一些算法

热门文章

  1. c语言程序由哪三个部分组成部分,C语言程序的组成部分
  2. java就业培训教程 笔记
  3. 计算机软件企业所属行业性质,最新企业所属行业类别、分类及行业代码查询表.doc...
  4. JSON编码MySQL结果
  5. 程序员进化史|P4到P9,从应届生到双11前端PM
  6. 卡巴斯基网络安全解决方案-服务器虚拟化安全2.0安装方法,卡巴斯基网络安全解决方案-协作服务器.PDF...
  7. SAS 9.4 破解时间限制
  8. Java 并发编程实战 -- 常见概念
  9. Javascript函数作为参数——JS学习笔记
  10. css如何调用函数,从CSS调用JavaScript函数