zoukankan      html  css  js  c++  java
  • 结构化方法和面向对象方法之比较

    目录:


    <1>结构化方法介绍


    <2>面向对象方法介绍


    <3>从结构化到面向对象


    <4>结构化和面向对象的优缺点比较


    <5>在实例中比较结构化和面向对象


    <6>参考文献

    <1>结构化方法介绍

        什么是结构化方法呢?对比于简单的测试和使用跳转语句的程序(为跳跃去声明往往会形成“面条代码”,使得程序难以维护和加工),结构化方法是一种范式,通过广泛的使用子程序,块结构,for和while循环语句,改善程序的清晰度,质量和减少开发时间【1】

       在这种方法下,所有的程序都可以看作是控制结构。使用“序列”,“选择”,“迭代”,“递归”控制结构就可以完成一个完整程序的编写。

                      【图1】

     

    当我们使用结构化方法进行编程的时候,与以前的非结构化相比有哪些区别呢?我们以C/C++为例。
    条件语句

    //结构化方法
    int flag;
    if(flag==1){
      flag=0;
    }
    else{
      flag=1;
    }
    //使用goto语句:
    int flag;
    if(flag==1)    goto label1;
    else    goto label2;    
    label1:
    flag=0;
    goto label3;
    label2:
    flag=1;
    goto label3;
    label3:
    //continue to do

    循环语句

    //机构化方法
    int
    array[max_size]; for(int i=0;i<10;++i){   if(i==5){     array[5]=1234;   break;   } } //使用goto语句 int array[max_size]; for(int i=0;i<10;++i){   if(i==5){     goto label1;   } } label1:array[5]=1234;

    可以看到尽管使用结构化方法在使用的时候,不如使用goto语句跳来跳去的方便。但可读性大大增强了,如果一个程序中有大量的goto语句,那足以让看代码的人崩溃,更不要说维护代码了。

     经典的结构化代码示例如下:

    bool myCheck1() throw()
    {
      bool success = false;
      try {
        // do something that may throw exceptions
        if(myCheck2() == false) {
          throw SomeInternalException();
        }
        // other code similar to the above
        success = true;
      }
      catch(...) { // all exceptions caught and logged
      }
      return success;
    }

    结构化方法的基本要点是:
    (1)自顶向下,从顶部开始设计程序。
    (2)模块化设计,程序是由一个一个的功能函数构成。
    (3)结构化编码,程序的每一部分都是控制结构。 以控制结构为基本单位单位,只有一个入口,一个出口(也有可能通过return语句实现多个出口)。从而以函数或者语句块封装一个功能。
    (4)“独立功能,单出、入口”的模块结构,是的一段程序能够作为单独的模块或者插件使用,易于理解,提高程序的复用性,并且降低程序的复杂性,提高了程序的可靠性。程序的主体是子程序层次库,它通过函数与功能模块的抽象层次相对应,增强了主体程序的可读性。
    该如何理解这段话呢,我这里举一个学生上学的例子。

    void main(){
      /*
      *本程序用于计算一个学生的一天的时间点。
      *输出学生完成一件事后的时间点
      *
      */
      string wakeTime="7:00";//醒来的时间
      string afterPre;//洗漱后的时间
      string afterEat;//吃完早,中,晚饭后的时间
      string arrSchTime;//到达学校的时间
      string afterClass;//上完课的时间
      string arrHomeTime;//到家的时间
      string afterExam;//考完试的时间
      int LongTime=1000000;//活的时间
      bool flag;//出现各种神奇的倒霉事
      /*
      *流程开始了!!!
      */
      for(int i=1;i<=LontTime;++i){
        afterPre=prepare("7:00"); //洗漱
        print(aftePre); //输出洗漱后的时间
        afterEat=eat(aftePre);//吃早饭
        print(aftePre);//输出吃完饭的时间
        arrSchTime=gotoSchool(afterEat);//去学校
        afterClass=gotoClass(arrTime);//输出到达学校的时间
        arrHomeTime=backToHome(afterClass);//回家
        print(arrHomeTime);//输出到家的时间
        afterEat=eat(arrHomeTime);//吃午饭
        print(afterEat);//输出吃完午饭后的时间
        arrTime=gotoSchool();//去学校
        print(arrTime); //输出下午到学校的时间
        afterExam=exam(); //考试
        print(afterExam);//输出考完试的时间
        arrHomeTime=backToHome(afterExam);//回家
        print(arrHomeTime);//输出到家的时间
        afterEat=eat();//吃完饭
        flag=check();//检查是否有倒霉的事情发生
        if(flag){
          gotoDie();//处理事情
        }
        else{
          sleep(afterEat);//睡觉
        }    
      }
    }

    <2>面向对象方法介绍
        什么是面向对象方法呢?是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,简称OO (Object-Oriented)方法,是建立在“对象”概念基础上的方法学。对象是由数据和容许的操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象。总的来说以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统【2】。         

              面向对象方法强调三个要点 
              (A)封装性。面向对象方法中,程序和数据是封装在一起的,对象作为一个实体,其操作隐藏在方法中,其状态由对象的"属性"来描述,并且只能通过对象中的"方法"来改变,通过类将对象内部的状态和外部隔绝开来。封装性构成了面向对象方法的基础。面向对象就是"对象+属性+方法"。
          (B)抽象性。面向对象方法中,把从具有共同性质的实体中抽象出的事物本质特征概念,称为"类"(Class),对象是类的一个实例。类中封装了对象共有的属性和方法,通过实例化一个类创建的对象,自动具有类中规定的属性和方法,并且可以通过继承方法获得父类的属性和方法。
           (C)对象之间的联系。对象之间通过信息传递,动态的联系。

    还是用上文的学生上学的例子。

    public class Student{
      //属性
      string current;
      int LongTime=1000000;//活的时间
      //方法
      public void eat();
      public void exam();
      public void backToHome();
      public void prepare();
      public void gotoClass();
      public void gotoSchool();
      public void print();
    }

    <3> 从结构化设计到面向对象程序设计
            传统的过程化设计方法,以C语言为代表的面向过程程序设计思想,以及模块化的设计流程已经无法驾驭超大型的软件系统设计了,并且随着整个软件代码函数的增加,整个工程的复杂度和可维护性也超过了设计人员的想象。必须找到解决这个软件危机的方法。在《人月神话》这本书中提出了“银弹”的概念,寻找能够消灭“软件危机”这头怪兽的“银弹(silver bullet)”。从C到C++,体现了从过程化设计到面向对象设计设计方法的转化。面向对象程序设计思想通过强调设计与实现的可扩展性和可重复性成功以及良好的封装性,成为了消灭软件危机怪兽的“银弹”。

    <4>  结构化和面向对象的优缺点比较

          

    (1)程序设计方面:结构化方法以过程化为中心,在上文中举的学生上学的例子中,可以看到数据是在整个程序中不断流动的,当前时间作为参数和返回值在模块之间流动。过程化方法把现实世界描绘为数据在信息系统中的流动,数据不仅在模块之间流动也会在模块之间转化。我们可以通过自顶向下的程序设计将复杂的程序分解为程序模块的层次图。

       

        【图2】

        在面向对象的方法中,数据是在对象间传递的,面对象数据模型和处理模型二者合一,将属性和方法封装在一个对象当中。并且将信息系统看成是一起工作来完成某项任务的相互作用的对象集合;通过定义系统中所有对象类型并显示对象之间是如何通过相互作用来完成分析任务。对象之间能通过传递消息实现彼此通信,然后数据在对象的内部实现流动和转化。

      

    【图3】

    (2) 在具体工程中的实用性:面向对象在现代的大项目中大放异彩。面向对象方法不再把程序看成工作在数据上的一系列过程或函数的集合,而是把程序看作是相互协作而又彼此独立的对象的集合。面向对象的设计方法使得整个工程具有以下的四个优点:
    (A)工程稳定性好。
    (B)代码复用性好。
    (C)较易开发大型软件产品。
    (D)可维护性好。
    (E)代码的封装性好。
    而结构化方法是将系统看成是过程的集合,过程与数据实体之间交互,过程接受输入并产生输出(1个入口,1个出口)。这样也带来的几个缺点
    (A)代码的可维护性相对较差。
    (B)代码的复用性相对较差。
    (C)不适合大型项目的多人团队协作。
    (D)难以构建合适的测试集。
    (3)从构成方面看,结构化软件是过程和数据的集合,以过程为中心;面向对象软件是数据和相应操作的封装,以对象为中心;
    (4)从运行控制方面看,结构化软件采用顺序处理方式,由过程驱动控制;面向对象软件采用交互式、并行处理方式,由消息驱动控制
    (5)从概念方面看,结构化软件是功能的集合,通过模块以及模块和模块之间的分层调用关系实现;面向对象软件是事物对象的集合,通过对象以及对象和对象之间的通讯联系实现;
    (6)从面向对象方法和结构化方法在软件设计方面来说,结构化方法的工作重点是设计,面向对象方法的工作重点是分析;在结构化方法中,分析阶段和设计阶段的表达方式不同,因此在设计阶段需要把在分析阶段采用的具有网络特征的数据流图转换为具有分层特征的软件结构图,也就是在设计阶段需要设计出真正能够对编程有直接帮助的软件结构图。而在面向对象方法中设计阶段只需要将分析阶段的对象的方法和属性进行具体的细化即可。
    (7)建模技术的不同。结构化方法使用DFD建立模型,面向对象通常使用UML建立模型。UML是一种标准的统一语言,使得IT专业人员能够进行计算机应用程序的建模。UML的主要创始人是Jim Rumbaugh、Ivar Jacobson和Grady Booch,UML使用用例图建立模型。用例图描述了系统提供的一个功能单元。用例图的主要目的是帮助开发团队以一种可视化的方式理解系统的功能需求,包括基于基本流程的"角色"关系,以及系统内用例之间的关系。

    【图4】

    什么是DFD(Data Flow Diagram)呢? 数据流图是通过一个“数据流”的图形表示信息系统,建立过程的模型。DFD经常被用来初始创建系统。DFD还可以用于可视化的数据处理(结构化设计)【3】。

    一个数据流图一般由以下几种图形构成:

    【图5】

    面向对象方法使用UML进行建模,UML通过描述对象之间的关系来描述整个系统【4】,例如下图

    【图6】

    (8)软件设计的立足点不同。结构化方法注重“面向应用,分解需求”。需要分析当前情况,做出当前物理模型的数据流图。“细化分析结果,过渡软件结构”需要将数据流图进一步细化并映射到软件模块结构。面向对象方法注重“立足应用,刻画问题”,需要确定问题区域,区分类和对象,区分整体和部分。然后在原有的基础上进一步(A)改进系统分析结果(B)
    规范化接口定义(C)设计任务管理,以及系统之间的任务调度(D)确定各个系统之间的资源分配
    (9)对现实世界的抽象重点不同。面向对象方法重点进行客观实体的概念抽象。也用上文的学生上学的例子来说,面向对象方法的重点是抽象学生这个实体,在构建模型阶段并不需要关心学生具体干了什么,后续只需要完善细节。而对于结构化方法,则需要将学生具体干了什么抽象为单独的功能模块。面向对象方法侧重于对客观实体的概念抽象,不强调具体的过程,强调封装性和可重用性,而过程化方法强调对整个问题的分解。
    (10)适用于开发不同的应用,结构化方法更加适合,较小的功能不太复杂的,工程量较小和数据统计管理软件的开发【5】,面向对象方法更加适合大型复杂的人机交互软件的开发。

    <5>在实例中比较结构化和面向对象
    结构化方法对学生上学的例子的分解结果如下:

    【图7】

    面向对象对学生上学的概念抽象如下

    【图8】

      可以从图例中看出面向对象方法和结构化方法的不同点。

    <6>参考文献及插图
    【1】:来源于wikipedia “Structured programming is a programming paradigm aimed at improving the clarity, quality, and development time of a computer program by making extensive use of subroutines, block structures, for and while loops—in contrast to using simple tests and jumps such as the go to statement which could lead to "spaghetti code" causing difficulty to both follow and maintain.”
    【2】:来源于 wikipedia “Object-oriented programming (OOP) is a programming paradigm based on the concept of "objects", which may contain data, in the form of fields, often known as attributes; and code, in the form of procedures, often known as methods. A feature of objects is that an object's procedures can access and often modify the data fields of the object with which they are associated (objects have a notion of "this" or "self"). In OOP, computer programs are designed by making them out of objects that interact with one another.[1][2] There is significant diversity of OOP languages, but the most popular ones are class-based, meaning that objects are instances of classes, which typically also determine their type.”
    【 3 】:来源于wikipedia“A data flow diagram (DFD) is a graphical representation of the "flow" of data through an information system, modelling its process aspects. A DFD is often used as a preliminary step to create an overview of the system, which can later be elaborated.[2] DFDs can also be used for the visualization of data processing (structured design).”
    【 3 】: 《编程逻辑与结构化程序设计》 作 者:“美”鲁德著
    【 4 】:《面向对象分析与设计》 ,“美”GradyBooch等著 王海鹏,潘家宇译。来源于第二章“对象模型”
    【 5 】:  《人月神话》 “美”FrederickP.Brooks.Jr.

    【6】:http://www.myexception.cn/cpp/1844782.html

    【7】:http://www.cnblogs.com/allenblogs/archive/2011/02/11/1951173.html
    【图1】来源于网络
    【图2】自行绘制
    【图3】自行绘制
    【图4】来源于网络
    【图5】来源于网络
    【图6】来源于网络

    【图7】 自行绘制

    【图8】自行绘制

     

  • 相关阅读:
    使用Autofac动态注入启动Api服务
    RabbitMQ学习笔记(六) RPC
    RabbitMQ学习笔记(五) Topic
    RabbitMQ学习笔记(四) Routing
    RabbitMQ学习笔记(三) 发布与订阅
    Quartz.NET学习笔记(二) Job和JobDetails
    RabbitMQ学习笔记(二) 工作队列
    Spark SQL JSON数据处理
    Hive JSON数据处理的一点探索
    由“Beeline连接HiveServer2后如何使用指定的队列(Yarn)运行Hive SQL语句”引发的一系列思考
  • 原文地址:https://www.cnblogs.com/codeDog123/p/6144298.html
Copyright © 2011-2022 走看看