软件工程复习总结

考试题型

名词解释、填空、简答题、应用题

重点内容
第1章 软件与软件工程的概念

  1. 了解与软件相关的基本概念,包括软件、程序、数据、文档。
  2. 了解软件危机的表现及发生的原因。
  3. 掌握软件工程的概念。
  4. 软件生命周期由哪三个时期组成,每个时期又可划分为哪些阶段?每个阶段的主要任务是什么?
  5. 掌握软件工程方法学的三个基本要素及其作用。
  6. 了解传统方法及面向对象方法各自的特点。

第2章 软件生存期模型

  1. 典型的软件生存期模型(即软件过程模型)有哪几种,每种模型有哪些优缺点。

第3章 软件需求分析

  1. 软件需求分析分为哪4个步骤?各个步骤的主要任务是什么?
  2. 软件需求分析的困难是什么?

第4章 人机交互设计

  1. 人机交互设计的准则。

第5章 面向对象方法与UML

  1. 了解UML中的事物及其分类。
  2. 了解UML中的关系,包括依赖关系、关联关系、泛化关系和实现关系等。
  3. 掌握UML中5种类型的图,包括用例图、类图、顺序图、状态图、活动图。

第6章 面向对象分析

  1. 了解面向对象分析中的三个模型和五个层次。
  2. 掌握有关用例模型、对象模型和动态模型的基本概念。
  3. 能够针对具体应用,建立用例模型、对象模型和动态模型(状态图和顺序图)的过程。

第7章 面向对象设计原则与软件设计模式

  1. 掌握面向对象设计原则
    单一职责原则、开闭原则、里氏代换原则、依赖倒转原则、合成复用原则、接口隔离原则、迪米特法则。
  2. 掌握设计模式的概念。
  3. 掌握常用的设计模式:单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、适配器模式、外观模式、桥接模式、观察者模式、迭代器模式。

第8章 面向对象设计

  1. 了解软件系统分解的方法。
  2. 掌握典型的面向对象设计模型。
  3. 了解4个子系统的设计方法。

第10章 软件测试

  1. 了解软件测试的概念、软件测试的目标。
  2. 掌握白盒测试中使用逻辑覆盖和基本路径测试的测试用例设计方法。
  3. 掌握程序控制流图的画法及环路复杂性的计算方法。
  4. 掌握黑盒测试用例设计的方法:等价类划分法、边界值分析。
  5. 了解软件测试的步骤和策略,包括单元测试、组装测试、确认测试和系统测试。

第9章 编码

  1. 理解程序设计风格的重要性。
  2. 了解程序设计风格的4个方面。
  3. 重构的概念、目的、具体做法。

第一章 软件与软件工程的概念
1,了解与软件相关的基本概念,包括软件、程序、数据、文档。
2,了解软件危机的表现及发生的原因。
3,掌握软件工程的概念。
4,软件生命周期由哪三个时期组成,每个时期又可划分为哪些阶段?每个阶段的主要任务是什么?
5,掌握软件工程方法学的三个基本要素及其作用。
6,了解传统方法及面向对象方法各自的特点。

