关于软件工程的一些基本概念

一直对软件工程中的很多概念都混淆不清,因此查找了相关资料,对很多概念进行了总结,现在脑子终于清楚了!

1.软件生命周期(SDLC,Software Devlopment Life Cycle)

        软件从孕育、诞生、成长、成熟、衰亡等等段称为软件生命周期。

        早在在20世纪70/80年代起系统开发的生命周期以结构化的方法具体分成了六个阶段:问题的定义及规划、需求分析、软件设计、程序编码、软件测试、运行维护。

       (1)问题的定义及规划:开发方调研用户需求及用户环境,开发方和需求方论证项目的技术、经济、市场等可行性并制定项目初步计划。

       (2)需求分析:(核心是需求总是在变化的)开发方确定系统的运行环境、建立逻辑模型、确定系统的功能和性能要求。

       (3)软件设计:1)概要设计:建立系统总体结构、划分功能模块、定义各个功能模块的接口,制定测试计划。

                              2)详细设计:设计各个模块的具体实现算法,确定各个模块间的详细接口,制定测试方案。

      (4)程序编码:编写程序源代码、进行模块测试和调试,编写用户手册。

      (5)软件测试:集成测试、编写测试报告

     (6)实现和运转:对修改进行配置管理,记录修改记录和故障报告。

        而随着面向对象方法和统一软件开发过程(RUP)方法论的提出,出现统一过程的生命周期,在统一过程中重复一些列组成系统生命周期的循环,每次循环都可以向用户提供一个产品版本作为终结。每次迭代都包括四个阶段:初始、细化、构造和移交。下文有介绍。

2.软件开发模型(Software Development Model)

        软件开发模型是软件开发全过程、软件开发活动以及他们之间关系的结构框架。它是一种策略,这种策略是由软件工程师在具体的实践工程活动当中设计并提炼出来,能够覆盖软件生命周期的基本阶段,确定设计的方法、过程及工具。

        软件开发模型也成软件生命周期模型(Life Cycle Model),典型的软件开发模型有:大爆炸模型、边写边改模型、瀑布模型、快速原型模型、螺旋模型、敏捷开发模型。以下简单介绍几种:

(1)瀑布模型(Waterfall Model)

        瀑布模型的软件开发过程与软件生命周期是一致的并且它是由文档驱动,两相邻阶段之间存在因果关系,需要对阶段性的产品进行审批。瀑布模型假定用户的需求是不变的,因此缺乏灵活性。

      

 

(2).快速原型模型(Rapid Prototype)

        快速原型模型在功能上等价于产品的一个子集。根据客户的需要在很短的时间内解决用户最迫切的需要,此时只是部分功能的实现,快速原型模型最重要的目的是确定用户真正的需求并支持需求的动态变化。一般不会单独使用,而和瀑布模型或螺旋模型一起使用。

(3).螺旋模型

        螺旋模型是瀑布模型和快速原型模型的有机结合,它是由风险驱动的,它强调了其他模型所忽略的风险分析,适合较大的系统,但是缺乏对风险的评估。

(4).迭代模型

        迭代模型是统一软件开发过程(RUP,Rational Unified Process)推荐的软件开发模型。迭代模型指在进行较大规模的项目任务时,将迭代开发分为若干次,每次迭代都要从项目的管理及计划、分析、设计、实现到运作整个过程。如图,纵向就是每次迭代,而横向就是每次迭代要经过的阶段。

(5).敏捷开发模型

        敏捷开发模型是一种以人为核心、迭代、循序渐进的开发框架。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成功都经过测试,具备集成和可运行的特征。

        在上文介绍的瀑布模型、快速原型模型、螺旋模型、迭代模型等软件开发模型中可以看出,在软件工程实际运用中,只采用单一一种模型显然不能适应项目负责的需求变化,采用各种模型组合开发的形式在实际运用中较为广泛,而敏捷开发模型是多种软件开发项目管理方法的集合,其中包括了极限编程(XP)、迭代增量化模式(Scrum)等十几种软件开发模型。

