软件工程2010

2,654 views

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,654
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
24
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • W.Royce 于 1970 年提出。 特点: 1 阶段间的顺序性和依赖性。 2 推迟实现观点。 3 质量保证的观点。 a) 每一阶段都要完成文档; b) 每一阶段都要对完成的文档进行复审,以便尽早发现问题。
  • 1 我们把对象看作数据和函数的内聚包。 2 获得对象数据的唯一方法是通过调用可用对象函数,我们把这些函数称为方法。把对象的数据部分隐藏在函数这层之下,称为封装或数据隐藏。
  • 1 对象形成到其它对象的链接并且通过这些链接来回发送消息。 2 当一个对象接收消息时。它查看它的操作集以了解是否存在一个操作,它的签名与消息的签名匹配。如果存在,那么它调用该操作。 这些签名包括消息 ( 或者操作 ) 名称、参数类型和返回值。
  • 代码 走查 是一个开发人员与架构师集中与讨论代码的过程。代码 走查 的目的交换有关代码是如何书写的思路,并建立一个对代码的标准集体阐述。
  • 软件工程2010

    1. 1. 软件工程 哈尔滨工业大学 ( 威海 ) 计算机科学与技术学院 孟凡超 Email : [email_address] Tele: 15163155787
    2. 2. 参考教材 <ul><li>软件工程 - 原理、方法与应用 . 史济民等 , 高等教育出版社。 </li></ul><ul><li>软件工程 . 张海藩 . 人民邮电出版社。 </li></ul><ul><li>Software Engineering: Theory and Practice( 软件工程 ). Shari Lawrence 等,人民邮电出版社。 </li></ul><ul><li>UML2 and the Unified Process Practical Object-Oriented Analysis and Design(UML2.0 和统一过程 ).Jim Arlow. 机械工业出版社。… </li></ul>
    3. 3. 主要内容 5 6 3 7 8 2 4 9 软件测试 软件维护 软件工程概述 软件编码 软件设计 软件需求分析 软件质量管理 软件工程管理 1 软件开发模型
    4. 4. 主要内容 5 6 3 7 8 2 4 9 软件测试 软件维护 软件工程概述 软件编码 软件设计 软件需求分析 软件质量管理 软件工程管理 1 软件开发模型
    5. 5. 软件工程概述 <ul><li>主要内容 </li></ul><ul><li>软件 </li></ul><ul><li>软件工程 </li></ul><ul><li>软件工程与计算机科学的区别 </li></ul><ul><li>软件工程与计算机系统工程 </li></ul>
    6. 6. 软件工程概述 <ul><li>软件: 软件是能够完成预定义功能的可执行的计算机程序和使程序正常执行所需要的数据,加上描述程序的操作和文档。 </li></ul><ul><li>简明地表述,可以写作:软件 = 程序 + 文档。 </li></ul>软件 = 程序 + 文档 可执行部分 不可执行部分 文档 1 文档 2 文档 3 程序
    7. 7. 软件工程概述 <ul><li>程序: 程序是为了解决某个特定问题而用程序设计语言描述的适合计算机处理的语句序列。 </li></ul><ul><ul><li>main( ) </li></ul></ul><ul><ul><li>{ int i, j;   // 变量定义 </li></ul></ul><ul><ul><li>char Str[10]; </li></ul></ul><ul><ul><li>i = i + j ; // 语句说明 </li></ul></ul><ul><ul><li>…… } </li></ul></ul>C 语言程序 <ul><ul><li>Class Order{ </li></ul></ul><ul><ul><li>String number; // 属性  </li></ul></ul><ul><ul><li>String customer; </li></ul></ul><ul><ul><li>create() // 方法 </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>…… </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>…… </li></ul></ul><ul><ul><li>} </li></ul></ul>Java 语言程序
    8. 8. 软件工程概述 <ul><li>程序设计语言具有良好、严格的语法和语义。 </li></ul><ul><li>目前程序设计语言主要有以下类型 </li></ul><ul><li>面向机器: 如汇编语言、机器语言等 </li></ul><ul><li>面向过程: 如 Fortran 、 Pascal 、 C 等 </li></ul><ul><li>面向对象: 如 C# 、 Java 等 </li></ul><ul><li>面向问题: 如结构化查询语言 SQL 等 </li></ul>
    9. 9. 软件工程概述 <ul><li>文档: 软件开发活动的记录,主要供人们阅读,既可用于专业人员和用户之间的通信和交流,也可以用于软件开发过程的管理和运行阶段的维护。 </li></ul><ul><li>文档类型: 需求分析文档、软件设计文档、软件测试文档等。 </li></ul><ul><li>编写文档的目的 </li></ul><ul><li>促进对软件的开发、管理和维护; </li></ul><ul><li>便于各种人员 ( 用户、开发人员 ) 的交流。 </li></ul>
    10. 10. 软件工程概述 <ul><li>软件的类型 </li></ul><ul><li>系统软件: 计算机系统软件是计算机管理自身资源 ( 如 CPU 、内存、外存、外设等 ) ,提高计算机使用效率并为计算机用户提供各种服务的基础软件。例如,操作系统、数据库管理系统等。 </li></ul><ul><li>实时软件: 监测、分析和控制现实世界发生的事件,能以足够快的速度对输入信息进行处理,并在规定的时间内作出反应的软件。例如,各种设备运行监控软件等。 </li></ul>
    11. 11. 软件工程概述 <ul><li>嵌入式软件: 嵌入式计算机系统将计算机嵌入在某一系统之中,使之成为该系统的重要组成部分,控制该系统的运行,进而实现某一特定的物理过程。用于嵌入计算机系统的软件称为嵌入式软件。例如,航空航天系统、指挥系统、汽车控制系统等。 </li></ul><ul><li>科学和工程计算机软件: 它们以数值算法为基础,对数值量进行处理和计算,主要用于科学和工程计算。例如,数值天气预报、导弹计算、石油勘探、计算辅助设计 (CAD) 等。 </li></ul>
    12. 12. 软件工程概述 <ul><li>事务处理软件: 用于处理事务信息,特别是商务信息的计算机软件。事务信息处理是软件最大的应用领域。例如,工资管理系统、人事管理系统、企业资源计划系统 (ERP) 等。 </li></ul><ul><li>人工智能软件: 支持计算机系统产生人类某些智能的软件。它们求解复杂问题不是用传统的计算或分析方法,而是采用诸如基于规则的演绎推理技术和算法。应用领域有专家系统、模式识别、自然语言理解、人工神经网络、程序验证、自动程序设计、机器人学等。 </li></ul>
    13. 13. 软件工程概述 <ul><li>CASE 工具软件: CASE 工具软件一般为支撑软件生存周期中不同活动而研制,包括项目管理工具、需求分析工具、编程环境 ( 编辑器、编译器、链接器和测试器于一体 ) 、软件测试工具等。 </li></ul>
    14. 14. 软件工程概述 <ul><li>软件的特征 </li></ul><ul><li>不会老化 </li></ul><ul><li>逻辑产品 ( 智力、无形 ) </li></ul><ul><li>维护困难和复杂 </li></ul><ul><li>生产只需复制 </li></ul><ul><li>软件开发性质如成本、进度等难以估计 </li></ul><ul><li>软件的开发更加依赖于开发人员的业务素质、智力、人员的合作、组织和管理 </li></ul>
    15. 15. 软件工程概述 <ul><li>主要内容 </li></ul><ul><li>软件 </li></ul><ul><li>软件工程 </li></ul><ul><li>软件工程与计算机科学的区别 </li></ul><ul><li>软件工程与计算机系统工程 </li></ul>
    16. 16. 软件工程概述 <ul><li>软件工程: 软件工程是用工程、科学和数学的原则与方法研制、维护计算机软件的有关技术及管理方法。 </li></ul><ul><li>首次提出: 1968 年,北大西洋公约组织在原西德召开计算机科学会议,由 Fritz Bauer 首次提出了“软件工程”的概念。 </li></ul><ul><li>提出背景: 解决软件危机。 </li></ul>
    17. 17. 软件工程概述 <ul><li>软件危机 </li></ul><ul><li>什么是软件危机 </li></ul><ul><li>软件危机的表现 </li></ul><ul><li>软件危机的根源 </li></ul><ul><li>软件危机的解决途径 </li></ul>
    18. 18. 软件工程概述 <ul><li>软件危机: 软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。 </li></ul><ul><li>两个主要问题 </li></ul><ul><li>如何开发软件,以满足对软件的日益增长的需求。 </li></ul><ul><li>如何维护数量不断膨胀的已有软件。 </li></ul>
    19. 19. 软件工程概述 <ul><li>软件危机的表现 </li></ul><ul><li>软件成本高 </li></ul><ul><li>IBM 360 OS, 5000 多人年,耗时 4 年 (1963 - 1966) ,花费 2 亿多美元 </li></ul><ul><li>美国空军: 1955 年软件占总费用 ( 计算机系统 ) 的 18% , 70 年 60% , 85 年达到 85 % </li></ul><ul><li>美国全球军事指挥控制系统,硬件 1 亿美元,软件高达 7.2 亿美元 </li></ul>
    20. 20. 软件工程概述 <ul><li>软件质量得不到保证 </li></ul><ul><li>软件应用面的扩大:科学计算、军事、航空航天、工业控制、企业管理、办公、家庭 </li></ul><ul><li>软件越来越多的应用于安全犹关 (safety critical) 的系统,对软件质量提出更高的要求 </li></ul><ul><li>80 年代欧洲亚丽安娜火箭的发射失败,原因是软件错误 </li></ul><ul><li>美国阿托拉斯火箭的发射失败,原因是软件故障 </li></ul>
    21. 21. 软件工程概述 <ul><li>英国 1986 年开发的办公室信息系统 Folios 经 4 年,因性能达不到要求, 1989 年取消 </li></ul><ul><li>日本第 5 代机因为软件问题在投入 50 亿美元后于 1993 年下马 </li></ul>
    22. 22. 软件工程概述 <ul><li>软件进度难以控制 </li></ul><ul><li>项目延期比比皆是 </li></ul><ul><li>由于进度问题而取消的软件项目较常见 </li></ul><ul><li>只有一小部分的项目能够按期完成 </li></ul>
    23. 23. 软件工程概述 <ul><li>软件维护非常困难 </li></ul><ul><li>软件维护的多样性 </li></ul><ul><li>软件维护的复杂性 </li></ul><ul><li>软件维护的副作用 </li></ul>
    24. 24. 软件工程概述 <ul><li>软件成本占系统总成本的比例逐年上升 </li></ul>软件、硬件成本变化趋势
    25. 25. 软件工程概述 <ul><li>软件危机的根源 </li></ul><ul><li>与软件本身的特点有关。 软件不同于硬件,它是计算机系统的逻辑部件而不是物理部件。在写出程序代码并在计算机运行之前,软件开发过程的进展情况较难衡量,软件开发的质量也较难评价。因此,管理和控制软件开发过程相当困难。 </li></ul><ul><li>软件不易于维护。 软件维护通常意味着改正或修改原来的设计,客观上使软件较难维护。软件不同于一般程序,它的规模大,不易于维护。 </li></ul>
    26. 26. 软件工程概述 <ul><li>在软件开发过程中,或多或少地采用了错误的方法和技术。 </li></ul><ul><li>对用户需求没有完整准确的认识,就匆忙着手编写程序。 </li></ul>
    27. 27. 软件工程概述 <ul><li>软件危机的解决途径 </li></ul><ul><li>技术措施: 使用更好的软件开发方法和开发工具。 </li></ul><ul><li>组织管理措施: 软件开发不是某种个体劳动的神秘技巧,而应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目。 </li></ul>
    28. 28. 软件工程概述 <ul><li>软件工程三要素 </li></ul><ul><li>方法: 软件工程方法是完成软件工程项目的技术手段,它支持项目计划和估算、系统和软件需求分析、软件设计、编码、测试和维护。 </li></ul><ul><li>工具: 软件工程使用的工具是人类在开发软件的活动中智力和体力的扩展和延伸,它自动或半自动地支持软件的开发和管理、支持各种软件文档的生成。 </li></ul>
    29. 29. 软件工程概述 <ul><li>过程: 软件工程中的过程贯穿于整个工程的各个环节,在这一过程中,管理人员应对软件开发的质量、进度、成本等进行评估、管理和控制,包括计划跟踪与控制、成本估算、人员的组织、质量保证、配置管理等。 </li></ul>
    30. 30. 软件工程概述 结构化程序开发 面向对象开发 分布式对象 / 系统 基于构件的开发 面向服务的开发 <ul><li>软件开发方法的演化 </li></ul>
    31. 31. 软件工程概述 操作 对象 消息 <ul><li>面向对象开发 </li></ul>对象 对象 面向对象编程范型的 3 个基本特征:封装、继承和多态。 数 据 数 据 数 据
    32. 32. 软件工程概述 <ul><li>基于构件开发: 指以构件的创建,构件的管理以及复用已有的构件组装形成应用为基本活动的开发方法。目前有代表性的构件规范有 COM/DCOM 、 EJB 和 CORBA 。 </li></ul>构件: 模块化的、可部署、可替换的软件系统组成部分,它封装了内部的具体实现并对外提供一组接口。 数据 对象 数据 数据 消息 对象 构件的接口
    33. 33. 软件工程概述 服务 1 服务 2 服务 3 服务 4 异构系统的功能被封装为服务以方便复用 <ul><li>面向服务的开发: 指以服务的创建、服务的管理以及复用已有的服务组装形成应用为基本活动的开发方法。面向服务的编程技术 Web Service 、 BPEL 、 SCA 等。 </li></ul>服务: 是自治、开放、自描述、与实现无关的网络构件。 服务层 应用 1(J2EE) 应用 2(.Net) 应用 3(Legacy) 应用层
    34. 34. 软件工程概述 <ul><li>软件工程中涉及到的人员 </li></ul>客户 发起系统 开发人员 客户 构建系统 使用系统 需要的资金 合同契约 需要 软件系统 客户 (Customer) : 是为将要开发的软件系统支付费用的公司、组织或个人。 开发人员 (Developer) : 是为客户构建软件系统的公司、组织或个人,其中包括任何协调并指导程序员和测试人员的管理人员。 用户 (User): 是将实际使用系统的人,包括坐在终端前的人、提交数据的人和阅读输出的人。
    35. 35. 软件工程概述 <ul><li>软件工程的目标 </li></ul><ul><li>可修改性 (modifiability) : 容许对系统进行修改而不增加原系统的复杂性。 </li></ul><ul><li>有效性 (efficiency) : 指软件系统的时间和空间效率。 </li></ul><ul><li>可靠性 (reliability) : 能够防止因概念、设计和结构等方面的不完善造成软件系统失效,具有挽回因操作不当造成软件系统失效的能力。 </li></ul>
    36. 36. 软件工程概述 <ul><li>可理解性 (understandability) : 系统具有清晰的结构,能直接反映问题的需求。 </li></ul><ul><li>可维护性 (maintainability) : 软件产品交付用户使用后,能够对它进行修改,以便改正潜在的错误和其它属性,使软件产品适应环境变化等方面工作的难易程度。 </li></ul><ul><li>可重用性 (reusability) : 是指软件可以在多种场合使用的程度。 </li></ul><ul><li>可适应性 (adaptability) : 软件在不同系统约束条件下,使用户需求得到满足的难易程度。 </li></ul>
    37. 37. 软件工程概述 <ul><li>可移植性 (portability) : 软件从一个计算机系统或环境搬到另一个计算机系统或环境的难易程度。 </li></ul><ul><li>可追踪性 (traceability) : 根据软件需求对软件设计、程序进行正向追踪,或者根据程序、软件设计对软件需求进行逆向追踪的能力。 </li></ul><ul><li>可互操作性 (interoperability) : 多个软件元素相互通信并协同完成任务的能力。 </li></ul>
    38. 38. 软件工程概述 <ul><li>软件工程技术发展的一种途径 </li></ul>屏蔽计算机硬件的异构性发展了操作系统 屏蔽应用软件和开发平台之间的差异产生了体系结构 / 框架 / 设计模式 屏蔽操作系统之间和编程语言之间的异构性出现了支撑软件和中间件 屏蔽不同中间件之间的异构性发展了 Web 服务 LINIX UNIX Windows Fortran Java Application .Net/COM J2EE/EJB Web service Architecture framework design pattern Support software  middleware C/C++
    39. 39. 软件工程概述 <ul><li>软件工程技术发展的一种途径 </li></ul>LINIX UNIX Windows Fortran Java Application .Net/COM J2EE/EJB Web service Architecture framework design pattern Support software  middleware C/C++
    40. 40. 软件工程概述 <ul><li>主要内容 </li></ul><ul><li>软件 </li></ul><ul><li>软件工程 </li></ul><ul><li>软件工程与计算机科学的区别 </li></ul><ul><li>软件工程与计算机系统工程 </li></ul>
    41. 41. 软件工程概述 <ul><li>软件工程与计算机科学的区别 </li></ul><ul><li>计算机科学研究的是构成计算机和软件系统基础的有关理论和方法。 </li></ul><ul><li>软件工程研究软件制作中的一些实际问题。 </li></ul><ul><li>软件工程应以计算机科学理论作为基础。 </li></ul><ul><li>软件工程是一门实践性比较强的学科。对于实际、复杂的问题,计算机科学的经典理论不可能总是适用的,这时需要软件工程的方法来解决。 </li></ul>
    42. 42. 软件工程概述 <ul><li>主要内容 </li></ul><ul><li>软件 </li></ul><ul><li>软件工程 </li></ul><ul><li>软件工程与计算机科学的区别 </li></ul><ul><li>软件工程与计算机系统工程 </li></ul>
    43. 43. 软件工程概述 <ul><li>软件工程与计算机系统工程 </li></ul><ul><li>系统: 系统是一组相互关联、能在一起工作从而达到某个目标的相关元素的集合。 </li></ul><ul><li>计算机系统: 通过处理信息来完成某些预定义目标而组织在一起的元素的集合或排列。 </li></ul><ul><li>计算机系统构成要素: 软件 (Software) 、硬件 (Hardware) 、人 (People) 、数据库 (Database) 、文档 (Document) 、过程 (Procedure) 。 </li></ul>
    44. 44. 软件工程概述 系统 过程 硬件 软件 人 数据库 文档 输入 输出 基于计算机的系统要素
    45. 45. 软件工程概述 <ul><li>计算机系统工程: 是指与构造基于计算机系统有关的过程、方法和技术。 </li></ul><ul><li>硬件工程 </li></ul><ul><li>软件工程 </li></ul><ul><li>人机交互工程 </li></ul><ul><li>数据库工程 </li></ul>
    46. 46. 主要内容 5 6 3 7 8 2 4 9 软件测试 软件维护 软件工程概述 软件编码 软件设计 软件需求分析 软件质量管理 软件工程管理 1 软件开发模型
    47. 47. 软件开发模型 <ul><li>本章主要内容 </li></ul><ul><li>软件生存周期 </li></ul><ul><li>软件开发模型 </li></ul><ul><li>开发模型选用实例 </li></ul>
    48. 48. 软件开发模型 <ul><li>软件生存周期 </li></ul><ul><li>软件生存周期: 软件从定义开始,经过开发、使用和维护直到最终退役的全过程称为软件生存周期。 </li></ul><ul><li>典型的软件生存周期分为: </li></ul><ul><li>计划时期:问题定义、可行性研究 </li></ul><ul><li>开发时期:需求分析、软件设计、编码、测试 </li></ul><ul><li>运行时期:软件维护 </li></ul>
    49. 49. 软件开发模型 需求分析 软件设计 编码 维护 测试 问题定义 可行性研究 计划时期 开发时期 维护时期
    50. 50. 软件开发模型 <ul><li>软件开发模型 </li></ul><ul><li>软件开发模型: 一个软件项目开发和维护的总体过程思路的框架。 </li></ul><ul><li>软件开发模型作用: </li></ul><ul><li>指出了软件开发过程各阶段之间的关系和顺序; </li></ul><ul><li>为软件开发过程提供原则和方法; </li></ul><ul><li>为软件工程管理提供里程碑和进度表。 </li></ul>
    51. 51. 软件开发模型 <ul><li>主要的软件开发模型 </li></ul><ul><ul><li>传统的软件开发模型 </li></ul></ul><ul><ul><li>软件演化模型 </li></ul></ul><ul><ul><li>面向对象开发模型 </li></ul></ul><ul><ul><li>形式化方法模型 </li></ul></ul><ul><ul><li>基于构件的软件开发模型 </li></ul></ul>
    52. 52. 软件开发模型 <ul><li>瀑布模型 (Waterfall Model) </li></ul><ul><li>是 W.Royce 于 1970 年提出。在瀑布模型中,各阶段的工作顺序展开。 </li></ul><ul><li>瀑布模型的特征 </li></ul><ul><li>阶段间的顺序性和依赖性 </li></ul><ul><li>推迟实现观点: 需求分析  软件设计  编码 </li></ul><ul><li>质量保证观点: 每一阶段都要完成规定文档,没有完成文档,就认为没有完成该阶段的任务;每一阶段都要对已有的文档进行复审,以便尽早发现问题,消除隐患。 </li></ul>
    53. 53. 软件开发模型 用户要求 需求分析 需求规格说明 总体设计 软件结构图 详细设计 模块说明 编码 程序清单 单元测试 综合测试 确认测试 系统测试 <ul><li>瀑布模型的阶段和文档 </li></ul>
    54. 54. 软件开发模型 <ul><li>瀑布模型存在问题 </li></ul><ul><li>软件开发的初始阶段指明软件系统的全部需求是困难的,有时甚至是不现实的。 </li></ul><ul><li>需求确定以后,用户和软件项目负责人要等到相当长的时间 ( 设计  实现  测试  运行 ) 才能得到一份软件的最初版本。如果用户对这个软件提出比较大的修改意见,那么软件项目将会受到巨大的人力、财力和时间方面的损失。 </li></ul>
    55. 55. 软件开发模型 <ul><li>快速原型模型 (Rapid Prototype Model) </li></ul><ul><li>原型: 是一个部分开发的产品,它使客户和开发人员能对计划开发的系统来实现一小部分关键需求,以确保需求是一致的、可行和符合实际的。 </li></ul><ul><li>快速原型模型: 首先建立一个能够反映用户主要需求的原型,让用户实际看一看未来系统的概貌,以便判断哪些功能是符合需求的,哪些还需要改进。然后将原型反复改进,最终建立完全符合用户要求的新系统。 </li></ul>
    56. 56. 软件开发模型 需求分析 原型评价 最终系统设计 最终系统实现 原型开发 规格说明 可运行原型 用户反馈 <ul><li>快速原型模型的生存周期模型 </li></ul>
    57. 57. 软件开发模型 <ul><li>建立快速原型的方法: </li></ul><ul><li>原型系统仅包含未来的主要功能以及系统的重要接口。 </li></ul><ul><li>原型系统充分展示软件的可见部分,如数据的输入方式、人机界面、数据的输出格式。 </li></ul><ul><li>为了尽快向用户提供原型,开发原型系统时应尽量使用能缩短开发周期的语言和工具。 </li></ul><ul><li>将原型系统作为基础,通过补充与修改获得最终的实际系统。 </li></ul>
    58. 58. 软件开发模型 <ul><li>阶段化开发模型 </li></ul><ul><li>循环周期: 从编写需求文档到系统交付的时间称为循环周期。 </li></ul><ul><li>减少循环周期的方法: 阶段化开发。 </li></ul><ul><li>阶段化开发方法: 使用阶段化开发方法设计系统时,能够使其一部分一部分地交付,从而在系统其余部分正在开发的同时,用户已经获得了一部分功能。因此,通常会存在两个并行的系统: 运行系统或产品系统和开发系统 。 </li></ul>
    59. 59. 软件开发模型 构建发布 1 构建发布 2 构建发布 3 发布 1 发布 2 发布 3 开发系统 (Development System) 开发人员 用户 时间 准备用来替换现行产品系统的下一个版本 产品系统 (Production System) 当前正在被客户和用户所使用的系统 <ul><li>阶段开发模型的生存周期模型 </li></ul>
    60. 60. 软件开发模型 增量开发 (Incremental Development) 迭代开发 (Iterative Development) 在增量开发中,需求文档中指定的系统按照功能划分为子系统。定义发布时首先定义一个小的功能子系统,然后在每一个新的发布中增加新功能。 迭代开发是在一开始就提交一个完整的系统,然后在每一个新的发布中改变每个子系统的功能 <ul><li>增量开发和迭代开发 </li></ul>
    61. 61. 软件开发模型 <ul><li>采用阶段化开发方法的原因 </li></ul><ul><li>即使还缺少某些功能,但在早期的发布中就可以开始培训。培训过程可以使开发人员观察某些功能的如何执行的,并为后面的发布提供改进的建议。这样开发人员可以很好地对用户的反馈做出反应; </li></ul><ul><li>可以及早地为那些以前从未提供的功能开拓市场; </li></ul><ul><li>当运行系统出现未预料到的问题时,经常性的发布可以使开发人员能全面、快速地修复这些问题; </li></ul><ul><li>针对不同的发布版本,开发团队将重点放在不同的专业领域技术上。 </li></ul>
    62. 62. 软件开发模型 <ul><li>螺旋模型 (Spiral Model) </li></ul><ul><li>螺旋模型: 在瀑布模型和快速原型模型的基础上增加了风险分析。 螺旋模型是一类迭代模型,每迭代一次,螺旋线就前进一周。 </li></ul><ul><li>螺旋模型步骤: </li></ul><ul><li>确定目标、选择方案,设定约束条件,选定完成本周期所定目标和策略; </li></ul>
    63. 63. 软件开发模型 <ul><li>分析该策略可能存在的风险。必要时通过一个原型来确定风险的大小,然后据此决定是按原定目标执行,还是修改目标或终止项目; </li></ul><ul><li>在排除风险后,实现本螺旋周期的目标; </li></ul><ul><li>最后一步是评价前一阶段的结果,并且计划下一轮的工作。 </li></ul>
    64. 64. 软件开发模型 确定目标、可选方案及约束 操作概念 预算 1 预算 2 预算 3 预算 4 风险分析 1 需求、生命周期计划 约束 1 约束 2 约束 3 约束 4 风险分析 2 风险分析 3 风险分析 4 原型 1 原型 2 原型 3 原型 4 软件需求 经确认的需求 开发计划 软件设计 评估方案,明确并排除风险 可选方案 2 可选方案 1 可选方案 3 可选方案 4 计划下一阶段 集成和测试计划 开发验证下一级产品 经确认的设计 详细设计 编码 单元测试 系统测试 验收测试 实施计划 评审约定部分 累计费用 <ul><li>螺旋模型的生存周期模型 </li></ul>
    65. 65. 软件开发模型 <ul><li>面向对象开发模型 </li></ul><ul><li>面向对象编程语言 </li></ul><ul><li>20 世纪 60 年代 : Simula67 </li></ul><ul><li>20 世纪 80 年代 : Smalltalk </li></ul><ul><li>20 世纪 90 年代 : C++ 、 Java </li></ul><ul><li>面向对象建模语言 </li></ul><ul><li>统一建模语言 (UML) </li></ul>
    66. 66. 软件开发模型 <ul><li>面向对象的基本概念 </li></ul><ul><li>对象: 对象是对现实世界中个体或事物的抽象表示,是它的属性和相关操作的统一封装体。属性表示对象的性质,属性值规定了对象所有可能的状态。对象的操作是指该对象可以展示的外部服务。 </li></ul><ul><li>类: 类用于表示某些对象的共同特征 ( 属性和操作 ) ,对象是类的实例。 </li></ul><ul><li>继承关系: 它是现实世界中遗传关系的直接模拟,可以来表示类之间的内在联系以及对属性和操作的共享。子类可以沿用父类的某些特征,同时子类也可以具有自己独立的属性和操作。 </li></ul>
    67. 67. 软件开发模型 <ul><li>整体 - 部分关系: 分为聚合和组合。聚合表示对象之间松散整体 - 部分关系,例如,计算和外设置之间的关系。组合表示对象之间强的整体 - 部分关系,例如,树和树叶之间的关系。 </li></ul><ul><li>消息: 消息传递是对象与其外部世界相互关联的唯一途径。对象可以向其他对象发送消息以请求服务,也可以响应其他对象传来的消息,完成自身固有的某些操作,从而服务于其他对象。 </li></ul>
    68. 68. 软件开发模型 将新构件 存入库中 标志候选构件 在构件库中 查找构件 进行下一次 迭代 构造构件 是否存在 构件? 是 否 计划 风险分析 用户通信 产品开发与发布 用户评估 提取构件 <ul><li>构件集成模型 (Component Integration Model) </li></ul>
    69. 69. 软件开发模型 UP 的历史 Rational 统一过程 (RUP) 是 IBMUP 的商业版本。 RUP 是 UP 的扩展。 <ul><li>统一过程 (Unified Process, UP) 模型 </li></ul>
    70. 70. 软件开发模型 需求 分析 设计 实现 测试 迭代 评估 计划 项目相关 其他活动 UP 中 5 个核心工作流 其它工作流 需求 : 捕获系统应该做什么 分析 : 精化和结构化需求 设计 : 在系统架构内实现需求 实现 : 构造软件 测试 : 验证实现是否如期望那样工作
    71. 71. 软件开发模型 第 1 次 迭代 第 2 次 迭代 第 n-1 次迭代 初始 细化 构造 移交 需求 第 n 次 迭代 分析 设计 实现 测试 随着项目按 UP 的阶段进展,每个核心工作流的工作量发生变化
    72. 72. 软件开发模型 与需求比 较后修正 形式化 规格说明 形式化开发记录 变换 n 变换 2 变换 1 测 试 系统 需求 目标 系统 <ul><li>转换模型 (Transformation Model) </li></ul>
    73. 73. 软件开发模型 计算无关模型 (CIM) 平台独立模型 (PIM) 代码 (Code) 平台相关模型 (PSM) PIM 是独立于任何底层平台的 ( 例如, EJB, .Net) 、表达软件系统业务语义的模型。 PSM 包含了所有在 PIM 中表达的功能,并且还添加了针对实现平台的设计思想。 软件系统 (Software System) 映射 产生 部署 <ul><li>模型模型的体系结构 (Model Driven Architecture, MDA) </li></ul>CIM 是非常高级层次的抽象模型,它以一种独立于计算机的方式捕获了系统的关键需求以及问题域的词汇。
    74. 74. 软件开发模型 <ul><li>开发模型选用实例 </li></ul><ul><li>教材购销系统 </li></ul><ul><li>根据学校的教学计划,向选课的学生及时供应所需教材。 </li></ul><ul><li>根据缺书登记补充采购所缺的教材,通知学生补售。 </li></ul>
    75. 75. 主要内容 5 6 3 7 8 2 4 9 软件测试 软件维护 软件工程概述 软件编码 软件设计 软件需求分析 软件质量管理 软件工程管理 1 软件开发模型
    76. 76. 软件需求分析 <ul><li>主要内容 </li></ul><ul><li>需求分析的任务与步骤 </li></ul><ul><li>需求获取的常用方法 </li></ul><ul><li>分析建模 </li></ul><ul><li>结构化分析方法 </li></ul><ul><li>软件需求说明 </li></ul>
    77. 77. 软件需求分析 <ul><li>需求分析的任务 </li></ul><ul><li>建立分析模型 (Analysis Model) </li></ul><ul><li>分析模型: 分析模型是描述软件需求的一组模型。 </li></ul><ul><li>分析模型的作用 </li></ul><ul><ul><li>记录用户对原始问题和目标软件的描述; </li></ul></ul><ul><ul><li>帮助分析人员发现用户需求中的不一致,排除不合理的部分,挖掘潜在的用户需求; </li></ul></ul><ul><ul><li>形成需求说明、进行软件设计的基础。 </li></ul></ul>
    78. 78. 软件需求分析 <ul><li>编写需求规格说明 (Software Requirement Specification, SRS) </li></ul><ul><li>软件需求规格说明: 是软件开发人员在分析阶段需求完成的文档。 </li></ul><ul><li>软件需求规格说明的要求 </li></ul><ul><ul><li>准确性和一致性 </li></ul></ul><ul><ul><li>清晰性和没有二义性 </li></ul></ul><ul><ul><li>直观、易读和易于修改 </li></ul></ul>
    79. 79. 软件需求分析 <ul><li>需求分析的步骤 </li></ul><ul><li>需求获取 </li></ul><ul><ul><li>分析系统所包含的数据; </li></ul></ul><ul><ul><li>确定软件功能需求和界面需求; </li></ul></ul><ul><ul><li>确定质量需求。 </li></ul></ul><ul><li>需求提炼:分析建模 </li></ul><ul><ul><li>结构化分析模型 ( 数据流图、实体关系图、控制流图、状态转换图等 ) ; </li></ul></ul><ul><ul><li>面向对象分析模型 ( 用例图、类图、交互图等 ) 。 </li></ul></ul>
    80. 80. 软件需求分析 <ul><li>需求描述:编写软件需求规格说明书 </li></ul><ul><ul><li>软件需求规格说明必须用统一的格式,例如,国际标准 IEEE 标准 830-1998 、中国国家推荐性标准 GB9385 ; </li></ul></ul><ul><ul><li>指明需求来源,例如客户要求、业务规范或政法规等。 </li></ul></ul><ul><li>需求验证 </li></ul><ul><ul><li>检查软件需求规格说明的正确性、一致性性、清晰性; </li></ul></ul><ul><ul><li>确保需求说明可以作为系统验收的依据。 </li></ul></ul>
    81. 81. 软件需求分析 <ul><li>实例 . 从用户调查中了解到某高校向学生销售教材的手续是:先由院办公室的张秘书开一购书证明,学生凭证明找教材科的王会计开购书发票,向李出纳交付书款,然后到书库找保管领书。 </li></ul><ul><li>将上述手工操作流程改为计算机处理流程。 </li></ul>
    82. 82. 软件需求分析 (1) 通过对现实环境的调查研究,获取当前系统的具体模型。 学 生 张秘书 王会计 李出纳 赵保管 学 生 购书申请 购书证明 购书发票 领书单 书 学生购买教材的具体模型
    83. 83. 软件需求分析 <ul><li>(2) 分析需求,建立系统分析模型,包括当前系统模型和目标系统模型。 </li></ul><ul><li>去掉具体模型中的非本质因素,提炼出当前系统的逻辑模型。 </li></ul>审查有效性 学 生 开发票 开领书单 发书 学 生 购书单 有效购书单 发票 领书单 书 学生购买教材的逻辑模型
    84. 84. 软件需求分析 <ul><li>分析当前系统与目标系统的差别,建立目标系统的逻辑模型。 </li></ul>目标系统是一个使用计算机的系统。一般来说,它的功能比当前现行业务系统更强,不必也不应该完全模拟现行系统! 学 生 审查并开发票 开领书单 发书 学 生 购书单 发票 领书单 书 计算机售书系统的逻辑模型
    85. 85. 软件需求分析 <ul><li>(3) 整理综合需求,编写软件需求说明。 </li></ul><ul><li>(4) 验证需求,完善和补充目标系统的描述。 </li></ul><ul><li>通过目标系统的人 - 机界面,与用户一起确认目标系统功能,并且确定哪些功能交给计算机去做,哪些功能由人工完成。 </li></ul><ul><li>复审需求说明,补充迄今尚未考虑过的细节,例如系统的响应时间、增加出错处理等。 </li></ul>
    86. 86. 软件需求分析 学 生 审查并开发票 开领书单 学 生 购书单 发票 领书单 改进的计算机售书系统的逻辑模型 无效购书单
    87. 87. 软件需求分析 <ul><li>需求获取的常用方法 </li></ul><ul><li>常规的需求获取方法 </li></ul><ul><li>建立联合分析小组: 由用户、系统分析员和领域专家组成。 </li></ul><ul><li>客户访谈: 系统分析员深入现场,与用户方的业务人员进行多次交流。要做到“心中有数”、“了解客户”、“事先准备”。 </li></ul><ul><li>问题分析与确认: 多次访谈,每次及时整理有用内容,与用户确认最终方案。 </li></ul>
    88. 88. 软件需求分析 <ul><li>快速原型法在需求分析中的应用 </li></ul><ul><li>快速原型法在需求分析阶段作用: 确定软件系统外部行为和特征。 </li></ul><ul><li>快速原型获取的需求 </li></ul><ul><ul><li>用户界面 </li></ul></ul><ul><ul><li>模拟系统的外部特征 </li></ul></ul>
    89. 89. 软件需求分析 <ul><li>结构化分析建模模型 </li></ul>数据 词典 数 据 流 图 实 体 关 系 图 状态转换图 加 工 控 制 规 规 格 格 说 说 明 明 数 据 对 象 描 述 功能模型 行为模型 信息模型
    90. 90. 软件需求分析 <ul><li>结构化分析建模模型 </li></ul>数据流图 (DFD) 指明系统中的数据是如何流动和变换的,以及描述使用数据流进行变换的功能 . 在 DFD 中出现的每个功能的描述写在加工规格说明 (PSPEC) 中 . 状态转换图 (STD) 用于指明系统在外部事件的作用下将会如何动作,表明了系统的各种状态以及各种状态之间的变迁 . 控制规格说明 (CSPEC) 描述了控制方面的附加信息 . 数据字典 (DD) 是系统所涉及的各种数据对象的总和 . 实体关系图 (E-RD) 描述数据对象之间的关系 . 在 E-R 图中出现的每个数据对象的属性均可用数据对象说明 (DOSPEC) 来描述 . 数据 词典 数 据 流 图 实 体 关 系 图 状态转换图 加 工 控 制 规 规 格 格 说 说 明 明 数 据 对 象 描 述 功能模型 行为模型 信息模型
    91. 91. 软件需求分析 <ul><li>结构化分析模型的组成与描述工具 </li></ul><ul><li>数据流图 (DFD) 、数据字典 (DD) 和加工规格说明 (PSPEC) : 这是是早期结构化分析模型的基本组成成分; </li></ul><ul><li>控制流图 (CFD)/ 状态转换图 (STD) 、控制规格说明 (CSPEC) : 这是是早期结构化分析模型的扩展成分,用以适应实时软件的建模需求。 </li></ul><ul><li>实体关系图 (ER)/IDEF1X 模型: 适用于具有复杂数据结构的软件软件模型。 </li></ul>
    92. 92. 软件需求分析 <ul><li>数据流图 (Data Flow Diagram, DFD) </li></ul><ul><li>数据流图: 数据流图是用来刻画数据流和加工的信息系统建模技术。数据流图也称为泡泡图 (Bubble Chart) 、变换图 (Transformation Graph) 或过程模型 (Process Model) 。 </li></ul>加工 / 转换 / 处理 数据流 实体 数据存储 DFD 图的基本符号
    93. 93. 软件需求分析 <ul><li>数据流 (Data Flow) : 数据流是带有箭头的数据流向,表示数据元素的运动方向。 </li></ul><ul><li>数据流是一组成分固定的数据组成的。每一个数据流必须有一个合适的名字。为数据流命名时,可以从其组成成分或含义角度来考虑。 </li></ul><ul><li>数据流可以从加工流向加工,从加工流向数据存储或从数据存储流向加工,也可以数据源点流向加工或从加工流向数据终点。两个加工之间可以有几股数据流。 </li></ul>
    94. 94. 软件需求分析 检查取款单合理性 取款单 合理取款单 不合理取款单 账目  生产 统计 生产日报 生产月报 生产统计报表 +
    95. 95. 软件需求分析 <ul><li>加工 (Process) : 加工表示要执行的一个功能,如检查取款单合理性、生产、统计等。 </li></ul><ul><li>加工是对数据进行的操作,如果把数据流比喻为工厂的传送带,则加工就好像工厂里的加工工序。 </li></ul><ul><li>每个加工都要有一个确定的名称来命名,名称的选取要能够反映加工的主要功能。如果加工命名发生困难,则加工中可能还包含几种类型不同的加工,需要进一步进行分解。 </li></ul><ul><li>每个加工一般有一个编号,编号说明该处理在层次分解中的位置。 </li></ul>
    96. 96. 软件需求分析 <ul><li>加工通常以下列方式处理数据: </li></ul><ul><li>只改变数据流的状态,但不改变数据流的结构。 </li></ul><ul><li>例如,加工 “检查取款单的合理性” 用来检查每一个取款单是否合理。如果取款单合理,传送一个“合理取款单”数据流,如果不合理,则传送一个“不合理取款单”数据流,“合理取款单”和“不合理取款单”的组成成分完全一样,都是取款单,只是状态发生了变化。 </li></ul>
    97. 97. 软件需求分析 <ul><li>将一种数据流转换为另一种数据流,即数据流的结构发生了变化。 </li></ul><ul><li>例如,输入数据流“生产日报”或“生产月报”经过加工“统计”后变成输出数据流“生产统计报表”,显然,传入、传出的数据流的组成发生了变化。 </li></ul>生产 统计 生产日报 生产月报 生产统计报表 +
    98. 98. 软件需求分析 <ul><li>实体 (Entity) : 也称为外部项,它既可以作为数据流的源,也可以作为数据流终点。 </li></ul>数据流 源点 数据流 终点 学 生 审查并开发票 开领书单 学 生 购书单 发票 领书单 无效购书单
    99. 99. 软件需求分析 <ul><li>数据存储 (Data Store) : 表示数据的存储位置,用双杠表示。数据存储和加工之间的箭头有指向数据存储、背离数据存储和双向三种 : </li></ul><ul><li>(1) 如果加工要读数据,则数据是从数据存储流出; </li></ul><ul><li>(2) 如果加工要写或修改数据,则数据流是流向数据存储; </li></ul><ul><li>(3) 如果加工既要读数据,又要写数据,则数据流是双向的。 </li></ul>
    100. 100. 软件需求分析 <ul><li>数据流之间的关系: 与关系 ( 用“ *” 表示 ) 、或关系 ( 用” +” 表示 ) 、互斥关系 ( 用“  ”表示 ) 。 </li></ul>互斥关系 与关系 或关系 检查取款单合理性 取款单 合理取款单 不合理取款单 账目  生产 统计 生产日报 生产月报 生产统计报表 +
    101. 101. 软件需求分析 <ul><li>层次 DFD </li></ul><ul><li>对于一个大型的系统,如果用一张数据流图画出所有的数据流和加工,则图纸将极其庞大复杂,因而难于理解。 </li></ul><ul><li>为了达到简单性要求,通常采用层次或自顶向下分解的方法,将系统 DFD 中的每一个加工视为一个子系统,然后继续向下分解,直到每一个加工容易理解为止,这就是结构化分析方法“自顶向下、逐步分解”的基本原则。 </li></ul>
    102. 102. 软件需求分析 <ul><li>分层 DFD 由:顶层、底层和中间层组成。 </li></ul><ul><li>(1) 顶层 DFD 说明系统边界,即系统的输入和输出数据流,顶层 DFD 只有一张。 </li></ul><ul><li>(2) 底层 DFD 由一些不可再分解的加工组成,这些加工称为基本加工。 </li></ul><ul><li>(3) 在顶层和底层之间的是中间层,中间层的 DFD 描述了某个加工的分解,而它的组成部分又要进一步分解。 </li></ul>
    103. 103. 软件需求分析 顶层 DFD <ul><li>教材购销系统的层次 DFD </li></ul>教材购销 系统 学 生 书库 保管员 购书单 领书单 缺书单 进书通知 第 2 层 DFD(0) 1 销售 学 生 书库 保管员 购书单 领书单 缺书单 进书通知 2 采购 F1 教材存量表 F2 缺书登记 进书通知
    104. 104. 软件需求分析 1.1 审查购书单有效性 学 生 购书单 无效购书单 领书单 发票 进书通知 第 3 层 DFD- 销售子系统 (1) 1.2 开发票 1.3 打印发票 1.4 登记售书 和打印 领书单 1.5 登记缺书 1.6 产生补 售书单 采 购 有效购书单 发票 学 生 暂缺书单 补售书单 F1 教材存量表 F2 缺书登记 F3 学生用书表 F4 售书登记表
    105. 105. 软件需求分析 销 售 进书通知 2.3 修改教材库存 和待购量 2.2 按出版社 统计缺书 2.1 按书号 汇总缺书 书库 保管员 缺书单 进书通知 第 3 层 DFD- 采购子系统 (2) F1 教材存量表 F2 缺书登记 F5 待购教材表 F6 教材一览表
    106. 106. 软件需求分析 <ul><li>数据字典 (Data Dictionary, DD) </li></ul><ul><li>数据:出现在软件中的数据可以分为 3 种情况: </li></ul><ul><li>(1) 只含有一个数据项 ( 或数据元素 ) ; </li></ul><ul><li>(2) 由多个相关数据项组成的数据流; </li></ul><ul><li>(3) 数据存储 ( 数据文件或数据库 ) 。 </li></ul>
    107. 107. 软件需求分析 <ul><li>数据字典:数据字典是对软件系统中的每个数据规定一个条目,以保持数据在系统中的一致性。 </li></ul><ul><li>数据字典用简洁、清晰、易理解的文字描述条目,说明数据流图的加工功能、性能、要求及设计约束等。 </li></ul><ul><li>数据流图与数据字典配套使用,完整地描述软件需求。 </li></ul>
    108. 108. 软件需求分析 <ul><li>数据流 </li></ul><ul><li>例如,发票是一个数据流,其条目内容与书写格式如下表所示。 </li></ul>数据项名称 数据流“发票”字典条目 备 注: 组 成: 学号 + 姓名 +{ 书号 + 单价 + 数量 + 总价 }+ 书 费合计 别 名: 购书发票 数据流名: 发票
    109. 109. 软件需求分析 <ul><li>数据文件 </li></ul><ul><li>例如,各班学生用书表是一个数据文件,其条目内容与书写格式如下表所示。 </li></ul>数据文件“各班学生用书表”字典条目 组 织: 按系、专业和班编号从小到大排列 备 注: 组 成: { 系编号 + 专业和班编号 + 年级 +{ 书号 }} 别 名: 文 件 名: 各班学生用书表
    110. 110. 软件需求分析 <ul><li>数据项: 无论是独立的或者包含在数据流或文件中的数据项,一般都应在字典中设置相应的条目。 </li></ul>数据项“年级”的条目 备 注: 取值及含义: F-freshman, 一年级 M-sophomore, 二年级 J-junior ,三年级 S-senior ,四年级 别 名: 数据项名: 年级
    111. 111. 软件需求分析 数据项“数量”的条目 数据项“书费合计”的条目 备 注: 取 值: 正整数 别 名: 购书量 数据项名: 数量 备 注: 取 值: 00.00-99.99 别 名: 数据项名: 书费合计
    112. 112. 软件需求分析 <ul><li>在字典中使用 = 、 + 、 | 、 {} 、 () 等符号和注释符“ *……*” 将数据流或数据文件写成公式形状的定义。 </li></ul><ul><li>符号含义 </li></ul><ul><li>“ =” 表示等价于 ( 或定义为 ) </li></ul><ul><li>A+B 表示 A 和 B 的顺序连接 </li></ul><ul><li>A|B 表示 A 和 B 的选择连接 </li></ul><ul><li>{A} n 表示 n 个 A 的重复连接 </li></ul><ul><li>{} 表示可以重复数据 </li></ul><ul><li>() 表示可选数据 </li></ul>
    113. 113. 软件需求分析 <ul><li>例: </li></ul><ul><li>发票 =( 学号 )+ 姓名 +{ 发票行 }+ 书费合计 </li></ul><ul><li>发票行 = 书号 + 单价 + 数量 + 总价 </li></ul><ul><li>各班学生用书表 ={ 系编号 + 专业和班编号 + 年级 +{ 书号 }} </li></ul><ul><li>系编号 ={ 数字 } 2 * 两位数字,例如 01,12* </li></ul><ul><li>专业和班编号 ={ 数字 } 3 * 三位数字,例如 305* </li></ul><ul><li>年级 =F|M|J|S * 在 4 个字母中任选一个 * </li></ul><ul><li>书号 ={ 字母 }+{ 数字 } * 例如, Math11, Eng2 等 * </li></ul>
    114. 114. 软件需求分析 <ul><li>加工说明 (Process SPECification, PSPEC) </li></ul><ul><li>加工说明是对 DFD 中每个加工所作出的说明, PSPEC 是由输入数据、加工逻辑和输出数据等部分组成,加工逻辑阐明把输入数据转换为输出数据的策略,是加工说明的主体。 </li></ul><ul><li>加工说明的主要描述方法: </li></ul><ul><li>结构化语言 (Structured Language) </li></ul><ul><li>判定表 (Decision Table) </li></ul><ul><li>判定树 (Decision Tree) </li></ul>
    115. 115. 软件需求分析 <ul><li>结构化语言 </li></ul><ul><li>自然语言加上结构化的形式,就形成了结构化语言。 </li></ul><ul><li>结构化语言是一种介于自然语言与程序设计语言之间的语言,既具有结构化程序清晰易读的优点,由具有自然语言的灵活性,不受程序设计语言的严格的语法约束。 </li></ul><ul><li>结构化程序可以使用顺序、选择、循环等控制结构。结构化语言借用这些结构来描述加工,其形式简单,易于用户理解。 </li></ul>
    116. 116. 软件需求分析 <ul><li>判定表: 判定表采用表格化的形式,适合于表达含有复杂判断的加工逻辑。判定表和结构化语言可以配合使用。 </li></ul><ul><li>判定树: 判定树是判定表的图形表示,其适用场合与判定表相同。用户可以根据习惯,在两种中选用一种。 </li></ul>
    117. 117. 软件需求分析 <ul><li>例,某公司为推销人员制定了奖励办法,把奖金与推销金额及预定收款的数额挂钩。凡每周推销金额不超过 10000 元,按预收货款是否超过 50% ,分别奖励推销额的 6% 或 4% 。反之若推销金额超过 10000 元,则按预收货款是否超过 50% ,分别寄奖励推销额的 8% 或 5% 。对于月薪低于 1000 元的推销员,分别另发鼓励奖 300 、 200 和 500 、 300 元。 </li></ul><ul><li>判定表: 44 页的图 3.12 </li></ul><ul><li>判定树: 44 页的图 3.13 </li></ul>
    118. 118. 软件需求分析 <ul><li>加工说明的作用是说明“做什么”,而不是“怎么做”,因此对加工逻辑的描述不宜过细,过细就变成设计,使开发人员过早地卷入如何实现的细节,但是,需求说明又是软件设计的依据,如果过简,又会使设计人员无据可依。 </li></ul>
    119. 119. 软件需求分析 <ul><li>实体关系图 (Entity-Relationship Diagram, ERD) </li></ul><ul><li>实体关系图包括:数据对象、描述数据对象的属性以及数据对象之间的关系。 </li></ul><ul><li>数据对象: 是对软件必须理解的复合信息的表示。所谓复合信息是指一系列不同性质或属性的事物。 </li></ul><ul><li>属性: 定义了数据对象的性质。可以用属性来为数据对象的实例命名,描述该实例,引用另一数据对象的实例。 </li></ul><ul><li>关系: 数据对象之间相互连接的方式称为关系。 </li></ul>
    120. 120. 软件需求分析 <ul><li>实体关系图表示 </li></ul><ul><li>P.Chen 定义的符号 </li></ul>实体名称 实体表示 属性名称 属性表示 学生 成绩 示例 学生 学号 姓名 性别 专业 籍贯 示例
    121. 121. 软件需求分析 关系名称 关系表示 工程 零件 供应 供应商 1 m n 存储 仓库 1 m 示例
    122. 122. 软件需求分析 <ul><li>IDEF1X 模型 </li></ul><ul><ul><li>实体 </li></ul></ul><ul><ul><ul><li>独立标识实体 </li></ul></ul></ul><ul><ul><ul><li>依赖标识实体 </li></ul></ul></ul><ul><ul><li>关系 </li></ul></ul><ul><ul><ul><li>标识联接关系 </li></ul></ul></ul><ul><ul><ul><li>非标识联接关系 </li></ul></ul></ul><ul><ul><ul><li>分类关系 </li></ul></ul></ul><ul><ul><ul><li>非确定关系 </li></ul></ul></ul>
    123. 123. 软件需求分析 <ul><ul><li>属性 / 关键字 </li></ul></ul><ul><ul><ul><li>主关键字 </li></ul></ul></ul><ul><ul><ul><li>次关键字 </li></ul></ul></ul><ul><ul><ul><li>外来关键字 </li></ul></ul></ul>
    124. 124. 软件需求分析 <ul><li>实体: 表示具有相同属性或特征的一个现实或抽象事物的集合。实体的实例是实体抽象概念的一个具体的值。 </li></ul><ul><li>实体分为 </li></ul><ul><li>独立标识实体: 不依赖于其它实体存在的实体。 </li></ul><ul><li>依赖标识实体: 必须依赖于其它实体才能存在的实体,也称为丛属实体。 </li></ul>
    125. 125. 软件需求分析 实体名 / 实体号 实体名 / 实体号 独立实体表示符号 依赖实体表示符号 学生 /1 学生成绩 /2
    126. 126. 软件需求分析 <ul><li>属性: 属性表示实体的特征或性质。 </li></ul><ul><li>候选关键字: 候选关键字是由一个实体中的一个或多个属性组成,它唯一确定实体的每一个实例。 </li></ul><ul><li>主 / 次关键字: 每个实体至少有一个候选关键字。如果一个实体中有多个候选关键字,则制定其中的一个为主关键字,其它关键字为次关键字。 </li></ul>
    127. 127. 软件需求分析 实体名 / 实体号 属性名 [ 属性名 ] … [ 属性名 ](AK1) [ 属性名 ](AK2) [ 属性名 ](AK2) 主关键字属性 次关键字 雇员 /1 雇员号 身份证号码 (AK1) 雇员名 (AK2) 生日 (AK2) …
    128. 128. 软件需求分析 发票 /2 发票编号 学号 姓名 书费合计 发票行 /3 发票编号 发票行号 书号 单价 数量 总价 独立标识实体 依赖标识实体 ( 不能脱离发票而独立存在 )
    129. 129. 软件需求分析 <ul><li>确定联接关系: 是实体间的一种关系,在这种关系中被称为父实体的每一个实例与子实体的 0 、 1 或多个实例联接,子实体中的每个实例同父实体中的 0 或 1 个实例联接。 </li></ul><ul><li>标识联接关系: 在标识连接关系中,父实体的主关键字属于子实体的主关键字。 </li></ul><ul><li>非标识连接关系: 在非标识连接关系中,父实体的主关键字不属于子实体的主关键字。 </li></ul>
    130. 130. 软件需求分析 实体 A/1 关键字 A 实体 B/2 关键字 A(FK) 关键字 B 父实体 关系名 子实体 标识联接关系
    131. 131. 软件需求分析 零个、 1 个或多个 P 1 个或多个 Z 0 个或 1 个 n 只有 n 个 nm 有 n 到 m 个 (n) 参考注释中的说明 实体 A/1 关键字 A 实体 B/2 关键字 B 父实体 关系名 子实体 关键字 A(FK) 非标识联接关系
    132. 132. 软件需求分析 发票 /2 发票编号 学号 姓名 书费合计 发票行 /3 发票编号 发票行号 书号 单价 数量 总价 包含
    133. 133. 软件需求分析 <ul><li>分类关系: </li></ul>一般实体 分类实体 分类实体集 鉴别器 分类属性
    134. 134. 软件需求分析 <ul><li>分类关系分为: </li></ul><ul><li>完全分类关系: 完全分类关系是联接两个或多个实体之间的关系,在这些实体中,存在一个一般实体,它的每个实例恰好与一个且仅与一个分类实体的一个实例相联系。一般实体的每个实例和与之相关联的一个分类实体实例描述的是现实世界的同一事物。 </li></ul><ul><li>非完全分类关系: 它允许一般实体的一个实例不与任何分类实体的实例相联系,即对一般实体的分类是不完全的。 </li></ul>
    135. 135. 软件需求分析 一般实体 一般实体 鉴别器 分类实体 分类实体 鉴别器 完全分类关系 非完全分类关系
    136. 136. 软件需求分析 <ul><li>控制流图 (Control Flow Diagram, CFD) 与控制说明 (Control SPECification, CSPEC) </li></ul><ul><li>实时系统: 实时系统与现实世界的外部实体进行交互时具有鲜明的时间特性。其数据流应显式地区分为时间上连续的数据流和离散的数据流 ( 控制信号或事件 ) 。 </li></ul><ul><li>数据流图扩展: CFD 是为了适应实时系统的分析而提出来的,通常与 DFD 配合使用,目的是使分析员在用 DFD 和 PSPEC 表示数据流和加工的同时,也能够用 CFD 和 CSPEC 表示控制流和控制加工。 </li></ul>
    137. 137. 软件需求分析 <ul><li>CFD 与 DFD 的关系 </li></ul>DFD PSPEC CFD CSPEC 行为模型 过程模型 输入数据 输出数据 输入控制 输出控制 数据条件 加工激活信号
    138. 138. 软件需求分析 <ul><li>CFD 的符号: CFD 在 DFD 的基础上增加了两个符号控制流和被引用的控制说明。 </li></ul>处理 / 加工 数据流 实体 数据存储 CFD 的符号 控制流 被引用的控制说明
    139. 139. 软件需求分析 <ul><li>控制流: 采用带有箭头的虚线来表示,虚线箭头表示控制流从一个加工流向另一个加工的方向。虚线箭头旁边可以标注控制信息或事件,控制信息通常取布尔值或离散值。 </li></ul><ul><li>被引用的控制说明: 采用短竖线表示。控制说明主要用于描述:当事件或控制信息被感知时软件如何行动;作为事件发生的结果,哪些加工将被激活。 </li></ul>
    140. 140. 软件需求分析 对于实时系统,在创建了 DFD( 过程模型 ) 之后还必须创建 CFD( 行为模型 ) ,以便描述相关的事件以及系统状态在时间坐标系中的变迁。 例如,首先画出光电管采集 DFD 。
    141. 141. 软件需求分析 光电管 采集 计数 传送 工控机处理 班数据处理 实时数据显示 信号 半分钟数据 光电管采集 DFD 例如,首先画出光电管采集 DFD 。 半小时数据 班数据
    142. 142. 软件需求分析 在光电管采集 DFD 的基础上加上事件和控制信息,并加上控制说明的引用,即可得到光电管采集系统的 CFD 。 光电管采集 CFD 光电管 采集 计数 传送 工控机处理 班数据处理 实时数据显示 半小时数据 班数据 信号 半分钟数据 物品经过 某型号累加 无动作 半分钟 半小时 翻屏 人工驱动信息 时钟
    143. 143. 软件需求分析 <ul><li>结构化分析方法 </li></ul><ul><li>结构化分析就是使用 DFD 、 DD 、 ER/IDEF1X 、 PSPEC( 结构化语言、判定表、判定树 ) 、 CFD 、 CSPEC 和 STD 等建模语言来建立结构化规格说明的目标文档。 </li></ul><ul><li>结构化分析方法步骤 </li></ul><ul><li>由顶向下对系统进行功能分解,画出分层 DFD 图; </li></ul><ul><li>由后向前定义系统的数据和加工,编制 DD 和 PSPEC ; </li></ul><ul><li>编制需求规格说明书。 </li></ul>
    144. 144. 软件需求分析 <ul><li>画出分层数据流图 </li></ul><ul><li>由外向里绘制 DFD </li></ul><ul><ul><li>画出系统的输入输出数据流 </li></ul></ul><ul><ul><li>画出系统的内部 </li></ul></ul><ul><ul><li>画出加工的内部 </li></ul></ul><ul><li>由顶向下绘制 DFD : 绘制分层 DFD 时应该注意以下几个方面问题:编号、父图与子图的平衡、局部数据存储和局部外部数据存储、分解程度等。 </li></ul>
    145. 145. 软件需求分析 <ul><li>编号: 为了便于管理,需要按照以下规则为数据流图和其中的加工编号: </li></ul><ul><li>顶层 DFD 无图号,顶层加工不编号; </li></ul><ul><li>第二层 DFD 的图号为 0 ,第二层 DFD 中的加工编号为 1,2,…,n ; </li></ul><ul><li>第三层每个 DFD 的编号就是父图中加工的编号,第三层每个 DFD 中加工的编号由 DFD 图号、小数点和局部号构成,以下各层以此类推。 </li></ul>
    146. 146. 软件需求分析 1 2 0 A B A B V 图编号 1.1 1.2 1.3 A V M N 1 处理编号
    147. 147. 软件需求分析 教材购销系统 DFD
    148. 148. 软件需求分析 <ul><li>父图与子图的平衡: 父图中某个加工的输入输出数据流应该与相应子图的输入输出数据流相同,层次 DFD 的这种特点称为“平衡”。平衡是指子图的所有输入数据流必须是父图中相应加工的输入数据流,子图的所有输出数据流必须是父图中相应加工的输出数据流。 </li></ul>
    149. 149. 软件需求分析
    150. 150. 软件需求分析 <ul><li>局部数据存储和局部外部数据存储 </li></ul><ul><li>随着 DFD 图的分解,在下层 DFD 中允许出现父图中没有的数据存储和外部实体。 </li></ul><ul><li>除了底层 DFD 需要画出全部数据存储外,各中间层的 DFD 仅显示处于加工之间的接口数据存储,其余数据存储不必画出来,以保持图面的简洁。 </li></ul>
    151. 151. 软件需求分析 F5 和 F6 是采购子系统局部数据存储,与父图中的其它加工无关,所以在父图中不必画出。 F1 和 F2 是采购子系统与销售子系统之间的接口,所以在父图中必须画出。
    152. 152. 软件需求分析 <ul><li>分解程度 </li></ul><ul><li>分解应该自然,概念上合理、清晰; </li></ul><ul><li>只要不影响 DFD 的易理解性,可以适当地多分解,这样可以减少 DFD 的层数; </li></ul><ul><li>一般来说,在上层分解的快一些,而在下层则分解得慢些,这是因为约接近下层功能越具体,分解速度快会增加用户理解的困难; </li></ul><ul><li>每一加工分解的子加工一般不超过 7 个。 </li></ul>
    153. 153. 软件需求分析 <ul><li>确定数据定义与加工策略 </li></ul><ul><li>从最低 DFD 的数据终点开始,沿着 DFD 一步步向数据源点回朔,来分析每一个数据项的来龙去脉。 </li></ul>数据流: 领书单、发票、暂缺书单、购书单 ( 有效 / 无效 ) 、补售书单、进书通知。 数据存储: 教材存量表、缺书登记、学生用书表、售书登记 数据流: 缺书单、进书通知。 数据存储: 教材存量表、缺书登记、待购较教材表、教材一览表
    154. 154. 软件需求分析 <ul><li>需求分析复审 </li></ul><ul><li>父图与子图不平衡 </li></ul><ul><li>未区分局部文件和局部外部文件 </li></ul><ul><li>分解速度太快 </li></ul><ul><li>不遵守加工编号规则 </li></ul>
    155. 155. 软件需求分析 面向对象分析方法
    156. 156. 软件需求分析 <ul><li>统一建模语言 (unified Modeling language, UML) </li></ul>Booch : Booch 方法 Rumbaugh :对象建模技术 (OMT) Jackson : Jackson 方法
    157. 157. 软件需求分析 <ul><li>统一过程 (Unified Process , UP) </li></ul>UP 的历史 Rational 统一过程 (RUP) 是 IBMUP 的商业版本。 RUP 是 UP 的扩展。 <ul><li>统一过程 (Unified Process) </li></ul>
    158. 158. 软件需求分析 <ul><li>为什么称为统一 </li></ul><ul><ul><li>开发生命周期: UML 提供用于从需求分析工程到实现,贯穿整个软件开发生命周期的可视化建模语法。 </li></ul></ul><ul><ul><li>应用领域: UML 已经内应用于从关键实时嵌入式系统到管理决策支持系统中任何事物的建模。 </li></ul></ul><ul><ul><li>实现语言和平台: UML 独立于语言和平台。它不仅对纯粹 OO 语言 ( 例如 Java,C#) 据具有极好的支持,而且对于混合 OO 语言,如 C++ ,甚至非 OO 语言也同样有效。 </li></ul></ul>
    159. 159. 软件需求分析 <ul><ul><li>开发过程: 尽管统一过程 (UP) 及其变体可能是 OO 系统的首选开发过程, UML 能够支持很多其它软件工程过程。 </li></ul></ul><ul><ul><li>它本身内部概念: UML 在其内部概念的一个小集合的应用上,勇于尝试保持一致和统一。 </li></ul></ul>
    160. 160. 软件需求分析 <ul><li>UML 的结构 </li></ul>
    161. 161. 软件需求分析 逻辑视图 进程视图 实现视图 部署视图 用例视图 关注: 项目词汇表 功能 关注: 性能 伸缩性 吞吐量 关注: 系统装配 配置管理 关注: 系统拓扑 分发 移交 安装 <ul><li>UML 架构 (4+1 视图 ) </li></ul>图: 类图 复合结构图 对象图 包图 状态图 图: 组件图 图: 类图 复合结构图 对象图 图: 部署图 图: 用例图 交互图
    162. 162. 软件需求分析 <ul><li>UML 架构 (4+1 视图 ) </li></ul><ul><li>用例视图: 该视图把系统的基本需求捕获为一组用例以及提供构造其他视图的基础。 </li></ul><ul><li>逻辑视图: 捕获问题领域的词汇,作为类和对象集合。重点展示对象和类是如何组成系统、实现所需系统行为。 </li></ul><ul><li>进程视图: 建模系统中作为活动类的可执行线程和进程。 </li></ul>
    163. 163. 软件需求分析 <ul><li>UML 架构 (4+1 视图 ) </li></ul><ul><li>实现视图: 建模组成系统系统的物理代码的文件和组件。 </li></ul><ul><li>部署视图: 建模把组件物理地部署到一组物理的、可计算节点上,如计算机和外设上。 </li></ul>
    164. 164. 软件需求分析 <ul><li>用例图 </li></ul>
    165. 165. 软件需求分析 <ul><li>用例图: 是由主题 (Subject) 、用例 (Usecase) 、参与者 (Actor) 和关联 ( 执行者与用例、用例与用例、执行者与执行者 ) 组成。 </li></ul>用例 : 是参与者想要系统做的事情。 参与者 ( 角色 ): 说明当与系统直接交互时,一些外部实体采用的角色。 主题 ( 系统边界 ) : 定义由谁或什么 ( 即,参与者 ) 使用系统,系统能够为哪些参与者提供什么特定利益 ( 即,用例 ) 。
    166. 166. 软件需求分析 <ul><li>用例规格说明: </li></ul><ul><li>用例名称: 采用动词或者动词短语描述,通过用例的名称,业务读者能够清晰地知晓用例建模的业务功能或过程。 </li></ul><ul><li>用例 ID: 它唯一地标识项目中特定的用例。 </li></ul><ul><li>简要描述: 捕获用例的目的。 </li></ul><ul><li>参与者: 第一参与者 - 实际触发用例的那些参与者;第二参与者 - 在用例被触发之后,与用例进行交互的参与者。 </li></ul>
    167. 167. 软件需求分析 <ul><li>前置条件和后置条件: 前置条件说明在用例触发之前什么必须为真,后置条件说明在用例执行之后什么必须为真。 </li></ul><ul><li>主流: 用例中陈述性的、具有时序的步骤序列。 </li></ul><ul><li>附流: 主流的一串分支。通常表示异常、分支和中断的路径。 </li></ul>
    168. 168. 软件需求分析 用例名称 用例 ID 简要描述 参与用例的参与者 前置条件 主流 后置条件 附流
    169. 169. 软件需求分析 <ul><li>用例图中的关系 </li></ul><ul><li>参与者泛化: 一般参与者和特殊参与者之间的泛化关系。 </li></ul><ul><li>用例泛化: 一般用例和特殊用例之间的泛化关系。 </li></ul><ul><li>包含关系: 用例之间的关系,它允许一个用例包含另一个用例的行为。 </li></ul><ul><li>扩展关系: 用例之间的关系,它允许一个用例使用另一个用例中的一个或多个片段来扩展它的行为。 </li></ul>
    170. 170. 软件需求分析 <ul><li>参与者泛化: 一般参与者和特殊参与者之间的泛化关系。使用参与者泛化可以简化问题。 </li></ul>
    171. 171. 软件需求分析 一般参与者 参与者泛化 特殊者泛化
    172. 172. 软件需求分析 <ul><li>用例泛化: 一般用例和特殊用例之间的泛化关系。在用例泛化中,子用例是父用例的特殊形式,子用例可以: </li></ul><ul><li>从父用例那里继承特征; </li></ul><ul><li>添加新的特征; </li></ul><ul><li>覆写 ( 改变 ) 已继承的特征。 </li></ul>
    173. 173. 软件需求分析 Y Y Y 附流 Y Y Y 主流中的步骤 Y Y Y 后置条件 Y Y Y 前置条件 N Y Y 扩展点 N Y Y 关系 覆写 添加 继承 用例特性
    174. 174. 软件需求分析 一般用例 特殊用例 用例泛化 <ul><li>例:用例泛化 </li></ul>继承不改变 3.(3.) 继承和重复编号 6.2(6.1) 继承且覆写 1(o1) 继承、覆写及重编号 5.2(o5.1) 添加 6.3
    175. 175. 软件需求分析 继承不改变 3.(3.) 继承和重复编号 6.2(6.1) 继承且覆写 1(o1) 继承、覆写及重编号 5.2(o5.1) 添加 6.3
    176. 176. 软件需求分析 <ul><li>包含关系: 用例之间的关系,它允许一个用例包含另一个用例的行为。我们将包含用例称为基用例,把被包含用例称为内含用例,内含用例给它的基础用例提供行为。基础用例执行到包含点,那么执行传递给内含用例,当内含用例完成时,控制再次返回基础用例。 </li></ul>
    177. 177. 软件需求分析 基础用例 内含用例 包含关系
    178. 178. 软件需求分析 <ul><li>用例包含实例 </li></ul>
    179. 179. 软件需求分析 基础用例 包含用例
    180. 180. 软件需求分析 <ul><li>扩展关系: 用例之间的关系,它允许一个用例使用另一个用例中的一个或多个片段来扩展它的行为。基础用例提供了一组扩展点,扩展点是钩子,在此可以添加新的行为,扩展用例提供了一组插入片段,这些片段被插入到基础用例钩子位置。 </li></ul>
    181. 181. 软件需求分析 扩展用例 基础用例 扩展关系
    182. 182. 软件需求分析 基础用例 扩展用例 扩展类名称 <ul><li>单一片段插入 </li></ul>扩展类
    183. 183. 软件需求分析 <ul><li>单一片段插入 </li></ul>基础用例 扩展用例
    184. 184. 软件需求分析 <ul><li>多重片段插入 </li></ul>基础用例 扩展用例 扩展类名称
    185. 185. 软件需求分析 <ul><li>多重片段插入 </li></ul>基础用例 扩展用例
    186. 186. 软件需求分析 <ul><li>条件扩展 </li></ul>
    187. 187. 软件需求分析 <ul><li>对象图 </li></ul>
    188. 188. 软件需求分析 <ul><li>对象图 </li></ul><ul><li>对象: 是数据和函数的内聚单元。每个对象都是某个类的一个实例,该类定义了由该类所有对象所共有的特征。 </li></ul><ul><li>对象特征: </li></ul><ul><li>标识: 这是在时间和空间上对象唯一存在。它把该对象同所有其它对象区分开。 </li></ul><ul><li>状态: 特定时刻对象所有有意义的属性值集合。 </li></ul><ul><li>行为: 对象为其它对象提供的服务。在分析建模中为一组操作,调用操作可能引发状态迁移。 </li></ul>
    189. 189. 软件需求分析 属性值 操作 对象中的数据被隐藏,仅能通过调用对象的函数才能操纵数据。 <ul><li>封装 </li></ul>123456 Jim 300.00 Deposit() withdraw() getOwner() setOwner()
    190. 190. 软件需求分析 Bank 对象 Account 对象 Bank 对象发送信息“ withdraw 150.00” 给 Account 对象 Account 对象响应,调用它的取款操作。该操作减少账户余额 150.00 withdraw(150.00) 对象交互产生系统的行为 交互涉及对象之间来回发送消息。当接收到消息时,则调用相应的方法,这可能引起状态的改变。 <ul><li>消息机制 </li></ul>
    191. 191. 软件需求分析 JimsAccount:Account accoutNumber:String=“123456” owner:String=“Jim” balance:double=300.00 对象名称 类名称 属性名称 属性类型 属性值 名称分栏 属性分栏 <ul><li>UML 对象符号 </li></ul>
    192. 192. 软件需求分析 <ul><li>链接: 当一个对象承载到另一个对象的对象引用时,产生链接。链接是两个对象之间的语义联系,它允许消息从一个对象发送到另一个对象。不同的 OO 语言以不同的方法实现链接, Java 把链接实现为对象引用, C++ 把链接实现为指针或引用,或者通过在对象中直接包含另一个对象来实现链接。 </li></ul>bookClub:Club 张三 :Person 李四 :Person 王二 :Person chairperson secretary member 角色名称 双向链接
    193. 193. 软件需求分析 <ul><li>类图 </li></ul>
    194. 194. 软件需求分析 <ul><li>类: 共享相同属性、操作、方法、关系或者行为的一组对象的描述符。 </li></ul><ul><li>类和对象关系 </li></ul><ul><li>每个对象恰是一个类的实例。 </li></ul><ul><li>相同类的不同对象具有相同的属性,但是可以具有这些属性的不同值。不同属性值引起相同类的不同对象的不同行为。 </li></ul><ul><li>使用构造型 <<instantiate>> 依赖,你能在类和它的对象之一之间表示实例化关系。 </li></ul>
    195. 195. 软件需求分析 <ul><li>对象的实例化是使用它的类作为模板创建新对象。 </li></ul><ul><li>大多数 OO 语言提供被称作构造函数的特殊操作,当需要创建对象时,调用它,构造函数创建或初始化对象,构造函数是类范围的。 </li></ul><ul><li>一些 OO 语言提供被称作析构函数的特殊操作,当需要销毁对象时,调用它,析构函数在对象后起清理作用。 </li></ul>
    196. 196. 软件需求分析 <<entity>> Account -number:String -owner:String -balance:double=0.0 +create( theNumber:String, theOwner:String ) +deposit( amount:double ) +withdraw( amount:double ) +getNumber(): String +getOwner(): String +getBalance(): double +setOwner( theOwner:String ) {author=Jim, Status=tested} 名称分栏 属性分栏 操作分栏 可见性修饰 构造型 类名称 标记值 初始值 类范围操作 ( 加下划线 ) <ul><li>UML 类符号 </li></ul>
    197. 197. 软件需求分析 <ul><li>类的命名规则 </li></ul><ul><li>以大写字母打头,混合大小写,其中每个单词以大写开头。 </li></ul><ul><li>避免缩写。尽量用完整单词来描述。 </li></ul><ul><li>如果存在特定领域的缩略词 ( 例如, ERP-Enterprise Resource Planning) ,被广泛使用并且能够被模型的所有读者所理解,那么你可以使用它。 </li></ul>
    198. 198. 软件需求分析 <ul><li>属性分栏 </li></ul><ul><li>命名规则 </li></ul><ul><li>采用以小写字母开头,然后混合大小写。 </li></ul><ul><li>属性名通常是名词或者名词短语。 </li></ul><ul><li>语法规则 </li></ul>可见性 名称 类型 多重性 初始值 visibility name: type [multiplicity]=initialValue
    199. 199. 软件需求分析 1) 可视性: 可视性修饰作用于类内属性和操作。它也可以作用于关系上的角色名称。 与该类处于相同包中的或者是在嵌套子包中的任何元素能够访问该类带有的包可视性的任何特征 package ~ 只有该类及其子类的操作才能访问该类带有的保护可视性的特征 protected # 只有该类的操作才能访问该类待有的私有可视性的特征 private - 能够访问该类的任何元素可以访问该类带有的公共可视性的任何特征 public + 语义 可视性名称 修饰
    200. 200. 软件需求分析 2) 类型:属性的类型可以是其他的类型或者原始类型。 字符的序列,字符串被双引号括起来 String 浮点数 Real OCL 可以取值 true 或者 false Boolean 大于等于零的整数 UnlimitedNatural 整数 Integer UML 语义 原始类型
    201. 201. 软件需求分析 3) 多重性: 多重性允许你在一个属性上通过使用多重性表达式建模两种显著不同的事物:集合和空值。 4) 初始值: 当某个类实例化对象时,初始值允许你说明属性此时采用的值。 5) 构造型和标记值: <<stereotype>> attribute{tag1=value1,tag2=value2,…} address{ addedBy=“Jim”, data Added=“20MAR2004”}
    202. 202. 软件需求分析 <ul><li>操作分栏 </li></ul><ul><li>操作: 操作是绑定到特定类的函数。操作名称通常是动词或者动词短语。 </li></ul><ul><li>操作具有的特征: 名称、参数列表和返回类型。 </li></ul><ul><li>操作语法规则: </li></ul>visibility name(direction parameterName:parameterType =defaultValue,…):returnType 操作签名 参数列表
    203. 203. 软件需求分析 该操作接受 p2 作为输入参数 / 输出参数 该操作以某种方式使用 p2 的值,并且接受该操作的输出 p2 可以被该操作所修改 inout p2:Integer 默认情况, 该操作使用 p1 作为输入参数 该操作以某种方式使用 p1 的值 p1 不能被该操作所修改 in p1:Integer 语义 参数方向
    204. 204. 软件需求分析 该操作使用 p4 作为返回值参数 该操作返回 p4 作为返回值之一 return p4:Integer 该操作使用 p3 作为输出参数 该参数作为接收器接受该操作输出的值 P3 可以被该操作所修改 out p3:Integer 语义 参数方向
    205. 205. 软件需求分析 <ul><li>关系 </li></ul><ul><li>实例化: 类与对象之间的关系。 </li></ul><ul><li>关联: 关联是类间的语义联系。 </li></ul><ul><li>依赖: 依赖表示两个或者多个元素之间的关系,对一个元素 ( 提供者 ) 的改变可能影响或提供信息给其他元素 ( 客户 ) 。 </li></ul><ul><li>继承: 发生在存泛化关系的类之间。 </li></ul>
    206. 206. 软件需求分析 JimAccount:Account accoutNumber:String=“123456” owner:String=“Jim” balance:double=300.00 <<instantiate>> <<instantiate>> <ul><li>实例化 </li></ul>TomAccount:Account accoutNumber:String=“123457” owner:String=“Tom” balance:double=1000.00 Account accoutNumber:String owner:String balance:double deposit() withdraw() getOwner() setOwner()
    207. 207. 软件需求分析 <ul><li>关联: 关联是类间的语义联系。如果两个对象之间存在链接,这些对象的类间必定存在关联,这是因为链接是关联的实例 . </li></ul>Company Person employs 1 * 关联名称 导航性 多重性 Company Person employer 1 * 角色名称 多重性 employee 导航性
    208. 208. 软件需求分析 <ul><li>关联语法 </li></ul><ul><li>1) 关联名称 </li></ul><ul><li>可以前缀或后缀一个小黑箭头表明名称应该阅读的方向。 </li></ul><ul><li>应该是动词或动词短语。 </li></ul><ul><li>采用 lowerCamelCase 格式 ( 第一个词的首字母小写 , 后面每个词的首字母大写 ) 。 </li></ul>
    209. 209. 软件需求分析 <ul><li>可以使用关联名称或者角色名称,但不要同时使用两者。 </li></ul><ul><li>类有到其自身的关联,称为自反关联,它表示该类的对象可以具有到该类的其它对象的链接。 </li></ul><ul><li>2) 角色名称 </li></ul><ul><li>可以在关联的一端或两端上为类赋予角色名称。 </li></ul><ul><li>应该是名词或名词语法描述角色的语义。 </li></ul><ul><li>采用 lowerCamelCase 格式。 </li></ul>
    210. 210. 软件需求分析 <ul><li>3) 多重性 </li></ul><ul><li>多重性表明在任意时刻关系所能够涉及的对象数目。 </li></ul><ul><li>对象可以任意去留,但多重性约束任意时刻对象的数目。 </li></ul><ul><li>多重性在内部说明以逗号隔开,例如, 0..1 , 3..5 。 </li></ul><ul><li>没有默认的多重性,如果多重性没有显式地表示出来,那么多重性没有确定。 </li></ul>
    211. 211. 软件需求分析 <ul><li>关联实例 </li></ul>Company Person employee 1 7 BankAccount employer 1 1..* owner operator 0..* 0..*
    212. 212. 软件需求分析 <ul><li>4) 导航性 </li></ul><ul><li>在关系箭头的端部显示,如果关系没有箭头,那么它是双向的。 </li></ul><ul><li>导航性表明消息仅能够在箭头的方向上传递。 </li></ul>Order Product * * 可导航的 不可导航的 Company Person 1 * 可导航的 可导航的
    213. 213. 软件需求分析 <ul><li>5) 关联类: </li></ul><ul><li>关联类既是关联又是类,它可以具有属性、操作和关系。 </li></ul><ul><li>当两个类间具有多对多关系时,有时存在一些属性,它们不能简单地放入任何一个类中,此时,可以使用关联类。 </li></ul>
    214. 214. 软件需求分析 <ul><li>关联类实例 </li></ul>Company Person * * Company Person * * salary: double Job 关联类 关联类由类、关联和虚线组成
    215. 215. 软件需求分析 一些对象弱相关,像计算机和它的外设 一些对象强相关,像树和树叶 聚合 组合 <ul><li>两类特殊的关联:聚合和组合。 </li></ul>
    216. 216. 软件需求分析 Computer Printer 0..1 0..* 整体或聚集 部分 聚合 聚合语义: 聚集有时能够不依赖部分而独立存在,有时又不能;部分可以独立于聚集而独立存在;如果有一些部分遗失,聚集在某种意义上是不完整的;部分的所有权可能由几个聚集来共享。 1) 聚合: 聚合是一种整体 - 部分关系,其中聚集由许多部分组成。
    217. 217. 软件需求分析 如果 C 是 B 的部分, B 是 A 的部分,那么 C 是 A 的部分 <ul><li>聚合是可传递的 </li></ul><ul><li>聚合是非对称的 </li></ul>A B C Product 自反对称 * * A:Product B:Product C:Product D:Product 不允许循环
    218. 218. 软件需求分析 Product 自反对称 * * A:Product B:Product C:Product D:Product
    219. 219. 软件需求分析 Tree leaf 1 0..* 组成 部分 组合 2) 组合: 组合是一种更强形式的聚合,也具有类似的语义,但是更加受约束。组合具有传递性和非对称性。 组合与聚合的区别在于: 在组合中,部分脱离了整体就不能独立存在,此外,组合中的每个部分至多属于一个整体,也只能属于一个整体;在聚合中,一个部分可以由几个整体共享。
    220. 220. 软件需求分析 <ul><li>依赖: 依赖表示两个或多个建模元素之间的关系,对于一个元素 ( 提供者 ) 的改变可能影响或提供信息给其他元素 ( 客户 ) 。 </li></ul>客户使用由提供者所提供的服务以实现它的行为。 Usage( 使用 ) 语义 类型
    221. 221. 软件需求分析 提供者为客户提供某种权限以访问提供者的内容,这是一种提供者控制和限制对其内容访问的方法。 Permission( 授权 ) 这表示客户和提供者之间的关系,提供者必客户更加抽象。“更加抽象”意味着提供者和客户处于开发中的不同阶段,例如,提供者处于分析模型,客户处于设计模型。 Abstraction( 抽象 ) 语义 类型
    222. 222. 软件需求分析 <ul><li>存在五种类型的 Usage 依赖: <<use>> 、 <<call>> 、 <<parameter>> 、 <<send>> 和 <<instantiate>> 。 </li></ul><ul><li>1 ) <<use>> :下列任何一种情况产生 <<use>> 依赖: </li></ul><ul><li>类 A 的操作需要类 B 的参数; </li></ul><ul><li>类 A 的操作返回类 B 的值; </li></ul><ul><li>类 A 的操作在实现中使用类 B 的对象,但是不是作为属性来使用。 </li></ul>
    223. 223. 软件需求分析 A foo(b:B) bar():B doSomthing() B <<use>> 提供者 客户
    224. 224. 软件需求分析 2 ) <<call>> : 操作之间的依赖,客户操作调用提供者操作。 3 ) <<parameter>> : 提供者是客户操作上的参数。 4 ) <<send>> : 客户把提供者 ( 它必须信号 ) 发送到指定的目标。 5 ) <<instantiate>> : 客户是提供者的实例 ( 对象与类之间的实例化关系 ) 。
    225. 225. 软件需求分析 Shape Square Circle Triangle is a kind of 父类 超类 基类 先辈 特 化 泛 化 更一般元素 更特殊元素 儿子 子类 后裔 <ul><li>泛化: 泛化是一般元素和特殊元素之间的关系,特殊元素完全与一般元素一致,但是包含更多信息。 </li></ul>
    226. 226. 软件需求分析 <ul><li>类继承: 类继承发生在泛化关系的类之间。子类继承父类:属性、操作、关系和约束,同时可以添加新的特征以及覆写超类的操作 </li></ul>
    227. 227. 软件需求分析 覆写超类操作 Shape origin:Point width:int Height:int draw(Grahics g) getArea():int getBoundingArea():int Square draw(Grahics g) getArea():int Circle draw(Grahics g) getArea():int
    228. 228. 软件需求分析 <ul><li>抽象操作: 抽象操作没有实现,它作为占位符而存在,所有具体子类必须实现所有继承的抽象操作。 </li></ul><ul><li>抽象类: 抽象类具有一个或多个抽象操作。抽象类不能实例化,抽象类定义了其具体子类必须实现的一组抽象操作的契约。 </li></ul>
    229. 229. 软件需求分析 抽象操作 具体操作 抽象类 具体类 Shape origin:Point width:int Height:int draw(Grahics g) getArea():int getBoundingArea():int Square draw(Grahics g) getArea():int Circle draw(Grahics g) getArea():int
    230. 230. 软件需求分析 <ul><li>多态: 多态就是“多种形态”。它允许你使用抽象类来设计系统,然后在运行时替换成具体的子类,这样系统非常灵活和容易扩展,仅添加更多子类而已。 </li></ul><ul><li>多态操作: 具有多于一种的实现。不同的类以不同的方式实现相同的多态操作,多态允许不同的实例以不同的方式响应相同的消息。 </li></ul>
    231. 231. 软件需求分析 <ul><li>顺序图 </li></ul>
    232. 232. 软件需求分析 <ul><li>用例实现: 是由一组类所组成,这些类实现了用例中所说明的行为。 </li></ul>RegistrationManager Course Student 0..* 0..* registration 1 1 0..* 0..* course student 用例 分析类图
    233. 233. 软件需求分析 <ul><li>顺序图: 表示把生命线之间的交互表示为事件的时间序列。 </li></ul>:RegistrationManager :Registrar uml:Course addCourse(“UML”) <<create>> 生命线 激活 同步消息 返回消息 The Registrar selects “add course”. sd addCourse 注释 对象创建消息 对象在该点被创建 关键字 顺序图名称
    234. 234. 软件需求分析 <ul><li>生命线: 生命线代表交互中的单一参与者,也即,它代表特定类元的实例如何参与交互的。 </li></ul><ul><li>名称: 用于引用交互中生命线。 </li></ul><ul><li>类型: 类元的名称,生命线代表该类型类元的一个实例。 </li></ul><ul><li>选择器: 布尔表达式,可以选择满足该条件的单一实例。如果没有选择器,生命线选择该类元的任意实例。 </li></ul>
    235. 235. 软件需求分析 <ul><li>消息: 消息代表交互中两条生命线之间特定种类的通讯。通讯包括操作调用、创建或者销毁实例和发送信号。 </li></ul><ul><li>同步消息: 发送者等待接收者结束执行所需要的操作。 </li></ul><ul><li>异步消息: 发送者不等待接收者返回,继续执行下一步。 </li></ul><ul><li>消息返回: 更早消息的接收者返回控制焦点给那个消息的发送者。 </li></ul>
    236. 236. 软件需求分析 <ul><li>创建消息: 发送者创建由接收者说明的类元的实例。 </li></ul><ul><li>销毁消息: 发送者销毁接收者。 </li></ul><ul><li>发现消息: 消息的发送者在交互的范围之外。当你想要显示消息接收,但是不想显示消息来自何方,使用它。 </li></ul><ul><li>丢失消息: 消息永远没有达到目的地。可以用于显示消息丢失的出错条件。 </li></ul>
    237. 237. 软件需求分析 aMessage(aParameter) aMessage(aParameter) <<create>>aMessage() :A 同步消息 异步消息 返回消息 消息创建 发现消息 丢失消息
    238. 238. 软件需求分析 <ul><li>组合区: 顺序图可以被划分区域,该区域被称为组合区。每个组合区具有一个操作符,一个或多个运算单元,以及零个或多个监护条件。 </li></ul><ul><li>操作符: 操作符确定运算单元是否被执行。主要的操作符有 opt 、 alt 、 loop 、 break 、 ref 和 critical 。 </li></ul><ul><li>监护条件: 监护条件确定运算单元是否被执行。 </li></ul>
    239. 239. 软件需求分析 <ul><li>opt 操作符: opt 操作符表示单一运算单元执行,当且仅当监护条件为真。否则执行将在组合片段之后。 opt 操作符等价于编程构件: </li></ul><ul><li>if(condition1) then </li></ul><ul><li>action1 </li></ul>
    240. 240. 软件需求分析 <ul><li>alt 操作符: alt 操作符表示进行选择。每个运算单元具有其自身的监护条件,在监护条件为真时,将执行。如果其它监护条件同时不为真时,带有监护条件的 else 中的可选运算单元执行。 alt 操作符等价于编程构件: </li></ul><ul><li>if(condition 1) then </li></ul><ul><li> operation 1 </li></ul><ul><li>else if(condition 2) then </li></ul><ul><li> operation 2 </li></ul><ul><li>… </li></ul><ul><li>else if(condition n) then </li></ul><ul><li> operation n </li></ul><ul><li>else </li></ul><ul><li> operation m </li></ul>
    241. 241. 软件需求分析 <ul><li>用例: 管理购物篮 </li></ul>shoppingBasket getItem():Item Item quantity:int setQuantity():int 1 0..*
    242. 242. 软件需求分析 :ShoppingBasket :Customer item:Item getItem() sd ManageBasket alt [chanageQuantity] [deleteItem] setQuantity() Opt[item.quantity<=0] <<destroy>> <<destroy>>
    243. 243. 软件需求分析 <ul><li>loop 操作符: loop 操作符表示循环。 loop 操作符等价于编程构件: </li></ul><ul><li> loop min times then </li></ul><ul><li>while ( condition is true) </li></ul><ul><li>loop( max - min ) times </li></ul><ul><li>使用 loop 语法的要点: </li></ul><ul><li>没有 max 、 min 或者 condition 的 loop 是无穷循环; </li></ul><ul><li>如果只给定 min ,那么 max=min ; </li></ul><ul><li>Condition 通常是布尔表达式,但是它可以是任意文本,如果它的内容清晰。 </li></ul>
    244. 244. 软件需求分析 <ul><li>Break 操作符: 具有单一监护条件,如果它为真, break 主体被执行,并且 loop 被终止。 </li></ul>
    245. 245. 软件需求分析 sd LoopAndBreakSyntax :A :B loop min,max[condition1] op1() loop[condition2] op2() op3() op4() 循环 min 次,然后当 condition1 为 true ,循环 (max-min) 次 break[condition3] 当 condition2 为 true ,执行循环 循环中断结束后执行 op3 如果 break 执行, op4 将不执行 当 condition3 为 true ,循环中断
    246. 246. 软件需求分析 <ul><li>状态图 </li></ul>
    247. 247. 软件需求分析 <ul><li>状态图: 对状态机的行为进行建模,使用状态机建模的类元包括类、用例、子系统、系统。状态机的主要构成要素: </li></ul><ul><li>状态: 对象生命周期中的条件或状况,在此期间,对象满足某种条件,执行某些活动或等待某些事件。 </li></ul><ul><li>事件: 具有时间和空间位置的、有意义事情的规格说明。 </li></ul><ul><li>迁移: 响应事件从一个状态变化到另一个状态。 </li></ul>
    248. 248. 软件需求分析 Off On turnOn turnOff burnOut 灯泡
    249. 249. 软件需求分析 EnteringPassword entry /display password dialog exit /validate password keypress/echo “*” help/display help do /get password 状态名称 入口和出口动作 内部迁移 内部活动 动作语法: eventName/someAction 活动语法: do/someActivity <ul><li>状态 </li></ul>
    250. 250. 软件需求分析 A B event1,event2[guardcondition]/anAction 行为状态机 <ul><li>迁移 </li></ul>当事件 event1 和 event2 发生时,如果条件 condition 成立,则执行动作 anAction
    251. 251. 软件需求分析 OnLoan Overdue FineDue Terminated [after maximumDuration] returnBook returnBook payFine Loan [extend] [!extend] 监护条件互斥 带有汇合和分支的交叉 <ul><li>连接迁移 - 交叉伪状态 </li></ul>
    252. 252. 软件需求分析 Unpaid Overpaid Fullypaid Partiallypaid acceptPayment [payment>balance] [payment<balance] [payment=balance] MakeRefund acceptPayment BankLoan 选择伪状态 <ul><li>连接迁移 - 选择伪状态 </li></ul>
    253. 253. 软件需求分析 <ul><li>事件分为: </li></ul><ul><li>调用事件: 请求在类语境的实例上调用特定的操作。 </li></ul><ul><li>信号事件: 信号是在对象间异步传递的信息包。 </li></ul><ul><li>改变事件: 当布尔条件由假转为真时发生。 </li></ul><ul><li>时间事件: 时间事件用关键字 when 和 after 表示。关键字 when 说明被触发的特定时刻。 After 说明事件被触发的阀值时间。 </li></ul>
    254. 254. 软件需求分析 deposit(m)/balance=balance+m InCredit Rejecting withdrawal entry/logRejectedWithdraw() Accepting withdrawal entry/balance-m withdraw(m) [balance<m] withdraw(m) [balance>=m] close() BankAccount 调用内部事件 动作 调用外部事件 条件 入口动作 <ul><li>调用事件 </li></ul>
    255. 255. 软件需求分析 deposit(m)/balance=balance+m InCredit Rejecting withdrawal entry/logRejectedWithdraw() Accepting withdrawal entry/balance-m withdraw(m) [balance<m] withdraw(m) [balance>=m] close() BankAccount 信号发送 RejectedWithdrawal <ul><li>信号事件 </li></ul>
    256. 256. 软件需求分析 ProcessRejectedWithdrawl (e:RejectedWithdrawal) Calling customer 信号接收 <<signal>> RejectedWithdrawal date:Date accountNumber:String requestedAmout:double availabelBalance:double
    257. 257. 软件需求分析 <ul><li>改变事件 </li></ul>deposit(m)/balance=balance+m balance>=5000/notifyManager() InCredit Rejecting withdrawal entry/logRejectedWithdraw() Accepting withdrawal entry/balance-m withdraw(m) [balance<m] withdraw(m) [balance>=m] close() BankAccount 布尔表达式 RejectedWithdrawal
    258. 258. 软件需求分析 <ul><li>面向对象分析方法 </li></ul><ul><li>识别参与者 </li></ul><ul><li>发现用例 </li></ul><ul><li>类建模 </li></ul><ul><li>确定分析模型中的类 ( 属性和操作 ) </li></ul><ul><li>建立类 - 关系模型 ( 一般 - 特殊、关联、整体 - 部分、依赖 ) </li></ul><ul><li>定义主题或子系统 </li></ul><ul><li>建立对象 - 行为模型 </li></ul>
    259. 259. 软件需求分析 <ul><li>识别参与者 </li></ul><ul><li>使用系统主要功能的人有哪些? ( 计划员 ) </li></ul><ul><li>需要借助系统完成日常工作的人是谁? ( 班组长、材料员、分厂工作人员 ) </li></ul><ul><li>谁来维护、管理系统,保证系统正常工作? ( 系统管理员 ) </li></ul><ul><li>系统控制的硬件设备有哪些? ( 光电管、 PLC 、工控机、触摸屏、大屏幕 ) </li></ul><ul><li>系统需要和哪些其他系统接口? ( 物资系统 ) </li></ul><ul><li>对系统感兴趣的人和事是哪些? ( 企业领导 ) </li></ul>
    260. 260. 软件需求分析 <ul><li>发现用例 </li></ul><ul><li>参与者需要从系统中获得哪些功能?需要角色做什么? </li></ul><ul><li>企业领导需要查看报表,了解生产任务完成情况以及材料消耗情况 ( 报表查询 ) </li></ul><ul><li>计划员需要根据单耗制定材料计划 ( 制定材料计划 ) </li></ul><ul><li>大屏幕需要读取实时数据,翻屏显示 ( 实时数据翻屏 ) </li></ul>
    261. 261. 软件需求分析 <ul><li>参与者需要读取、生产、删除、修改或存储系统中的某种信息吗? </li></ul><ul><li>系统管理员要维护基础数据,进行排班 ( 基础数据维护 ) </li></ul><ul><li>工控机会自动生成数据 ( 自动生成数据 ) </li></ul><ul><li>材料员需要手工生成数据 ( 人工生成数据 ) </li></ul>
    262. 262. 软件需求分析 <ul><li>系统中发生的事件需要通知参与者吗?参与者需要通知系统某事件吗?这些事件能干什么? </li></ul><ul><li>进行班数据合并时,某个班组尚未输入数据,需要通知材料员,由材料员通知班组长 </li></ul><ul><li>系统需要的输入 / 输出的是什么信息?这些信息从哪里来?到哪里去? </li></ul><ul><li>材料员要接入物资系统数据和导入分厂数据 </li></ul><ul><li>光电管需要自动采集数据 </li></ul><ul><li>班组长需要通过触摸屏输入不良品数据,手工输入班数据 </li></ul>
    263. 263. 软件需求分析 <ul><li>系统当前需要解决的问题是什么? </li></ul><ul><li>采集生产数据,实时了解显象管生产的产量和质量,计算材料单耗 </li></ul>
    264. 264. 软件需求分析
    265. 265. 软件需求分析 <ul><li>类建模 </li></ul><ul><li>确定分析模型中的类 </li></ul><ul><li>考察系统的使用用例的实例,首先将这些实例中的名词或名词短语汇总起来,得到候选类,然后考察这些候选类的特征,进而确定哪些类应该包含在分析模型中。 </li></ul><ul><li>例如,对光电管生产检测系统的描述中,可以确定下列为分析模型中的类? </li></ul><ul><li>光电管、 PLC 计数器、触摸屏、工控机、大屏幕、部门、规格、流水线、工序、不良品、材料、在制品、物料、指标数据、实时数据等。 </li></ul>
    266. 266. 软件需求分析 <ul><li>建立类 - 关系模型: 确定类之间的关系。 </li></ul><ul><li>一般 - 特殊关系 </li></ul><ul><li>整体 - 部分关系 </li></ul><ul><li>关联关系 </li></ul>物料 材料 在制品 国产材料 进口材料 显象管 荫罩 屏 锥
    267. 267. 软件需求分析 <ul><li>定义主题或子系统 </li></ul><ul><li>复杂的系统的分析模型可以包含许多类,为了简化问题的复杂度,当类模型中的某个子集可以相互协作共同完成一组内聚的功能时,可以将它们定义为主题或子系统。主题或子系统是一种抽象,可以供指向分析模型更详细内容的引用,当从外界观察时,主题或子系统可以被视为黑盒子。 </li></ul>
    268. 268. 软件需求分析 <ul><li>建立对象 - 行为模型 </li></ul><ul><li>为用例建立顺序图,描述用例的实现。 </li></ul><ul><li>为类、子系统或整体系统建立状态图,描述类、子系统或系统的在事件的驱动下的状态变迁。 </li></ul>
    269. 269. 软件需求分析 <ul><li>软件需求说明 </li></ul><ul><li>软件需求说明 (SRS) :是软件开发人员在需求分析阶段需要完成的文档。例如, IEEE830-1998 、 GB856D-88 。 </li></ul><ul><li>软件需求说明主要内容 </li></ul><ul><li>引言; 叙述在问题定义阶段确定的关于软件的目标与范围,简要地介绍系统背景、盖帽、软件项目约束和参考资料等; </li></ul>
    270. 270. 软件需求分析 <ul><li>主体部分:信息描述、功能描述、行为描述 </li></ul><ul><li>信息描述: 给出软件所包含信息的详细描述,包括信息的内容、关系、数据流向、控制流向和结构等。 </li></ul><ul><li>功能描述: 对软件功能要求说明,包括系统功能划分、每个个功能的处理说明、限制和控制描述等。 </li></ul><ul><li>行为描述: 对系统状态变化以及事件和动作的叙述,据此可以检查外部事件和软件内部控制特征。 </li></ul>
    271. 271. 软件需求分析 <ul><li>质量保证: 软件在交付前需要进行的功能测试和性能测试,并规定源程序和文档应该遵循的各种标准。 </li></ul><ul><li>接口描述: 描述了系统的用户界面、硬件接口、软件接口和通信接口等说明。 </li></ul><ul><li>其它描述: 系统设计和实现上的限制,系统的假设和依赖等其它需要说明的内容。 </li></ul>
    272. 272. 主要内容 5 6 3 7 8 2 4 9 软件测试 软件维护 软件工程概述 软件编码 软件设计 软件需求分析 软件质量管理 软件工程管理 1 软件开发模型
    273. 273. 软件设计 <ul><li>软件设计的任务 </li></ul><ul><li>软件设计 : 数据设计、体系结构设计、接口设计和过程设计。 </li></ul><ul><li>数据设计: 将分析阶段创建的信息模型转变成软件实现所需的数据结构; </li></ul><ul><li>体系结构设计: 定义软件主要组成部件之间的关系; </li></ul><ul><li>接口设计: 描述软件内部、软件和接口系统之间以及软件与人之间是如何通信的; </li></ul><ul><li>过程设计: 将软件体系结构的组成部分转变成对软件组件的过程性描述。 </li></ul>
    274. 274. 软件设计 <ul><li>软件设计阶段 </li></ul><ul><li>概要设计: 体系结构设计和接口设计,编写概要设计文档; </li></ul><ul><li>详细设计: 确定各个软件组件的数据结构和操作,产生描述各软件组件的详细设计文档。 </li></ul><ul><li>软件设计方法 ( 结构化设计 ) </li></ul><ul><li>面向数据流设计方法 </li></ul><ul><li>面向数据结构的 Jackson 方法 </li></ul>
    275. 275. 软件设计 <ul><li>软件设计的基本概念 </li></ul><ul><li>模块 (Module) : 模块是一个拥有明确定义的输入、输出和特性的程序实体。例如, </li></ul><ul><li>汇编语言中的子程序 </li></ul><ul><li>FORTRAN 语言中的辅助程序 </li></ul><ul><li>Pascal 语言中的过程 </li></ul><ul><li>Java 语言中的类和包 </li></ul><ul><li>模块化设计 (Modular Design) : 将大型软件按照规定的原则划分成一个个较小的、相对独立但又相互关联的模块的过程,称为模块化设计。 </li></ul>
    276. 276. 软件设计 <ul><li>抽象 (Abstraction) : 抓住事物的本质和共性。抽象体现了分层的思想,最高层级的抽象程度最高,越是到较低层次,越可以看到更多的细节。由高级抽象到低级抽象转换过程中,需要进行一连串的过程抽象和数据抽象。 </li></ul><ul><li>过程抽象: 是把完成一个特定功能的动作序列抽象为一个过程名和参数表,以后通过指定过程名和实际参数调用此过程。 </li></ul><ul><li>数据抽象: 把具有相同性质的一组数据对象抽象为一个数据类型名,用此类型名可以定义多个具有相同性质的数据对象。在该抽象数据类型中可以加入对该数据施加的操作。 </li></ul>
    277. 277. 软件设计 <ul><li>细化 (Refinement) : 细化是与抽象相反而又互补的一个概念,细化的实质就是分解。 </li></ul><ul><li>信息隐藏 (Information Hiding) : 在把系统分解为模块时,模块内部的数据与过程对不需要了解这些数据与过程的模块隐藏起来,只有为了完成软件的总体功能而必须在模块间交换的信息,才允许在模块间传递。 </li></ul><ul><li>软件复用 (Software Reuse) : 是指在开发新的软件系统时,不必从头开始,而是充分利用现有的构件来完成。面向对象技术的流行加快这一理想的实现。 </li></ul>
    278. 278. 软件设计 <ul><li>模块化设计 </li></ul><ul><li>分解 (Decomposition) </li></ul><ul><li>问题分解复杂度 C(P 1 +P 2 )>C(P 1 )+C(P 2 ) </li></ul><ul><li>问题分解工作量 E(P 1 +P 2 )>E(P 1 )+E(P 2 ) </li></ul><ul><li>其中, P 1 、 P 2 由问题 P 1 +P 2 分解而得到, C 为问题的复杂度, E 为解题需要的工作量。 </li></ul>
    279. 279. 软件设计 模块数与开发工作量的关系 1 接口成本 1 模块成本 模块数 软件开发工作量 1 总成本 最小成本区间
    280. 280. 软件设计 <ul><li>模块独立性 (Module Independence) : 独立性可以从两个方面来度量:模块本身的内聚性 (Cohesion) 和模块之间的耦合 (Coupling) 。 </li></ul><ul><li>内聚: 内聚是指完成同一个任务时对模块各个组成部分的需要程度。 </li></ul><ul><li>耦合: 耦合是指两个模块之间的相互依赖程度。 </li></ul><ul><li>模块独立性越高,则块内联系越强,块间联系越弱。 </li></ul>
    281. 281. 软件设计 <ul><li>内聚: 内聚是指完成同一个任务时对模块各个组成部分的需要程度。 </li></ul>弱 强 低内聚 中内聚 高内聚 <ul><li>偶然性内聚: 模块内各组成成分在功能上是互不相关的。 </li></ul>功能 内聚 顺序 内聚 通讯 内聚 过程 内聚 时间 内聚 逻辑 内聚 偶然 内聚
    282. 282. 软件设计 <ul><li>逻辑性内聚实例: </li></ul><ul><li>计算全班学生最高分 </li></ul><ul><li>计算全班学生平均分 </li></ul><ul><li>逻辑性内聚: 通常由若干个逻辑功能相似的成分组成。 </li></ul>读入分数 计算平均分 计算最高分 平均 / 最高 输出结果 逻辑内聚性模块
    283. 283. 软件设计 <ul><li>时间内聚: 这类模块所包含的成分是由相同的执行时间将它们连结到一起。 </li></ul><ul><li>例如,一个初始化模块可能包含:为变量赋值、打开某个文件等为正式处理作准备的功能,由于要求它们在同一时间内执行,故称为时间性内聚。 </li></ul>
    284. 284. 软件设计 <ul><li>过程内聚: 当一个模块中包含的一组任务必须按照某一特定的次序执行时,就称为过程内聚。 </li></ul>过程性内聚性模块 建立方程组系数矩阵 高斯消去法 回 代 高斯消去法解题流程
    285. 285. 软件设计 <ul><li>通讯内聚: 模块内各组成部分都使用同一种输入数据,或者产生同一输出数据。 </li></ul>开领书单 登记售书 领书单 售书登记表 发票 具有相同的输入数据 删除 修改 售书登记表 具有相同的输出数据
    286. 286. 软件设计 <ul><li>顺序内聚: 模块中的各组成部分是顺序执行的。在顺序内聚模块中,上一个组成部分的输出是下一个组成部分的输入�

    ×