一,软件的基本概念
1,软件 = 知识+ 程序(数据结构+算法) + 数据 + 文档
2,软件的特性:
(1)抽象性:
(2)复杂性:
(3)智能性:
(4)易变性:软件需求经常发生变化
(5)开发特性:到目前为止尚未实现自动化,这一大规模知识型刚工作充满了个人行为和因素
(6)维护特性:软件维护和传统产业产品的维护概念有着很大的差别
(7)废弃特性:与硬件不同,软件并不是由于被“用坏”而被废弃的
(8)环境特性:软件对于计算机系统的环境有着不可拜托的依赖性
(9)应用特性:软件应用极为广泛,已成为信息产业、先进制造业和现代服务业的核心,占据了无可取代的地位
3,软件的分类:
(1)系统软件
(2)支撑软件(工具软件):横向支撑软件、纵向支撑软件
(3)应用软件:
(4)可复用软件:标准函数库、类库、构件库等
二,软件危机:
1,表现:
(1)对软件开发成本和进度的估计常常很不准确
(2)用户对“已完成的”软件系统不满意
(3)软件产品的质量往往靠不住,错误多、性能低、不安全、不可靠
(4)软件通常没有适当的文档资料,常常不可维护
(5)软件成本在计算机系统总成本中所占的比例逐年上升
(6)软件开发生产率提高的速度,及跟不上硬件的发展速度,也远远跟不上计算机应用迅速普及深入的趋势。
2,原因:
(1)复杂性:软件要解决的问题是复杂的
(2)隐匿性:尚未完成的软件是看不见的,及时利用图标说明也常无法充分呈现其结构,使得人们在沟通上面临极大的困难。
(3)配合性:在大型软件环境中,各子系统的接口必须系统一致。由于时间和环境的演变,要维持这样的一致性通常十分苦难。
(4)易变性:软件所应用的环境常是由人群、法规、硬件设备、应用领域等各因素汇集而成,而这些因素皆会快速变化。
3,解决方法:
(1)彻底消除“软件就是程序”的错误观念
(2)按工程化的原则和方法组织软件开发工作
(3)推广和使用在实践中总结出来的开发软件的成功技术、方法和工具。
(4)充分认识到软件开发应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目。
三,软件工程
1,定义:软件工程是指导计算机软件开发和维护的工程学科。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件该工程。
定义2:
IEEE:
软件工程是 ① 将系统性的、规范化的、可定量的方法应用于软件的开发、运行和维护,即将工程化方法应用于软件;② 对①中所述方法的研究。
Fritz Bauer:
建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。
2,软件工程学的内容:
(1)软件工程方法学:通常把在软件生命周期全过程中使用的一整套技术的集合称为方法学。也称为范型(paradigm)
• 软件开发方法:完成软件开发的各项任务的技术方法
• 软件工具:为方法的运用提供自动的或半自动的软件支撑环境
• 软件工程过程:为了获得高质量的软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤
(2)软件工程管理:管理学、经济学
四,软件工程方法
1,传统方法
2,面向对象方法
3,面向服务的方法
4,面向数据的方法
5,基于构件的方法
6,形式化的方法
五,软件的生命周期
1,软件定义过程
(1)问题定义:“要解决的问题是什么”。
(2)可行性研究:“上一个阶段所确定的问题是否有行得通地方解决办法?”
(3)需求分析:“目标系统必须做什么”
(4)概要设计:“怎样实现目标系统?”
(5)详细设计:“应该怎样具体地实现这个系统”
2,软件开发过程
编码:写出正确的容易理解、容易维护的程序模块。
3,软件使用与维护过程
(1)测试:通过各种类型的测试(及相应的调试)是软件大道预定的要求。
(2)运行维护:改正性维护、适应性维护、完善性维护、预防性维护。
软件生存期分为:软件定义、软件开发、软件使用和维护
软件生存期分为八个阶段:问题定义、可行性研究、需求分析、概要设计、详细设计、编码、测试、维护

第二章 软件生存期模型
一,软件生存期模型有哪些?各有什么特点?
1,瀑布模型
优点:
(1)像工厂流水线一样把软件开发分层化(阶段间具有顺序性和依赖性);
(2)让软件开发过程有序、可控,使分工协作变成可能;质量有保证;
(3)是现代软件工程的起源,软件工程的发展很大部分都是构建与瀑布模型的基础之上的。
缺点:
(1)由于瀑布模型几乎完全依赖于书面的规格说明,很可能导致最终开发出的软件产品不能真正满足用户的需要。
2,快速原型模型
优点:
(1)有助于满足用户的真实需求;
(2)原型系统已经通过与用户的交互而得到验证,据此产生的规格说明文档能够正确地描述用户需求。
3,增量模型
优点:
(1)能在较短时间内向用户提交可完成一些有用的工作的产品,即从第一个构建交付之日起,用户就能做一些有用的工作;
(2)用户有较为充裕的时间学习和适应新产品,从而减少一个全新的软件带来的冲击;
(3)项目失败风险较低;
(4)优先级最高的服务首先交付。
困难:
(1)软件体系结构必须是开放的;
(2)在把每个新的增量构建集成到现有软件体系结构中时,必须不破坏原来已经开发出来的产品。
4,螺旋模型
螺旋模型可以看成是在每个阶段之前都增加了风险分析过程的快速原型模型。
优点:
是开发高风险的大型软件系统的使用模型;
可以降低风险,减少项目因风险造成的损失。
缺点:
螺旋模型是风险驱动的,因此要求软件开发人员必须有丰富的风险评估经验和这方面的专门知识,否则将出现真正的风险:当项目实际上正在走向灾难时,开发人员可能还以为一切正常。
5,喷泉模型
迭代:重复;演进;
无间隙:各阶段间无明显界限。
6,统一过程RUP(rational unified process)
用例驱动;
以构架为中心;
迭代和增量的开发过程。
7,基于构件的开发
构件是系统中模块化的,可部署的和可替换的部件,该部件封装了实现并对外提供一组接口。
8,敏捷过程
个体和交互 胜过 过程和工具
可工作软件 胜过 宽泛的文档
客户合作 胜过 合同谈判
响应变化 胜过 遵循计划
二,调研敏捷开发方法,主要是Scrum模型:
1,产品订单:
产品功能列表,从客户价值角度进行优先级排序。
2,迭代订单:
从开发技术角度划分的迭代开发任务。
3,每日例会:
每天开会确定进度。
4,任务看板:
确定各个任务的状态是“to do”、“done”还是“doing”。
燃尽图:
以日期为横坐标,工时为纵坐标,记录计划工时与实际工时,并比较其差别。
一般可以在图表中绘制两条线段,一条表示期望的工作进度,另一条记录实际的工作进度。
6,软件工具:
开发软件所使用的工具。
制定本项目组的开发计划:可遵循敏捷的12条原则。