3.软件生命周期与软件开发模型的关系

        从上文对软件生命周期和软件开发模型的介绍,可以总结出软件生命周期是一定的,而软件开发模型是在软件生命周期中如何进行软件开发的一种策略,它是由软件工程师在实际的实践工作中总结和提炼出来的一种能够覆盖软件生命周期的框架。在软件生命周期内可以选择多个软件开发模型来对软件进行开发。

4.统一软件开发过程(RUP,Rational Unified Process)

        统一软件开发过程是一个面向对象且基于网络的和UML建模的程序开发方法论。

        统一软件开发过程(RUP)是一个二维的,横向是时间组织即软件的生命周期,在横向利用软件开发模型中的迭代模型进行初始、细化、构造及交付的迭代;而在纵向是内容组织,及每次迭代都要完成同样的工作流,只是这些工作流在每次迭代的侧重点不一样。同样,每个工作流在软件生命周期的侧重点也不一样。 

      (1)Rup中的软件生命周期在时间上分解为四个阶段,分别是:初始化阶段(Inception)、细化阶段(Elaboration)、构造阶段(Construction)和交付阶段(Transition)。每个阶段结束于一个主要的里程碑(Major Milestone);每个阶段本质上是两个里程碑之间的时间跨度。在每个阶段结尾要进行评估,只有评估通过才能进入下一个阶段。

       1) 初始阶段:目标是为系统建立商业案例并确定项目边界。初始阶段结束时的第一个重要里程碑:生命周期目标(Lifecycle Objective)里程碑。这个里程碑用来评价项目基本的生存能力。

        2) 细化阶段:目标是分析问题领域,建立健全的体系结构基础、编制项目计划、淘汰项目中最高风险的元素。为了达到此目的,必须在理解整个系统的基础上,对体系结构作出决策,包括范围、主要功能、性能等非功能需求。同时为项目监理支持环境,包括开发案例、创建模板、准备工具等。细化接管介绍时的第二个重要的里程碑:生命周期结构(Lifecycle Architecture)里程碑。生命周期结构里程碑为系统的结构建立了管理基准并使项目小组能够在构建阶段中进行衡量。此刻,要检验详细的系统目标和范围、结构的选择以及主要风险的解决方案。

        3) 构造阶段:是一个制作过程,重点放在管理资源及控制运作以优化成本、进度和质量。构建阶段结束时第三个重要的里程碑:初始功能(Initial Operational)里程碑。初始化里程碑决定了产品是否可以在测试环境中进行部署,也称为beta版。

        4) 交付阶段:为发布准备产品测试,基于用户反馈进行调整。在交付阶段的重点是第四个里程碑:产品发布(Product Release)里程碑

        (2)统一软件开发过程的9核心工作流,分为6个核心工作流(Core Process Workflows)和3个核心支持工作流(Core Supporting Workflows)。这些工作流在整个软件生命周期中一次又一次被访问。9个核心工作流在项目中轮番被使用,在每一次迭代中可以不同的重点和强调重复。

        1)商业建模(Bussiness Modeling):定义组织的过程,角色和责任来确定用例模型。

        2)需求(Requirements):描述系统应该做什么,用例描述。

        3)分析和设计(Analysis & Design):将需求转化为未开系统的设计,产生一个设计模型和一个分析模型。设计模型是源代码的抽象,由设计类和一些描述组成。可有领域类图、设计类图、顺序图等UML建模语言来描述。

        4)实现(Implementation)

        5)测试(Testing)

        6)部署(Deployment)

        7)配置和变更管理

        8)项目部案例(Project Management)

        9)环境(Environment)

