面向对象开发技术02_面向对象编程与非面向对象编程

02 面向对象编程与非面向对象编程

复杂性是软件开发过程中所固有的特质。[Booch94]

应对复杂性的基本途径:

  • 分解 Decomposition 分而治之
  • 抽象 Abstraction 抓本质,抓重点
  • 层次化 Hierarchy 应对大系统,纲举目张

软件工程所采用的方法不是唯一的,自软件工程出现以来,人们已经提出了多种软件开发方法,例如:

  • 功能分解法、
  • 数据流法(结构化方法)、
  • 快速原型法、
  • 信息模型法、
  • 面向对象方法。

何谓“结构化”?

结构程序设计就是一种进行程序设计的原则和方法,按照这种原则和方法可设计出结构清晰,容易理解,容易修改,容易验证的程序.即:结构化程序设计是按照一定的原则与原理,组织和编写正确且易读的程序的软件技术.结构化程序设计的目标在于使程序具有一个合理结构,以保证和验证程序的正确性,从而开发出正确,合理的程序。

  • 结构化程序设计
    设计过程 程序组织 语句构造 结构化
  • 结构化分析设计
    数据流图 数据字典 模块结构图
  • 结构化的好处
    科学化 可读性 模块化 信息隐蔽…

结构化程序设计的主要特征与风格如下所述:
(1)一个程序按结构化程序设计方式构造时,一般地总是一个结构化程序,即由三种基本控制结构:顺序结构,选择结构和循环结构构成.这三种结构都是单入口/单出口的程序结构。已经证明,一个任意大且复杂的程序总能转换成这三种标准形式的组合。
(2)有限制地使用goto语句.鉴于goto语句的存在使程序的静态书写顺序与动态执行顺序十分不一致,导致程序难读难理解,容易存在潜在的错误,难于证明正确性,有人主张程序中禁止使用goto语句,但有人则认为goto语句是一种有效设施,不应全盘否定而完全禁止使用.结构程序设计并不在于是否使用goto语句,因此作为一种折衷,允许在程序中有限制地使用goto语句。
(3)藉助于体现结构化程序设计思想的所谓结构化程序设计语言来书写结构化程序,并采用一定的书写格式以提高程序结构的清晰性,增进程序的易读性。
(4)强调程序设计过程中人的思维方式与规律,是一种自顶向下的程序设计策略,它通过一组规则,规律与特有的风格对程序设计细分和组织.对于小规模程序设计,它与逐步精化的设计策略相联系,即采用自顶向下,逐步求精的方法对其进行分析和设计;对于大规模程序设计,它则与模块化程序设计策略相结合,即将一个大规模的问题划分为几个模块,每一个模块完成一定的功能.结构化程序相比于非结构化程序有较好的可靠、易验证性和可修改性;结构化设计方法的设计思想清晰,符合人们处理问题的习惯,易学易用,模块层次分明,便于分工开发和调试,程序可读性强。其设计语言以Ada语言为代表。

  • 1978年,E.Yourdon和L.L.Constantine提出了结构化开发方法SASD(Structure Analysis Structure Design)
  • 也称面向数据流的软件开发方法
  • 把软件系统的功能看做是根据给定的输入数据,进行相应的运算,然后输出结果。

在这里插入图片描述

结构化设计是属于自顶向下的设计,在设计阶段就不得不考虑如何实现系统的功能,因为分解的过程其实就是实现功能的过程

局限性:

  • 不能灵活地适应用户不断变化的需求
  • 比如要求修改现有软件的实现方式或追加新功能时
  • 需要自顶向下地修改模块的结构,有时甚至整个软件系统的设计被推翻。

结构化编程SP(Structure Programming):

  • 程序的主体是方法
  • 方法是最小的功能模块
  • 一组相关的方法组合成一个大的功能模块

举例:

一个画板系统Panel,包括4个功能:
选择形状、画长方形、画圆、画直线

自顶向下结构化分析设计
工具:数据流图DFD

在这里插入图片描述

选择形状模块数据流图:
在这里插入图片描述

假定需求发生变化,要求增加一个画三角形的功能,需要对系统做多处改动

  • 增加一个形状常量定义
  • 增加一个画三角形的功能方法
  • 在selectShape中增加一个分支逻辑