第二章 软件过程与过程模型
一,软件过程
1,软件过程:为了获得高质量的软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。
软件过程是完成软件产品生产的一组相互关联的活动。
二,软件过程活动
1,软件过程活动:(软件过程模型–软件生存期模型)
(1)问题定义:做什么
(2)可行性研究:做不做?
(3)需求分析:详细地说“做什么”
(4)概要设计:概要地说“怎么做”
(5)详细设计:详细地说“怎么做”
(6)编码:
(7)测试:单元测试、集成测试、系统测试
(8)维护:改正性维护、适应性维护、完善性维护、预防性维护
三,软件过程模型
1,瀑布模型
(1)传统的瀑布模型
• 阶段间具有顺序性和依赖性
• 推迟实现的观点
• 质量保证的观点
在这里插入图片描述(2)实际的瀑布模型:带反馈环在这里插入图片描述
(3)优缺点
优点:
(1)像工厂流水线一样把软件开发分层化(阶段间具有顺序性和依赖性);
(2)让软件开发过程有序、可控,使分工协作变成可能;质量有保证;
(3)是现代软件工程的起源,软件工程的发展很大部分都是构建与瀑布模型的基础之上的。
缺点:
(1)由于瀑布模型几乎完全依赖于书面的规格说明,很可能导致最终开发出的软件产品不能真正满足用户的需要。

2,快速原型模型
(1)定义:原型是一个部分开发的产品,用于加强对系统的理解,有助于明确需求和选择可行的设计策略。
(2)做法:第一次是试验开发,目的在于探索可行性,弄清软件需求。第二次则在此基础上获得较为满意的软件产品。
(3)优缺点:
优点:
(1)有助于满足用户的真实需求;
(2)原型系统已经通过与用户的交互而得到验证,据此产生的规格说明文档能够正确地描述用户需求。

3,增量模型(渐增模型)
优点:
(1)能在较短时间内向用户提交可完成一些有用的工作的产品,即从第一个构建交付之日起,用户就能做一些有用的工作;
(2)用户有较为充裕的时间学习和适应新产品,从而减少一个全新的软件带来的冲击;
(3)项目失败风险较低;
(4)优先级最高的服务首先交付。
困难:
(1)软件体系结构必须是开放的,即向现有产品中加入新构件的过程必须简单、方便。
(2)在把每个新的增量构建集成到现有软件体系结构中时,必须不破坏原来已经开发出来的产品。
(3)采用增量模型比采用瀑布模型和快速原型模型更需要精心的设计。

4,螺旋模型
(1)定义:螺旋模型可以看成是在每个阶段之前都增加了风险分析过程的快速原型模型,基本思想是使用原型及其他方法来尽量降低风险。

在这里插入图片描述
(2)优缺点
优点:
• 是开发高风险的大型软件系统的使用模型;
• 可以降低风险,减少项目因风险造成的损失。
缺点:
• 螺旋模型是风险驱动的,因此要求软件开发人员必须有丰富的风险评估经验和这方面的专门知识,否则将出现真正的风险:当项目实际上正在走向灾难时,开发人员可能还以为一切正常。

5,喷泉模型
(1)定义:迭代时软件开发过程中普遍存在的一种内在属性
经验表明,软件过程各个阶段之间的迭代或一个阶段内各个工作步骤之间的迭代,在面向对象范型中比在结构化范型中更常见。
(2)迭代:重复、演进;无间隙:各阶段间无明显界限
在这里插入图片描述

6,统一软件开发过程RUP(rational unified process)
(1)定义:
• 是以UML作为建模语言进行软件开发的过程。
• Rational统一过程涵盖了整个软件声明周期,可用来指导更又凶啊的软件开发时间
• 统一过程是基于构件的,即所构造的软件系统是由软件构件通过明确定义的接口相互链接构造起来的
在这里插入图片描述
(2)RUP的主要特点
• 用例驱动:用户与系统的一次交互就称为一个用例
• 以架构为中心
• 迭代和增量的开发过程
(3)优点:
• RUP适用于开发大型的、长期存在的软件系统,例如航空航天控制系统
• 各个开发团队分散在各地,长期为项目工作,团队之间需要密切的协调。
(4)缺点:
• 当这种重量级的软件开发方法应用与中小规模的业务系统时,额外开销过大
• 很多企业都在全球化、快速变化的环境中寻求生存和发展,他们必须快速响应新的机会和市场。快速的软件开发和交付对于大多数业务系统而言都是最关键的要求。

7,基于构件的开发
(1)构件:是系统中模块化的,可部署的和可替换的不见,该不见封装了实现并对外提供的一组接口。

