• 说说结构化方法和面向对象方法


    前言1.1

        结构化方法与面向对象方法都是软件在设计过程中两种常用的方法,两者是在特定背景下的产物,两者既相互区别又在一定程度上有所联系,具体选择哪一种开发方法要针对具体的项目类型和项目规模来确定。不过,依照笔者目前的经验,针对现有问题的复杂程度,一个系统或软件的开发过程往往是多种开发方法相结合,并且综合考虑多种因素来决定的。

     

    综述2.1

        结构化方法起源于软件危机

        20世纪60年代后期,程序员(媛)不在像以往那样将其完全掌控在自己手中,软件的开发周期和软件的质量并不明显的存在正比的关系,那时候我们的程序员(媛)们便开始摸索一种较为成熟且可靠的软件开发方法,其中:结构化便成为当时的"佼佼者"。

     

        如同一件雕塑,当米开朗基罗将大卫展现于世人眼前时,人们会惊叹他的精致与生命力,但是:米开朗基罗在创作之初就已经在心中构造好大卫的全貌,这样,才能保证框架的方向性与正确性。结构化方法正是如此,在设计过程中强调: 自顶向下,逐步求精,模块化设计等原则。当我们的程序员(媛)了解要完成的软件的全貌后,便可以刷夜大干一场了,但是在实现的过程中,因为总体的框架已经构建好,所以程序员(媛)们关注的细节全局的构建移向较为低一层的设计,简单来说,就是将问题逐层解剖,逐步向下细节化,颇有一种"迷雾过后,柳暗花明又一村"之感。

        如果将问题的输入与输出看做输入数据流与输出数据流,那么这个过程所得到的图模型称作:DFD(Data Flow Diagram)数据流图。

    图一.数据流图的产生

        上面的数据流图只是:结构化分析 (Structured Analysis)中的一部分,继续以大卫作对比,他拥有肌肉,眼睛,手,嘴,鼻子,这些可以看做是构成人体的一个个基本元素,那么:在软件设计过程中同样需要一张"清单"来规范我们所使用的基础元素,称作:数据字典(DD,Data Dictionary)。但是光有这些基础元素还是远远不足的,将这些基础元素按照一定的逻辑加以组合:形成实体关系图(ERD,Entity Relationship Diagram)。

        我们都说"美如一栋雕塑",这是因为一件雕塑作品是静止的,用来欣赏。而我们的软件是动态的,用来运行以解决现实客观事物的问题,也就是:软件对外界的输入会做出相应的反馈,其内部的逻辑即是程序状态的变化。将之前得到的数据流图(DFD)进行映射,便得到:状态转移图(STD:State Transition Diagram)。区别在于:STD侧重于软件状态的变化,而DFD用于描述数据转换的过程。

     

     

    2.2

        早期的程序设计经历了"面向问题"、"面向过程"的阶段,以结构化方法为代表,随着解决问题复杂度的进一步提高,以往的程序设计方法已经不能解决问题的需求。20世纪70年代开始,相继出现多种面向对象的语言,逐渐产生了面向对象的程序设计方法,面向对象的程序设计涉及到:对象、封装、类以及继承和多态的概念。

        对没有接触过OO(Obiected Oriented)的同学来说,我们有必要解释一下对象的概念:面向对象的程序设计是将现实世界中人认知事务以及解决问题的方法应用到程序设计中。对象可以是我们现实生活中的某个具体事务:如电梯、出租车等,也可以是一个抽象的东西:比如中心调度器。那么对象是由什么来构成的?我们知道,事务都有其基本的属性,人们将对象的静态属性抽象为属性,有数据来描述;将对象的动态特征抽象为行为,用一组code来表示,完成对数据的操作,再常见的面向对象的Java语言中,称之为方法。所以对象即是由:属性和方法来构成的。

        更为抽象一点来看,将这个对象的行为特征如果经过抽象,便可以得到这个对象的设计图纸(我们姑且可以这么看),那么反映在面向对象的程序设计中:便得到了类。实际上,人们对客观事物经过抽象,先得到类。对类的具体实例化,便得到对象。

    举个具体的例子:

          

     

     

        汽车设计图就是"类",用这个图纸制造出的汽车,便是我们要得到的对象。

    所以,类是对象的模板,对象是类的实例。面向对象的方法,即面向对象的程序设计中,三个主要的特征为:封装性,继承性和多态。封装使得:对象的使用者和对向的设计者分开,使用具体的方法时,并不知道内部的实现细节,这就保护了对象内部的属性与状态不能被被随意的更改,也使得对对象内部的访问有不同的权限与可见性。

        继承性是面向对象方法的重要部分,是提高软件重用和开发效率的"利器"。

    比如之前我们提到的汽车是大众普遍使用的标准,如果在此基础上:我们要开发新的汽车类型,它保留了原有汽车的一些基础功能,但又在原有的基础上做了新的改动与升级。那么,我们就用新定义的一个类继承原有的类,在新类中:增加或改写原有的方法,来实现新的需求。

        多态是指:允许程序中出现重名的情况,Java 语言为例,包含方法重载与成员覆盖两种形式的多态。方法重载是指:在一个类中,允许多个方法使用同一个名字,但方法的参数不同,完成的功能也不同。成员覆盖是指:子类与父类允许具有相同的变量名称,但数据类型不同,允许具有相同的方法名称,但完成的功能不同。多态使得:程序的抽象程度变得更高,有利于程序设计以更为简洁和实用的方面进行。

     

    两者之间的联系与比较3.1

     

    1. 从程序设计来看

        结构化程序设计是以:

            程序设计= 算法 + 数据结构

        面向对象程序设计是以:

            程序设计= 对象 + 类 + 继承

        结构化的程序设计以数学理论基础为支撑,形式化的证明与算法的逻辑性,同来解决问题,但是:现实生活中的问题与逻辑是与生活中具体的问题相关的,在这种情况下:面向对象的程序设计的灵活性就凸现出来,类,对象和继承能够抽象将问题具体化,但可以看到的是:缺乏严密的的数理逻辑,是面向对象的不足之处。

     

    1. 从实现技术理论来看:

        结构化更偏向于将问题自上而下的进行分解,结构化模块化地来进行分析与设计。在结构化的程序设计中,顺序、分支以及选择便组成了各个模块的逻辑结构,其简洁性和模块化地设计思想可见一斑。

        而面向对象则更注重,将问题从底层进行抽象化,将客观的事务抽象为类,问题的解决:依靠类与类之间信息的交互(信息的传递),这就好比:你要去办一个营业执照,需要各个部门的签字与同意。对象的神奇之处,就在于将数据和方法进行整合,使它们成为不离不弃的"好丽友"。

        如果将:结构化比作现实世界的数学家,遇到问题上理论,那么面向对象可以看做:新时代的有志青年,遇到问题,求人问路,他们之间的区别也可由此得出。

     

    1. 从基本概念来看:

        结构化最常用的是:系统流程图(表达的是信息在系统各部件(程序、文件数据库、表格和人工过程等)之间流动的情况),数据流图(描绘信息在系统中流动和处理的情况)和模块(组成结构化软件的基本单位,能够完成一项独立的功能

    )。

        面向对象最常使用的是类,方法,封装,继承和多态。

        这两种设计理念上的差距也构成了它们的显著区别。

     

    1. 从软件开发过程来看:

        在结构化的方法中,我们的程序员(媛)在理解问题的需求与输出后,求解问题的思路是:

        现实世界 ——流程图 ——面向过程语言 ——执行求解

    其最大的问题在于:各个模型之间是相互分开的,执行完一部分后,下一步的输入为前一步的输出,在后期的更改较为困难,没有一个联系各个阶段统一模型并且不支持重用。

        而面向对象的求解思路是:

        现实世界 ——类图 ——面向对象语言 ——执行求解

        对象是的问题抽象化程度更高,每个对象承担的功能与各自的属性与具体的问题相关,当程序有变动时,只需要对几个或过个相关的类进行调整,可采用:继承或重载等,使得代码的可重用性大大提高,便于软件的后期的维护,从此点来看,面向对象是更优的。

     

    两种开发方法的相似之处

     

        结构化和面向对象方法虽然在各种方面都不同,是与它们所解决的具体问题和设计理念相关。但是,也可以发现一些相同的地方。

        结构化中的ER图,是将问题抽象为一个具体的实体,其实就有了对象的意味,但是是相比于面向对象方法中的类,ER图中实体与实体之间的联系仅由连接关系所表示,代表的联系较不全面,而面向对象方法中的类则有一整套完整的方法用来解决问题,两者的规模还是相差较大的。

        面向对象中的方法实际上与结构化中的模块类似,更为具体的是与函数相近,但是面向对象中的方法与具体的类相结合,它是对象特有的动作,用来改本类的数据,即改变本对象的状态,这是结构化的模块未涉及的。

     

    结语 4.1

        结构化与面向对象是程序设计中两种常用的方法,它们代表着程序设计中两种截然不同的设计理念,这是每一个程序员们所应该理解与支持的。可以说:结构化更偏向与计算机的思维,适用熟悉或习惯面向过程的程序设计人员,及一般开发人员,而面向对象更侧重于人解决问题的方法与方式,不同于计算机处理问题的方法,适用有经验的问题分析人员,及一般开发人员。

        又到了最为常见的"方法论"了:具体问题具体分析,诚然,在当今软件开发领域,越来越多的软件在开发过程中,也是将两者结合起来,面向对象建立模型,结构化的对各个方法和模块进行解码,所以说,没有一个统一标准来评判谁更为优越。

        最后,感谢各为看官的耐心,还请不吝赐教~

     

    参考 5.1

    1.从结构化方法学走向面向对象方法学 赵玉鹏 梁国钊

     

  • 相关阅读:
    Pycaret 安装问题
    关于ThreadLocal最直白的解释
    每日一题(2022524):经典搜索算法
    我使用Spring AOP实现了用户操作日志功能
    使用 CompeletedFuture 实现异步调用
    MVCC(多版本并发控制)详解
    【ACM程序设计】动态规划 第二篇 LCS&LIS问题
    服务器定时备份数据库
    mysql 慢查询
    js数组复制(浅拷贝,深拷贝)
  • 原文地址:https://www.cnblogs.com/imisilence/p/6185406.html
Copyright © 2020-2023  润新知