5.结构化的软件开发方法

        软件工程的方法是基于软件危机的问题提出来的,最广泛使用的模型是结构化生命周期模型。它将软件开发分为几个不同的阶段:需求分析、系统设计、系统实现、系统测试、试运行及维护等。它的目的是模仿工程中的一些方法,将软件开发规范化,每阶段形成一定格式的文档,下一阶段以上一阶段的文档为原料。这种方法可以控制软件开发的进度,合理分配人力和资金等以实现软件的可靠性和维护性等。

        结构化分析与设计方法是以数据流图为工具,实现对问题空间即需求的描述。它主要以数据流、数据变换为考虑对象,从这个角度来描述整个系统的状况。通过数据流图为蓝本对系统的功能加以分解,一直到最小的功能元素单元,然后开发人员据此进行程序设计。

       结构化分析与设计方法强调的是开发方法的结构和理性,它的本质是功能分解,从代表目标系统整体功能的单个处理着手,自顶向下不断地把复杂的处理分解为子处理,这样一层一层地分解下去,直到仅剩下的若干个容易实现的子处理为止。当所分解的子处理十分简单时,就可以写出各个最底层处理的处理描述。但随着软件工程的发展,接过话分析与设计方法表现出以下弊端:

        (1)结构化分析与设计方法是围绕现实处理功能的过程来构造系统的。然而,用户需要的变化大部分是针对功能的,因此,用结构化方法设计出的系统结构常常不稳定。

        (2)结构化分析与设计方法定了了目标系统的边界,且开发系统的结构依赖于对系统边界的定义,因此,很难把系统扩展到新的边界,系统难修改和扩充。

        (3)结构化分析与设计方法设计系统时,几乎每开发一个新的软件系统都要针对具体系统做大量重复和复杂的工作,代码重用性差。

6.面向对象的软件开发方法(Object-Oriented Method)

       面向对象方法是一种把面向对象的思想应用于软件开发过程中,指导软件开发活动的系统方法。

        面向对象开发方法是基于所研究的问题,对问题空间进行自然分割,识别其中的对象及其相关关系,以对象为基础对软件进行处理的开发方法。它按照人类自己认识客观世界的一般方法和一般思维去分析和解决问题,是人类认识过程的计算机模拟。

        面向对象方法(OO,Object Orientation)的基本概念

        (1)对象(Object):描述客观事物的一个实体,是构成系统的基本单元,它由一组属性和一组服务(操作)组成。

        (2)类(Class):是一组具有相同属性和相同操作的对象的集合。

        (3)实例(Instance):一个具体的对象就是类的一个实例。

        (4)消息(Message):对象之间在交互的过程中传送的通信信息。一般由三部分组成:接收消息的对象、消息名及实际变元。

        (5)封装(Encapsulation):是面向对象方法的一个重要原则。封装就是把对象的属性和操作结合在一起,构成一个独立的对象,它的内部信息对外界是隐藏的,不允许外界直接存取对象的属性,而自能通过有限的接口与对象发生联系。对于对象的外界而言,只需要知道对象所表现的外部行为,不必了解对象行为的内部实现细节。即统一外部接口和不公开内部实现。

        (6)继承(Inheritance):子类(派生类)可以自动拥有父类(超类)的全部属性与服务。目的是为了提高程序的可重用行。

        (7)多态(Polymorphism):在积累定义的属性和服务被其子类继承后,可以具有不同的数据类型或表现出不同的行为。

        (8)抽象(Abstraction):从众多的事物中抽取共同的、本质性的特征,而舍弃其非本质的特征。

 

面向对象方法的特点:

        (1)封装性:面向对象方法中,程序和数据是封装在一起的,对象作为一个实体,其操作隐藏在方法中,其状态由对象的“属性”来描述,并且只能通过对象中的“方法”来改变,从外界无从得知。面向对象方法的创始人Codd和YouMn认为,面向对象就是“对象+属性+方法”

        (2)抽象性:面向对象方法中,把从具有共同特性的实体中抽象出事物本质的特征和概念,成为“类(Class)”,对象是类的一个实例。类中封装了对象共有的属性和方法,通过实例化一个类创建的对象,自动具有类中规定的属性和方法。

        (3)继承性:是类具有的特性,类可以派生出子类,子类自动继承父类的属性和方法。这样在定义子类时,只需说明它不同于父类的特性,从而可以大大提高软件的可重用性。

        (4)动态连接性:对象间的联系是通过对象间的消息传递动态建立的。

 