在这里插入图片描述
8,敏捷过程
(1)
个体和交互 胜过 过程和工具
可工作软件 胜过 宽泛的文档
客户合作 胜过 合同谈判
响应变化 胜过 遵循计划
(2)分类:极限编程(extreme programming ,XP),Scrum(争球)
(3)极限变成:
简单设计:通过保持代码简单从而保证设计简单。
测试驱动开发:在编写代码前先编写测试内容 。
重构:用来移除代码中的重复内容和复杂之处 。
结对编程:两个成员使用一台计算机开发所有的代码。
集体代码所有权:任何人都拥有所有的代码。
这就意味这每个人都可以在任何时候变更任何代码 。
持续集成:每天多次创建和集成系统,只要任何实现任务完成就要进行。
现场客户:一名真实的客户全时工作于开发环境中,帮助定义系统、编写测试内容并回答问题 。
编码标准:程序员采用一致的编码标准。
适用不超过10人的开发场合,希望同地开发,能有测试支持。
(4)Scrum
• Scrum是迭代增量式的开发过程
• 整个开发周期由若干个小的迭代周期(Sprint,冲刺)组成
• 产品订单:产品功能列表,从客户价值角度进行优先级排序
• 迭代订单:从开发技术角度划分的迭代开发任务
• 可工作软件:可交付的软件产品
• 每日例会:
• 迭代评审会议(Sprint Review Meeting)
• 燃尽图
四,软件过程成熟度模型CMM:capability maturity model for software
1,它并不是一个软件生命周期模型,而是改进软件过程的一种策略。
2,CMM将软件过程的成熟度分为5个等级,每一个成熟程度级别由几个关键过程区域组成,较为全面地描述和分析软件过程能力的发展程度,一个软件开发组织可采用一系列改良步骤向更高的成熟度等级迈进。
在这里插入图片描述
第三章 软件需求分析
1,软件需求分析分为哪4个步骤?各个步骤的主要任务是什么?
2,软件需求分析的困难是什么?
在这里插入图片描述

一,需求获取
1,通过启发、引导客户(或用户)而获得软件的原始需求,即软件的业务要求(needs),简称为N
2,需求获取技术
A. 协同工作
B. 访谈
C. 问卷调查
D. 观察法
E. 原型法
F. 文档分析
G. 建模
H. 角色扮演
3,软件的需求包括
A. 功能需求
B. 性能需求
C. 环境需求
D. 可靠性修去
E. 安全保密需求
F. 用户界面修去
G. 资源使用需求
H. 成本呢消耗需求
I. 开发进度需求
J. 将来可能提出的要求
4,需求获取应遵循的原则
A. 深入浅出的原则:需求互殴去要尽可能全面、细致。获取的需求是个全集,目标系统真正实现的是个自己。
B. 以流程为主线的原则:在与用户交流的过程中,应该用流程将所有的内容穿起来。
5,需求获取的过程
(1)开发高层的业务模型
(2)定义项目范围和高层需求
(3)识别用户类和用户代表
(4)获取具体的需求:通过与用户交流、查看文档、市场调查、问卷调查等方式
(5)确定目标系统的业务工作流
(6)需求整理和总结
在这里插入图片描述二,需求分析

1,要求:
(1)完整性:每项获取的需求都应该给出清楚的描述,使得软件开发工作能够取得设计和实现该功能所需要的全部必要信息。
(2)正确性:准确无误
(3)合理性:各项需求之间、软件需求与系统需求之间应是协调一直的,不应矛盾和冲突。
(4)可行性:技术、经济、社会可行性
(5)充分性:获取的需求是否全面、周到。
三,需求定义
1,清晰、全面、系统、准确地描述需求文档,编写需求规格说明。
软件需求规格说明书、数据要求说明书、初步的用户手册、软件开发实施计划
四,需求验证
1,定义:为了确保已定义的需求(需求规格说明)准确无误,并能为客户(或用户)理解和接受,需要对其进行严格的评审。

需求分析的困难
(1)系统的目标或范围问题
(2)需求不准确性问题
(3)需求的易变问题
(4)需求获取除了需要由专业的系统分析师,还需要通过有效的客户、开发者的合作才能成功。

在这里插入图片描述
第五章 面向对象方法与UML
1,了解UML中的事物及其分类
2,了解UML中的关系,包括依赖关系、关联关系、泛化关系和实现关系。
3,掌握UML中的5中类型的图,包括用例图、类图、顺序图、状态图、活动图

一,UML简介
1,UML(unified modeling language)统一建模语言
2,特点:
(1)统一标准
(2)面向对象
(3)可视化,表达能力强大
(4)独立于过过程:是系统建模语言,不依赖特定的开发过程
(5)容易掌握使用
(6)与变成语言的关系:支持UML的一些CASE工具可以根据UML型自动产生Java、C++等代码框架
3,组成:事物、关系和图
在这里插入图片描述
在这里插入图片描述
4,UML视图:
(1)用户模型视图
(2)结构模型视图
(3)行为模型视图
(4)实现模型视图
(5)环境模型视图