结构化开发方法:

  • 制约了软件的可维护性和可扩展性
  • 模块之间的松耦合性不高
  • 修改或增加一个模块会影响到其他模块
    这些缺陷的根本原因在于:
  • 自顶向下地按照功能来划分。但是软件的功能不是一成不变的
  • 软件系统中最小的子系统是方法。方法和一部分与之相关的数据分离,全局变量和常量数据分散在系统的各个角落,削弱了各个系统之间的相对独立性

非面向对象编程:

  • 对于非面向对象编程,程序往往是面向过程或者面向数据的。
  • 这些程序中通常有可全局访问的数据及过程,由主程序或其子程序来控制及操作这些数据。
  • 程序的每个部分都可以访问全局数据,得到数据的一部分,操作这些数据,然后在需要时,保存对数据的更改。

对于面向对象编程:

  • 程序被划分为一组通信的对象
  • 每个对象均封装了关于某个概念所有行为和信息
  • 实现功能的能力、实现功能所需的“知识”或数据被分布在对象之中。当一个对象对其他对象有需求时,就向该对象发出消息,这个对象接受到此消息后做出相应的动作并很有可能返回值给调用者。
  • 第一个对象甚至可以在第二个对象不存在的情况下创建该对象
  • 因此,要开始进行面向对象编程时,通常就是先创建几个对象,然后让这些对象开始通信。
  • 这种面向对象编程的观点,即对象分摊工作和责任,对我们而言是十分熟悉的,因为现实中人类也采用这样的交互方式。

例如一位企业主,并不需要对所有的事亲历亲为,事实上,该企业主只需要将任务分配给雇员。每位雇员不仅要完成给定的任务,并且还得负责维护和该任务相关的数据。比如,秘书不仅需要负责打印文件,也要负责将文件存放在适合的档案柜中;并且,如果文件中存放的是机密数据,秘书也要负责保护这些文件,并且负责允许或拒绝他人对文件的查看。在秘书的工作过程中,他可能还需要办公室内外其他人员的帮助。

面向对象语言:

  • 类(class)的概念可以从建模角度及编程语言的角度来理解。
  • 在设计软件应用的时候,类模型将对系统中重要的概念进行抽象处理,建立良好定义的责任及与其他类的良好关系。
  • 在面向对象编程语言中,类可以被视为对象的模板,而这些对象描述了某种行为、某些责任以及某些相关数据
  • 对象(object)是类的实例。一个对象就类似于一位秘书或一位警察。
  • 对象所属的类定义了该对象拥有的数据类型、该对象的行为及该对象对这些数据的责任。但对于一位秘书而言,个人拥有各自需要维护的数据(各自的状态)
  • 对象之间通过消息传递的方式通信并命令彼此进行动作。
  • 通过向其他对象传递消息,第一个对象让第二个对象执行某些代码。这些代码实际上就是一个过程, 在面向对象语言中称为方法(method),该过程与第二个对象关联。
  • 因此,消息传递实际上就是一个对象向另一个对象发出的要求执行其某个方法的要求(或命令)。通过这个机制,对象可以被视为能对发出请求的任何客户端提供服务的服务器(通过消息的接受)。

面向对象编程的优点:
面向对象的方式与非面向对象的方式相比

  • 由于所谓的“智能”被分布在了各个对象之中,每个对象都维护了各自实现任务所需的数据,将数据保存于较小的可管理单元就相对比较容易,
  • 这种方式也便于理解这些单元是如何互相影响的。面向对象编程的分布性可以增加代码的可读性。
  • 对于非面向对象程序而言,在全局数据结构上的一次小改动将有可能迫使所有访问该数据的过程进行相应的改变。
  • 设计良好的面向对象程序只有少量的全局数据,而将大部分数据存储于对象中进行内部使用。
  • 对象所属的类中的数据存储方式的改变通常意味着,程序中需要改变的部分只有该类内部的代码而已。
  • 如果编程人员认为某个对象工作过于低效,就可以在不对系统的其他部分产生影响的情况下,重新设计该对象使其变得高效,从而支持了软件的可维护性。
  • 由于每个对象都具有一个小的良好设计的角色,并独自包含所需的数据,在其他情况下重用该对象就会十分容易。

END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值