面向对象开发方法的基本思想:

        (1)客观世界是由对象组成的

        (2)对象由属性和操作组成

        (3)对象可按其属性进行分类

        (4)对象之间的联系通过传递消息来实现

        (5)对象具有封装性、继承性和多态性。       

 

面向对象方法的开发过程:

        (1)面向对象的分析(OOA)

              1)问题领域分析(标识对象)

              分析领域的业务范围、业务规则和业务处理过程,确定系统的责任、范围和边界,确定系统的需求、在分析中需要着重对系统与外部的用户和其他系统的交互进行分析。确定交互的内容、步骤和顺序。

              2)发现和定义对象、类(标识结构)

              识别对象和类,确定它们的内部特征:属性与服务操作。这是一个从现实世界到概念模型的抽象过程,是认识从特殊到一般的上升过程。

              3)识别对象的外部联系(标识主题)

              在识别和定义对象与类的过程中,需要同时识别对象与对象、类与类之间的各种外部联系,包括结构性的静态联系和行为性的动态联系,包括特殊与一般、整体与部分、实例连接、消息链接等联系。

              4)建立系统的静态结构模型(定义属性)

               根据系统的静态结构,建立系统的静态结构模型,并且把它们用图形和文字说明表达出来。这主要是在前面对于类和对象、及其联系的分析基础上,绘制对象类图和对象图、系统与子系统结构图等,编制相应的说明文档。

              5)建立系统的动态行为模型(定义方法)

              分析系统的行为,建立系统的动态行为模型,并且把它们用图形和文字说明表达出来,如绘制交互图、状态图等,编制相应的说明文档。

        (2)面向对象的设计(OOD)

             1)设计对象与类

              在OOA的对象模型的基础上具体设计对象与类的属性、服务操作(设计数据结构和操作的实现算法),设计对象与类的各种尾部联系的实现结构,设计消息与事件的内容、格式等。

             2)设计系统结构

             一个复杂的软件系统由若干子系统组成,一个子系统由若干软件组件组成。设计系统结构的主要任务是设计组件与子系统,以及他们的相互的静态和动态关系,一般应用系统可由四个组成部分:问题域(业务层)、人机界面(界面层)、数据管理(数据层)、任务管理(逻辑层)。

             3)设计问题域子系统

              问题域子系统复杂应用系统的业务服务,即确定系统的主要业务。

             4)设计人机交互子系统

             人机交互子系统提供系统用户界面,是表现层的部分。其中主要任务是设计用户界面。设计详细交互过程等。

             5)设计数据管理子系统

             数据管理子系统负责数据的管理,包括数据的录入、修改、检索、存储,以及对永久性数据的访问控制等。

             6)设计任务管理子系统

              任务管理子系统主要负责协调和管理进程。

             7)设计优化,提高系统的性能

              系统设计的结果需要优化,尽可能的提高系统的性能和质量。比如说优化查询、简化代码等。

        (3)面向对象的编程(OOP)

        (4)面向对象的测试(OOT)

        (5)面向对象的维护(OOM)      

7.结构化方法(面向过程)和面向对象方法的联系

(1)处理问题时的出发点不同

             结构化方法强调过程抽象化和模块化,以过程为中心;

             面向对象方法强调把问题域直接映射到对象及对象之间的接口上,用符合人们通常思维方式来处理客观世界的问题。

(2)处理问题的基本单位和层次逻辑关系不同

             结构化方法把客观世界的问题抽象成计算机可以处理的过程,处理问题的基本单位是能够表达过程的功能模块,用模块的层次结构概括模块或模块间的关系和功能;

             面向对象方法是用计算机逻辑来模拟客观世界中的物理存在,以对象的集合类作为处理问题的基本单位,尽可能使计算机世界向客观世界靠拢,它用类的层次结构来体现类之间的继承和发展。

(3)数据处理方式与控制程序方式不同

              结构化方法是直接通过数据流来驱动,各个模块程序之间存在着控制与被控制的关系;

              面向对象方法是通过用例(业务)来驱动,是以人为本的方法,站在客户的角度去考虑问题。

你可能感兴趣的:(软件工程,敏捷开发,测试,工作,construction,任务,inheritance)