• 一个视图一般有多张图组成
• UML语言共定义了15种不同的图,把他们有机地结合起来就可以描述系统的所有视图

在这里插入图片描述
二,UML的图
1,用例图:
(1)用于需求分析阶段
(2)用例之间关系:扩展、包含、泛化

2,类图;
3,对象图:是类图的实例
4,包图:把功能或者用途相近的一个或多个类或对象用一个符号来表示,并代表所有这些类或对象的静态、动态特征
5,状态图:状态及状态转换
6,活动图:
7,顺序图
8,通信图
*9,构件图
*10,配置图
在这里插入图片描述
第四章 人机交互设计
一,人机交互设计的准则
在这里插入图片描述
用户界面应具备的特性:
1,可使用性:使用简单、界面一直,用户HELP帮助功能、快速的系统响应和低的系统成本、具有容错能力
2,灵活性:考虑到用户的特点、能力和知识水平,应当使用户接口满足不同用户的要求
3,可靠性:用户界面的可靠性是指无故障使用的间隔时间。用户界面应能保证用户正确、可靠地使用系统,保证有关程序和数据的安全性。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第五章 面向对象方法与UML
一,面向对象的概念
1,80年代后期,面向对象的语言开始浮出水面,C++借助C语言的庞大程序员队伍,一举建立了面向对象语言的老大地位。从而OO(面向对象)的思想正式统治 了整个软禁啊开发界。
2,自然语言与编程语言之间存在着很大的差距,称为语言的鸿沟。

在这里插入图片描述

3,对象:是包含现实世界物体特征的抽象实体,是其属性和相关操作的封装。
对象和实例的区别:
(1)对象既可指一个具体的对象,可以泛指一般的对象。
(2)实例必须是一个具体的对象。
4,消息:一个对象与另一个对象的通信单元,是要求某个对象执行类中定义的某个操作的规格说明。是一个对象向另一个对象发出的服务请求。

二,面向对象三大特性
1,封装:尽可能隐蔽对象的内部细节,只保留有限的外部接口。
• 清楚的边界,所有对象的内部信息被限定在这个边界内。
• 接口:即对象向外界提供的方法,外界可以通过这些方法与对象进行交互
• 受保护的内部实现,实现细节不能从类外访问
2,继承
3,多态
三,面向对象方法优势
1,面向对象方法学的基本思想
(1)从现实世界的客观存在的事物(即对象)出发,来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式。
(2)人类认知过程的计算机模拟
2,OO方法学的主要优点(面向对象方法学的主要优点)
(1)问题的结构空间和软件的解空间是一致的。
问题的结构空间:指问题涉及的业务范围
软件的解空间:计算机解决问题域问题的解法。
(2)系统的稳定性好:面向对象(基本稳定,可能会增加新对象)
在这里插入图片描述

(3)可重用性好:派生继承
(4)可维护性好:面向对象的软件稳定性好、容易理解、容易修改、易于测试和调试。
3,面向对象的软件开发方法----
(1)Rumbaugh方法:对象模型化技术(OMT),用于分析、系统设计和对象级设计
• 分析活动建立三个模型
○ 对象模型:描述对象、类、层次和关系
○ 动态模型:描述对象和系统的行为
○ 功能模型:类似于高层的DFD
• 适用于描述和分析以数据为中心的信息系统

第六章 面向对象分析
1,了解面向对象分析中的三个模型和五个层次
2,掌握有关用例模型、对象模型和动态模型的基本概念
3,能够针对具体应用、建立用例模型、对象模型和动态模型(状态图和顺序图)的过程

一,面向对象分析概述
1,定义:面向对象分析就是抽取和整理用户需求并建立问题域精确模型的过程
2,面向对象分析的3个模型:(对象模型的5个层次)
(1)用例模型:用例和场景表示的功能模型:定义“做什么”
(2)对象模型:用类和对象表示的静态模型:定义“谁来做”“对谁做”
• 主题层:把一组具有较强联系的类组织在一起而得到的类的集合
○ 主题是由一组类构成的集合,它本身不是类
在这里插入图片描述
在这里插入图片描述
• 结构层
• 服务层
• 属性层
• 类与对象层:通过建立类图类表示对象模型
○ 如何发现聚合(整体——部分)关系:物理上的整体与部分、组织机构和它的下级机构、团体和成员、空间上的包容、抽象事物的整体和部分
(3)交互模型:由状态图和顺序图表示的动态模型:定义“何时做”“如何做”
• 顺序图、活动图、状态图
二,建立用例模型:
1,建立用例模型的过程
(1)确定业务参与者:标识目标系统将支持的不同类型的用户,可以是人、事件或其他系统
(2)确定业务需求用例:参与者需要系统提供的完整功能
2,创建用例图:标识参与者与用例之间、用例与用例之间的关系
3,用例的规格说明:用例名称、参与者、前置条件、后置条件、一个主事件流(正常情况下执行者与系统之间的信息交互及动作序列)、零到多个备选事件流(特殊情况或异常情况下的信息交互及动作序列)。

第七章 面向对象设计原则与软件设计模式
1,掌握面向对象设计原则
• 单一职责原则
• 开闭原则
• 里氏代换原则
• 依赖倒转原则
• 合成复用原则
• 接口隔离原则
• 迪米特法则
2,掌握设计模式的概念
3,掌握常用的设计模式
• 单例模式
• 简单工厂模式
• 工厂方法模式
• 抽象工厂模式
• 适配器模式
• 外观模式
• 桥接模式
• 观察者模式
• 迭代器模式

一,当前设计中存在的问题、好的设计
(一)问题
1,过于僵硬(Rigidity):很难加入新的功能,新加入的模块会波及其他,而且范围越来越大,最后不得不放弃
2,过于脆弱(Fraility):与僵硬共存,修改某个地方却导致不相关的其他地方发生故障,而且难以预料
3,复用率低(Immobility)
4,黏度过高(Viscosity)
(二)什么是好的设计
1,可扩展性(extensibility)
2,灵活性(flexibility)
3,可插入性(Pluggability):容易将一个类抽出去,同时将另一个有同样接口的类加入进来

二,常用的面向对象设计原则
在这里插入图片描述

1,单一职责原则:
(1)定义:一个对象应该只包含的单一的职责,并且该职责被完整地封装在一个类中。
就一个类而言,应该仅有一个引起它变化的原因。
2,开闭原则(Open-Closed Principle,OCP)
(1)定义:一个软件实体应该对扩展开放、对修改关闭
(2)抽象化是开闭原则的关键
(3)“对可变性封装原则”:要求找到系统的可变因素并将其封装起来
3,里氏代换原则:子类对象可以看作是其父类的一个对象,反之不可
(1)定义:在软件中如果能够使用基类对象,那么一定能够使用其子类对象
• 把基类都替换成它的子类,程序将不会产生任何错误和异常,反过来则不成立
• 在程序中尽量是基类类型来对对象进行定义,而在运行时在确定其子类类型,用子类对象来替换父类对象。
(2)对象的上转型对象:
• 上转型对象可以操作子类继承或重写的成员变量,也可以使用子类继承的或重写的方法。
上转型对象不能操作子类新增的成员变量和子类新增的方法。
Class Employee{ }
Class Manager extends employee{ }
Employee em = new Manager();
• 若父类对象引用指向的实际是一个子类对象,则这个父类对象的引用可以用强制类型转换转化成子类对象的引用。之后就可以操作子类新增的成员变量和子类新增的方法
class Employee{……}
class Manager extends Employee{……}
则:Employee e = new Manager(); //合法语句
((Manager)e).method();
• 方法的形参是父类对象,实参可以是子类对象。
class Employee{……}
class Manager extends Employee{……}
class Test{
……
public void method (Employee e)
{
……
}
}
4,依赖倒转原则:针对接口编程,不要针对实现编程
(1)实现开闭原则的关键是抽象化,并且抽象化到处具体化实现,如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要手段。
(2)依赖注入:依赖注入是指当一个对象要与其他对象发生依赖关系时,通过抽象来注入所依赖的对象。
• 构造注入:通过构造函数注入实例变量
• 设置注入:通过Setter方法注入实例变量
• 接口注入:通过接口方法注入实例变量
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【重要】泛化关系(继承)和聚合关系(组成关系)
在这里插入图片描述
5,合成复用原则:尽量使用对象组合,而不是继承来达到复用的目的
(1)在一个新的对象里通过关联关系或聚合关系来使用一些已有的对象,使之成为新对象的一部分。(尽量使用组合、聚合关系,少用继承)
6,接口隔离原则:
(1)一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。在这里插入图片描述
在这里插入图片描述
7,迪米特法则(最少知识原则):一个软件实体应当尽可能少的与其他实体发生相互作用:侠义的、广义的
(1)不要和陌生人说话
• 朋友:对象本身、以参数形式传入到当前对象方法中的对象、当前对象的成员对象、当前对象所在集合的元素
(2)只与你的直接朋友通信
(3)每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
在这里插入图片描述
在这里插入图片描述
第八章 面向对象设计
1,了解软件系统分解的方法
2,掌握典型的面向对象设计模型
3,了解4个子系统的设计方法

一,面向对象设计过程
1,设计系统体系结构
2,对各个子系统进行设计
3,对象设计及优化
二,系统体系结构设计
1,子系统和类
(1)在大型和复杂的软件系统情形,首先根据需求的功能模型(用例模型),将系统分解成若干个部分,每一个部分又可分解为若干子系统或类,每个子系统还可以由更小的子系统或类组成。
2,系统体系结构设计
(1)Coad&Yourdon的面向对象设计模型
• 基于MVC(model-view-controller)模型,在逻辑上将系统划分为4个部分,分别是问题域部分、人机交互部分、任务管理部分及数据管理部分,每一部分又可分为若干子系统。
• Coad 与 Yourdon 在设计阶段中继续采用了分析阶段中提到的5个层次,用于建立系统的4个组成成分。每一个子系统都由主题、类-&-对象、结构、属性和服务5个层次组成。这5个层次可以被当作整个模型的水平切片。
在这里插入图片描述

(2)类的三种形式
• 边界类:位于系统与外界的交界处,包括窗体、报表、打印机等硬件接口以及与其他系统的接口。边界类使角色能与系统交互。
• 实体类:表示系统将跟踪的持久信息
• 控制类:将边界类与实体类关联起来完成指定的功能。
在这里插入图片描述

三,各部分的设计
1,问题域部分的设计:
(1)调正需求
(2)复用已有的类
(3)调整继承的支持级别:使用单继承机制
• 化为的单一层次
• 使用映射分解多重继承

在这里插入图片描述在这里插入图片描述

(4)改进性能:
• 如果类之间经常需要传送大量消息,可合并相关的类
• 增加某些属性到原来的类中,或增加底层的类,以保存暂时结果,避免每次都要重复计算造成速度损失
2,人机交互部分的设计
(1)从系统的输入、输出及与用户的交互中获取信息,定义界面对象和行为(操作)
(2)定义那些导致用户界面状态发生变化的事件,对事件建模
(3)描述最终向用户展示的每一个界面的状态
(4)简要说明用户如何从界面提供的界面信息来解释系统状态。
3,数据管理部分的设计
(1)UML类图映射到关系数据库
• 一个普通的类可以映射为一个表或多个表:横切或竖切
• 关联关系的映射:
○ 一对一关联:两个表都引入外键、合并
○ 一对多:多含外键
○ 多对多:引入关联表
• 继承关系:
○ 基类映射到一张表,每个子类映射到一张表
○ 将每个子类映射到一张表,没有积累表

第九章 编码
1,理解程序设计风格的重要性
程序实际上也是一种供人阅读的文章,有一个文章的风格问题。应该使程序具有良好的风格。
2,了解程序设计风格的4个方面
(1)源程序文档化
• 标识符的命名
• 安排注释:序言性注释和功能性注释
• 程序的视觉组织
(2)数据说明标准化
在这里插入图片描述

(3)语句结构简单化:“如果我不是编码的人,我能看懂它吗?”
• 一行只写一条语句
• 程序编写首先应当考虑清晰性:清晰第一,效率第二
• 让编译程序做简单的优化
• 尽可能使用库函数
• 避免不必要的转移
(4)输入、输出规范化

3,重构的概念、目的、具体做法
(1)概念:在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构
重构的本质:在代码写好之后改进它的色痕迹
(2)目的:
• 改进软件的设计
• 使软件更容易理解
• 帮助尽早的发现错误
• 提高编程速度
(3)何时重构
• 添加功能时重构:程序员 需要先读懂代码
• 修改错误时重构
• 复审代码使重构
(4)重构的流程
• 读懂代码(包括测试例子代码)
• 重构
• 运行所有的Unit Tests
(5)重构工具
4,逆向工程
(1)定义:反向工程,分析已有的程序,寻求比源代码更高级的抽象表现形式
在这里插入图片描述

通常把编码和测试统称为实现

第十章 软件测试
1,了解软件测试的概念、软件测试的目标
2,掌握白盒测试中使用逻辑覆盖和基本路径测试的测试用例设计方法
3,掌握程序控制流程图的画法及环路复杂性的计算方法
4,掌握黑盒测试用例设计的方法:等价类划分法、边界值分析
5,了解软件测试的步骤和策略,包括单元测试、组装测试、确认测试和系统测试

一,软件测试基础
1,概念
(1)软件测试是为了发现错误而执行程序的过程
(2)软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例,并利用这些测试用例去运行程序,一发现程序错误的过程2
2,程序测试能证明错误的存在,但不能证明错误不存在
3,测试用例=【(输入数据),(预期结果)】
4,在设计测试用例时,应该包括合理的输入条件和不合理的输入条件
5,测试方法分类
(1)机器测试
• 黑盒测试(功能测试、数据驱动测试)
• 白盒测试(结构测试、逻辑驱动测试)
(2)人工测试
• 代码审查:小组会
• 走查:小组会
• 桌前检查
6,测试数据分类
(1)穷举测试
• 黑盒穷举测试
• 白盒穷举测试
(2)选择测试
二,白盒测试技术
(一)逻辑覆盖:
1,语句覆盖:每一个可执行语句至少执行一次
2,判定覆盖:使得程序中每个判断框的取真分支和取假分支至少执行一次
3,条件覆盖:使得每个条件的可能取值至少执行一次
在这里插入图片描述

4,判定-条件覆盖:每个判断框的所有可能取值至少执行一次,判断框中每个条件的所有可能取值至少执行一次
5,条件组合覆盖(排列组合):使得每个判断框的所有可能的条件取值组合至少执行一次
6,路径覆盖:覆盖程序中所有可能的路路径
路径覆盖并不一定达到条件组合覆盖
(1)环路复杂度:程序控制流的复杂性度量方法,它基于一个程序模块的流图中的环路的个数
在这里插入图片描述

• 对于复杂度超过10的程序,应分为几个小程序,以减少程序中的错误

(2)基本路径测试
在这里插入图片描述

(3)循环测试路径选择:简单循环、嵌套循环、串接循环
• 简单循环:零次、一次、二次、m次、n次、n+1、n-1
• 嵌套循环:内层循环变量置为最小值,逐步外推

三,黑盒测试技术
1,等价类划分:
(1)等价类划分法:把所有可能的输入数据,即程序的输入与划分成若干部分,然后从每一部分中选取少数有代表性的数据作为测试用例
(2)等价类:某个输入域的子集合。在该子集合中,各个输入数据对揭露程序中的错误都是等效的。测试某等价的代表值就等价于对这一类其他值的测试。
(3)步骤:划分等价类(列出等价类表)、选取测试用例
• 有效等价类:对于程序的规格说明来说,是合理的、有意义的输入数据构成的集合。
• 无效等价类:不合理、无意义的输入
(4)从等价类中选择测试用例的原则:
• 设计一个新的测试用例,是其尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止。
• 设计一个新的测试用例,是其尽可能多地覆盖尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。

2,边界值分析
(1)大量的错误都发生在输入或输出范围的边界上,而不是在输入范围的内部
3,错误推测法
列举出程序中所有可能有的错误和容易发生错误的的特殊情况,根据他们选择测试用例
四,软件测试步骤
1,单元测试
在这里插入图片描述

(1)辅助模块:驱动模块、存根模块(桩模块)

2,组装测试
(1)模块组装方式:一次性组装方式、增殖式组装方式(自顶向下、自底向上、混合增值)
• 自顶向下的增殖方式
在这里插入图片描述

	○ 优点:
		§ 不需要建立驱动模块
		§ 在测试过程中较早地验证了主要的控制和判断点
		§ 选用按深度方向组装的方式,可以首先实现和验证一个完整的软件功能
	○ 缺点
		§ 需要编写桩模块
		§ 用桩模块代替下层模块,没有重要的数据自下往上流
• 自底向上的增值方式
	○ 优点:
		§ 不需要桩模块,建立驱动模块比建立桩模块容易
		§ 对底层模块设计的复杂算法问题,能较早地发现
		§ 底层模块可以实现并行测试,提高测试小v
	○ 缺点:
		§ 程序一直未能作为一个实体存在,因此就较晚地实现和验证系统的主要功能

在这里插入图片描述

(2)回归测试:重新执行已经做过的测试的某个子集,保证新的变化没有带来非预期的副作用

3,确认测试
(1)定义:验证软件的功能和性能及其它特性是否与用户的要求一致,又称验收测试。
(2)a测试(开发环境下)、β测试(用户在实际使用环境下)

4,系统测试
(1)定义:系统测试(system testing)是将软件作为整个计算机系统的一个元素,与硬件、其他软件、数据、人员等其他系统元素结合在一起,在实际使用环境下,对计算机系统进行一系列的组装测试和确认测试。
在这里插入图片描述
第七章 设计模式概述
一,设计模式的定义:
1,设计模式描述了软件色痕迹过程中某一类常见问题的一般性的解决方案
2,设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是未来可重用代码、让代码更容易被让人理解、保证代码可靠性
3,分类:
(1)创建型模式:主要用于创建对象
(2)结构型模式:主要用于处理类或对象的组合
(3)行为型模式:主要用于描述对类或对象怎样交互和怎样分配职责

二,创建型模式:
在这里插入图片描述

1,简单工厂模式
(1)Java反射
• 反射是指在程序运行是获取已知名称的类或已有对象的相关信息的一种机制。
• 反射机制支持在运行状态中动态地获取类的信息,提供动态调用对象的能力。
(2)Class对象
• 每个运行的Java类都有一个相应的Class对象
2,工厂方法模式
3,抽象工厂模式
4,建造者模式
5,原型模式
6,单例模式
(1)定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类成为单例类
(2)要点:
• 某个类只能有一个实例
• 它必须自行创建这个实例
• 它必须自行向整个系统提供这个实例
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值