考试题型:选择题(20),名词解释(12),简答题(30),综合题(38)
注:以下资料来自各种渠道进行筛选整理的!!!
软件工程知识点总结——第零部分
软件过程定义:
为创建高质量软件所需要完成的活动、动作和任务的框架。
软件过程与软件工程的区别:
软件过程定义了软件工程化中采用的方法,但软件工程还包含该过程中应用的技术——技术方法和自动化工具。软件工程是由有创造力、有知识的人完成的,他们根据产品构建的需要和市场需求来选取成熟的软件过程。
过程流类型:
线性过程流——从沟通到部署顺序执行五个框架活动
迭代过程流——在执行下一个活动前重复执行之前的一个或者多个活动
演化过程流——采用循环的方式执行各个活动,每次循环都能产生更为完善的软件版本
并行过程流——将一个或者多个活动与其他活动并行执行
过程模式的定义:
过程模式描述了软件工程工作中遇到的过程相关的问题,明确了问题环境并给出了针对该问题的一种或者几种可证明的解决方案。
Ambler过程模式模板:
模式名称:应清楚地表达该模式在软件过程中的含义,比如,技术评审。
驱动力(目的):模式使用环境及主要问题,以明确主要难点。
类型:步骤模式(定义框架活动)、任务模式 (定义软件工程动作或任务)、阶段模式(定义框架活动序列){ ps:阶段模式是有序列的步骤模式的集合,步骤模式包括若干个任务模式 }
启动条件:模式应用前需满足的前提条件(输入) 。需要明确:
(1)在此之前,整个开发组织或者开发团队内已有哪些活动?
(2)已有哪些软件工程信息或是项目信息?
(3)过程的进入状态是什么?
问题:描述模式将要解决的具体问题。
解决办法:描述如何成功实现模式。
结束条件:描述模式成功执行之后的结果(输出)。模式结束时需要明确:
(1)必须完成哪些开发组织或是开发团队相关的活动?
(2)过程的结束状态是什么?
(3)产生了哪些软件工程信息或是项目信息?
相关模式:列举与该模式直接相关的其它过程模式。
已知应用实例:说明该模式可应用的具体实例。(什么场合使用)
具体示例:
回归测试过程模式
模式名称:回归测试 (指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误)。
目的:构造一种测试的过程。
类型:任务模式。
启动条件:在模式启动之前必须满足以下三个条件:(1)原来的测试用例;(2)更新后的软件;(3)针对更新部分的新测试用例。
问题:要测试模块。
解决方法:先用原来的测试用例测试软件,再用新测试用例测试软件。
结束条件:完成测试的软件。
相关模式:测试、单元测试、系统测试。
已知应用实例:更新软件后建议使用
惯用过程模型的概念
目标:使软件开发更加有序。
所有的软件过程模型都支持通用框架活动,但是每一个模型都对框架活动有不同的侧重。也称软件生存周期模型
瀑布模型
定义:
将软件生存周期的各项活动规定为依固定顺序连接(瀑布般)的若干阶段工作:即从用户需求规格说明开始,顺序地通过沟通、策划、建模、构建和部署过程,最终提供完整的软件和持续的技术支持。又称为经典生命周期。
前提:
需求必须是 准确定义 和 相对稳定的。
特点:
各个阶段间具有顺序性和依赖性;
推迟实现的观点:前面步骤完成后才考虑实现;
质量保证的观点:每一阶段都需要有文档以及经过评审;
问题:
瀑布模型需要明确的客户需求,但客户难以准确表达所有需求。
得到可执行程序的时间太迟,滞后的缺陷导致陷入困境。
可能导致一些阻塞,浪费过多等待时间。
过于理想化,难以应对开发过程中的各种不确定因素。
变体:
V模型——瀑布模型与V模型没有本质区别,V模型提供了一种将验证确认动作应用于早期软件工程工作中的方法。
定义:
增量模型综合了线性过程流和并行过程流的特征:随着时间的推移,增量模型在每个阶段运用线性序列;每个线性序列以一种演化过程流的方式生产出软件的可交付增量。以迭代方式运用瀑布模式。
前提:
需求不明确或迫切需要为用户迅速提供一套功能有限的软件产品,然后在后续版本中再进行细化和扩展功能。
特点:
运用增量模型时,第一个增量往往是核心产品(core product),能够满足基本的需求,但是许多附加的特性(一些是已知的,一些是未知的)没有提供。客户通过使用该核心产品进行详细评价,并根据评价结果制定下一个增量计划。这份增量计划说明了需要对核心产品进行的修改,以便更好地满足客户的要求,也说明了需要增加的特性和功能。
问题:
把用户需求转化为功能递增的不同版本可能比较难 (很多时候各个功能联系紧密,难以完全分开)
难以确定所有版本共需的公用模块。(通常在进行设计时会先考虑设计公用模块,但是每一个增量只考虑局部的设计,因此,全局的公用模块很难确定)
变体:
迭代式开发——迭代式开发是增量式开发的一种变体,不同于传统的增量开发(每次提交一个构件),迭代式开发开始提交所有的模块(部分模块有待优化),在其后的阶段逐渐优化。
演化过程模型
定义:
演化模型是迭代的过程模型,每次迭代产生软件的一个更完整的版本。
前提:
开发过程中,业务和产品需求经常变化;
严格的交付时间使得开发团队不可能圆满完成软件产品,但是必须交付功能有限的版本以及应对竞争或商业压力;
往往很好地理解了核心产品需求,但是系统扩展的细节问题却没有定义。
问题:
首先,由于构建产品的迭代周期数目不确定,原型开发(和其他更加复杂的演化过程)给项目计划带来了困难。大多数的项目管理和估算技术是基于活动的线性布局,所以并不完全适用于演化软件过程。
其次,演化模型没有确定演化的最快速度。如果演化的速度太快,完全没有间歇时间,项目肯定会陷入混乱;反之,如果演化速度太慢,则会影响生产率。
再次,演化模型侧重灵活性和可延展性,而不是高质量。这种说法听起来很惊人。演化模型优先追求开发速度,而不是零缺陷。
定义:
原型开发模型开始于沟通。软件开发人员和利益相关者进行会晤,定义软件的整体目标,明确已知的需求,并大致勾画出以后再进一步定义的东西。
迅速策划一个原型开发并进行建模(以快速设计的方式)。快速设计要集中在那些最终用户能够看到的方面,比如人机接口布局或者输出显示格式。
快速设计产生了一个原型。
对原型进行部署,然后由利益相关者进行评价。根据利益相关者的反馈信息,进一步细化软件的需求。
在原型系统不断调整以满足各种利益相关者需求的过程中,采用迭代技术,同时也使开发者逐步清楚用户的需求。
前提:
客户:提出了一些基本功能,但未详细定义输入、处理和输出需求;
开发人员:可能对开发运行环境、算法效率、操作系统的兼容性和人机交互等情况不确定。
问题:
1.利益相关者看到了软件的工作版本,却未察觉到整个软件是随意搭成的,也未察觉到为了尽快完成软件,开发者没有考虑整体软件质量和长期的可维护性。当开发者告诉客户整个系统需要重建以提高软件质量的时候,利益相关者会不愿意,并且要求对软件稍加修改使其变为一个可运行的产品。因此,软件开发管理往往陷入失效。
2.作为一名软件工程师,软件开发人员为了使一个原型快速运行起来,往往在实现过程中采用折衷的手段。他们经常会使用不合适的操作系统或程序设计语言,仅仅因为当时可用和熟悉。他们也经常会采用一种低效的算法,仅为了证明系统的能力。时间长了,软件开发人员可能会适应这些选择,而忽略了这些选择其实并不合适的理由,结果造成并不完美的选择变成了系统的组成部分的情况。
定义:
风险驱动的软件开发模型,采用循环的方式,逐步加深系统定义和实现的深度(原型开发的迭代性质);确定一系列里程碑,确保利益相关者都支持系统解决方案(瀑布模型的系统性和可控性);第一圈一般开发出产品的需求规格说明,接下来开发产品的原型系统,并在每次迭代中逐步完善,开发不同的软件版本;项目经理还会调整完成软件开发需要迭代的次数;
前提:
开发大型系统和软件;需要把控风险;
专用过程模型具有传统过程模型的一些特点,但是专用过程模型往往应用面较窄而专一,只适用某些特定的软件工程方法。
构件开发模型
概念:
本质上是演化模型,具有多螺旋模型的特点,利用迭代方式构件软件;与演化模型不同,基于构件开发模型采用预先打包的软件构件开发应用系统;
内容:
建模和构建活动开始于识别可选构件。这些构件有些设计成通用的软件模块,有些设计成面向对象的类或软件包。不考虑构件的开发技术,基于构件开发模型由以下步骤组成(采用演化方法):
1. 对于该问题领域研究和评估可用的基于构件的产品。
2. 考虑构件集成的问题。
3. 设计软件架构以容纳这些构件。
4. 将构件集成到架构中。
5. 进行充分的测试以保证功能正常。
优点:
能够使软件复用,减少项目开发费用,缩短开发周期
形式化方法模型
概念:
形式化方法模型的主要活动是生成计算机软件形式化的数学规格说明,使得软件开发人员可以应用严格的数学符号来说明、开发和验证系统。
优点:
应用数学分析的方法,歧义性问题、不完整问题、不一致问题等都能够更容易地发现和改正。在设计阶段,形式化方法是程序验证的基础,使软件开发人员能够发现和改正一些往往被忽略的问题。
缺点:
开发非常耗时,成本也很高;
只有极少数程序员具有应用形式化的背景,需要大量的培训;
对于技术水平不高的客户,很难用这种模型进行沟通。
应用:
高度关注安全性的软件(飞行器、医疗设施、经济领域)
由Booch、Jacobson及Rumbaugh提出,注重于客户沟通以及从用户的角度描述系统,强调软件体系结构的重要性。
统一过程认识到与客户沟通以及从用户的角度描述系统并保持该描述的一致性的重要性。
特点:
用例驱动,以架构为核心,迭代并且增量。
UML包含了大量用于面向对象系统建模和开发的符号。到了1997年,UML已经变成了面向对象软件开发的实际标准。
UML提供了支持面向对象软件工程实践必要的技术,但它没有提供指导项目团队使用该技术时的过程框架。接下来的几年中,Jacobson,Rumbaugh和Booch建立了统一过程模型,这是用UML进行面向对象软件工程的框架。目前,统一过程和UML广泛应用在各种各样的面向对象项目中。
统一过程(UP,Unified Process)有5个阶段,分别是起始阶段、细化阶段、构建阶段、转换阶段和生产阶段。有可能在构建、转换和生产阶段的同时,下一个软件增量的工作已经开始。这就意味着五个UP阶段并不是顺序进行,而是阶段性地并发进行。
1.起始阶段(inception phase)
包括客户沟通和策划活动。通过与利益相关者协作定义软件的业务需求,提出系统大致的架构,并制定开发计划以保证项目开发具有迭代和增量的特性。
该阶段识别基本的业务需求,并初步用用例描述每一类用户所需要的主要特征和功能。此时的体系架构仅是主要子系统及其功能、特性的试探性概括。
随后,体系结构将被细化和扩充成为一组模型,以描述系统的不同视图。策划识别各种资源,评估主要风险,制定进度计划,并为其在软件增量开发的各个阶段中的应用建立基础。
2.细化阶段(elaboration phase)
包括沟通和通用过程模型的建模活动。细化阶段扩展了初始阶段定义的用例,并扩展了体系结构用以包括软件的五种视图——用例模型、需求模型、设计模型、实现模型和部署模型。
在某些情况下,细化阶段建立了一个“可执行的体系结构基线”,这是建立可执行系统的“第一步”。
体系结构基线证明了体系结构的可实现性,但没有提供系统使用所需的所有功能和特性。
另外,在细化的最终阶段将评审项目计划以确保项目的范围、风险和交付日期的合理性。该阶段对项目计划进行修订。
3.构建阶段(construction phase)
与通用软件过程中的构建活动相同。构建阶段采用体系结构模型作为输入,开发或是获取软件构件,使得最终用户能够操作用例。
为达到上述目的,要对需求模型和设计模型加以完善,以反映出软件增量的最终版本。软件增量(例如发布的版本)所必须要求的特性和功能在源代码中实现。
随着构件的实现,对每一个构件设计并实施单元测试。另外,还实施了其他集成活动(构件组装和集成测试)。
用例被用来导出一组验收测试,以便在下个UP阶段开始前执行
4.转换阶段(transition phase)
包括通用构建活动的后期阶段以及通用部署(交付和反馈)活动的第一部分。
软件被提交给最终用户进行Beta测试,用户反馈报告缺陷及必要的变更。
另外,软件开发团队创建系统发布所必要的支持信息(如用户手册、问题解决指南及安装步骤)。
在转换阶段结束时,软件增量成为可用的发布版本。
5.生产阶段(production phase)
与通用过程的部署活动一致。
在该阶段,监控软件的持续使用,提供运行环境(基础设施)的支持,提交并评估缺陷报告和变更请求。
如果过程很薄弱,则最终产品必将受到影响。但是对过程的过分依赖也是很危险的。所以产品(创造力、个性)和过程(按部就班,标准,流程)的二象性已经成为保留推动软件工程不断进步的创造性人才的一个重要因素。
1.请描述三个适用于瀑布模型的软件项目。
答:
图书馆管理系统、学生信息管理系统、销售系统。(ps:大部分只要需求明确且需求相对稳定的软件系统都可以使用瀑布模型)
2.请描述三个适用于原型模型的软件项目。
答:
一个位于火车站的交互式火车车次查询系统、Android可视化编程软件、图像编辑软件。(ps:人机交互和/或复杂计算机图形软件应用程序一般适用于原型模型开发)
3.如果将原型变成一个可发布的系统或者产品,应该如何调整过程?
答:
将原型变成一个可发布的系统或产品,软件工程师和客户需要满足和定义软件的总体目标,识别已知的任何要求,对整体轮廓进一步的强制定义。
4.请描述三个适用于增量模型的软件项目。
答:
文字处理软件、五子棋游戏、IT技术交流社区。(ps:大部分软件都可以满足增量模型,尤其是游戏)
5.可以合用几种过程模型吗?如果可以,请举例说明。
答:
过程模型可以合用,比如开发图像编辑软件,可以先采用原型开发,设计出大体的软件界面,后面在采用增量模型,一步一步添加相关功能。
6.开发质量”足够好“的软件,其优点和缺点是什么?也就是说 当我们追求开发速度胜过产品质量的时候,会产生什么后果?
答:
开发质量“足够好”的软件可能会碰到死亡线(截止时间),但质量会是比较好的。当追求开发速度超过了产品的质量,这可能会导致许多缺陷,该软件可能需要更多的测试,设计和实施工作。需求定义的不是很清楚,可能需要不断地改变。甚至可能导致无法检测到重大的项目风险,造成不必要的事故。
7.请描述三个适用于基于构件模型的软件项目。
答:
外卖APP、银行管理系统、微博。(ps:大部分功能可以划分为模块的软件都可以用基于构件的开发模式,尤其是包含实名认证和定位的软件)
8.我们可以证明一个软件构件甚至整个程序的正确性,可是为什么并不是每个人都这样做?
答:
这是可能的用数学技术来证明软件组件,甚至整个程序的正确性。然而,对于复杂的程序,这是一个非常耗时的过程。
9.统一过程和UML是同一概念吗?解释你的答案。
答:
不是,统一过程是软件工程开发的一种软件过程,而UML是一种建模语言,是一种表示方法。
敏捷开发的定义:
它是一种软件开发方法论,可以应对客户快速变更的需求。它强调以人为核心,采用迭代的方式,循序渐进地开发软件。
软件开发的传统方法中(有几十年的开发经验作支持),变更的成本费用随着计划的进展成非线性增长。
敏捷的拥护者认为,一个设计良好的敏捷过程“拉平”了变更成本曲线,使软件开发团队在没有超常规的时间和费用影响的情况下,在软件项目后期能够适应各种变化。
敏捷过程包括增量交付。当增量交付与其他敏捷实践耦合时,例如连续单元测试及结对编程,引起变更的费用会衰减。
虽然关于拉平曲线的程度的讨论仍然在进行,但是证据表明,敏捷变更费用显著降低。
敏捷过程的定义:
基于敏捷原则进行的软件开发过程,视为敏捷过程。所谓“基于”,是指充分考虑,而不是全部包含。
敏捷过程的三大假设
敏捷原则
★并不是每一个敏捷模型都同等使用这12项原则,一些模型可以选择忽略(或至少淡化)一个或多个原则的重要性。
使用的最为广泛的敏捷过程。
三个特点:
极限编程过程
XP使用面向对象方法作为推荐的开发范型,它包含了策划、设计、编码和测试4个框架活动的规则和实践。
策划:
建立一系列描述待开发软件必要特征与功能的“故事” (故事:由客户谈论系统应该完成什么功能,然后用通俗的自然语言,使用自己的语汇,将其写在卡片上);
评估每一个故事,并给出以开发周数为度量单位的成本;
客户和XP团队共同决定如何对故事分组,并置于将要开发的下一个发行版本中(下一个软件增量);
形成关于一个发布版本的基本承诺;
对有待开发的故事进行排序:(1)所有选定故事 (下一个增量)将在几周之内尽快实现;(2)具有最高权值的故事将移到进度表的前面并首先实现;(3)高风险故事将首先实现。
在第一个版本发布之后,XP团队计算项目的速度。项目速度由第一个发行版本中实现的客户故事个数来决定。
项目速度将用于: (1) 帮助估计后续发行版本的发布日期和进度安排;(2) 确定是否对整个开发项目中的所有故事有过分承诺。一旦发生过分承诺,则调整软件发行版本的内容或者改变最终交付日期。
在开发过程中,客户可以增加故事,改变故事的权值,分解或者去掉故事。然后由XP团队重新考虑并修改计划。
设计:
严格遵循KIS (Keep It Simple)原则,即使用简单而不是复杂的表述。不鼓励额外功能性(因开发者假定以后会用到)设计。
鼓励使用CRC卡(类-责任-协作者)确定与当前软件增量相关的面向对象的类。
在某个故事设计中遇到困难时,立即建立这部分设计的可执行原型,实现并评估设计原型 (Spike解决方案:让不明确的评估成为明确的评估),其目的是在真正的实现开始时降低风险,对可能存在设计问题的故事确认其最初的估计。
鼓励“重构”。【重构:是以不改变代码外部行为而改进其内部结构的方式来修改软件系统的过程。实质上,重构就是在编码完成之后改进代码设计 (设计优化,代码优化)。重构所需工作量随着应用软件规模的增长而急剧增长。】
编码:
XP推荐在故事开发和初步设计完成之后,团队不是直接开始编码,而是开发一系列用于检测本次(软件增量)发布的包括所有故事的单元测试。一旦编码完成,就可以立即完成单元测试,从而向开发者提供即时的反馈。(先开发测试用例,然后再编码)
结对编程。XP建议两个人面对同一台计算机共同为一个故事开发代码。这一方案提供了实时解决问题 (两个人总比一个人强)和实时质量保证的机制 (在代码写出后及时得到复审),同时也使得开发者能集中精力于手头的问题。
实施中不同成员担任的角色略有不同,例如,一名成员考虑设计特定部分的编码细节;而另一名成员确保编码遵循的标准。
当结对的两人完成其工作,他们所开发的代码将与其他人的工作集成起来。有些情况下,团队(专人)进行集成。还有一些情况下,结对者自己负责集成,这种“连续集成”策略有助于避免兼容性和接口问题。
测试:
建立的单元测试应当使用一个可以自动实施的框架(因此易于执行并可重复),这种方式支持代码修改之后即时的回归测试策略。
将个人单元测试组织到一个“通用测试集”,与传统方式不同,每天都可以进行系统的集成和确认测试,可以为XP团队提供连续的进展指示,也可在一旦发生问题的时候及早提出预警。 “每几个小时修改一些小问题,比仅在最后截止期之前修正大问题要节省时间。”
XP验收测试,也称为客户测试 (由客户主导),由客户规定技术条件,并且着眼于客户可见的、可评审的系统级的特征和功能。验收测试根据本次软件发布中所实现的用户故事而确定。
工业极限编程
工业极限编程(IXP)是XP的一种有机进化。IXP合并了六个新实践:1. 准备评估;2. 项目社区;3. 项目特许;4. 测试驱动管理;5. 回顾;6. 持续学习;
准备评估
在IXP项目开始执行前,组织机构应进行准备评估(readiness assessment)。评估应确定是否:
项目社区
经典XP建议选择适合的人员组成敏捷团队可以确保成功。就是说团队成员必须经过良好的训练,具有良好的适应性和技能,以及适宜的性格为自组织团队做出贡献。
当在一个大型组织内将IXP应用于重要的项目,团队的概念就变成社区。一个社区可能拥有一个技术专家,处于项目成功核心地位的客户们,以及其他利益相关者(例如,法律人员、质量检验员、生产或销售人员),“他们通常位于IXP计划的周边,但在项目中他们扮演着重要的角色”。
在IXP内,应明确定义社区成员和他们的角色,应建立社区成员之间交流和合作机制。
项目特许
通过对项目本身进行评估来确定:(1) 对于项目的合适的商业调整是否存在;(2) 是否可以进一步深化组织机构的全部目标。
测试驱动管理
需要可测量的标准来评估项目的状态和迄今为止的进展情况。
回顾
IXP团队在一个软件增量交付之后要实施特定的技术评审。这种评审称为回顾,在软件增量过程中与全部软件的发布过程中复查“问题、事件以及教训”。这样做的目的是为了改善IXP过程。
持续学习
由于学习是持续过程改进中至关重要的组成部分,因此,鼓励XP团队的成员去学习新的方法和技术来提高软件产品质量。
1.需求易变
因为客户是XP团队的成员,对需求的改变不是正式地提出。结果是,项目的范围会发生变化,早期的工作或许要进行修改来适应当前的要求。
2.矛盾的客户需求
许多项目都有众多客户,每个客户都有自己的一套需求。在XP中,团队自身需要吸纳不同客户的要求,这项工作可能超出了自己的职权范围。
3.需求的非正规表示
批评者指出需要更正规的模型或规格说明来保证遗漏、不一致以及错误在系统建立前就被发现。
拥护者则认为,需求的变化特性在其发展时使这些模型和规格说明变得过时。
4.正规设计的缺乏
XP削弱了对体系结构的设计的要求,在许多案例建议所有类型的设计都不必那么正规。
批评者主张当开发复杂的系统时,必须强调设计以保证软件的体系结构能够展示其质量和可维护性。
拥护者指出XP过程的增量特性限制了复杂性(简单性是其核心价值),因此降低了扩展设计的必要性 (设计简单点,不考虑扩展性,用增量的方式来改进设计)。
Scrum
Scrum得名于橄榄球比赛。
Scrum原则与敏捷宣言是一致的,应用Scrum原则指导过程中的开发活动,过程由“需求、分析、设计、演化和交付”等框架性活动组成。
每一个框架活动中,发生于一个过程模式中的工作任务称为一个冲刺(sprint)。冲刺中进行的工作(每一个框架活动中的冲刺的数目根据产品复杂度和规模大小而有所不同)适应于当前的问题,由Scrum团队规定并常常作实时修改。
每一个过程模式定义一系列开发活动:
动态系统开发
动态系统开发方法(Dynamic System Development Method,DSDM)提供一种框架,使其“通过在可控项目环境中使用增量原型开发模式来满足对时间有约束系统的构建和维护”。
如果交付整个应用系统需用100%时间,那么80%的应用系统可以用20%的时间交付。
特点:
每一个迭代都遵循80%原则,即每个增量只完成能够保证顺利进入下一增量的工作,剩余的细节则可以在知道更多业务需求或者提出并同意变更之后完成。
DSDM生命周期活动:
敏捷建模
敏捷建模的原则:
敏捷统一过程(AUP)
采用了一个“全局串行”以及“局部迭代”的原理来构建基于计算机的系统。
采用经典UP阶跃性活动—开始、加工、构建以及变迁。
提供一系列覆盖(例如,软件工程活动的一个线性序列),能够使团队为软件项目构想出一个全面的过程流。
在每一个活动里,一个团队迭代使用敏捷,并且将有意义的软件增量尽可能快地交付给最终用户。
每个AUP迭代执行以下活动:
1.用自己的话描述(用于软件项目的)敏捷性。
答:
敏捷不仅仅是有效地响应变更,它鼓励能够使沟通更便利地团队结构和协作态度。它强调可运行软件地快速交付,它认为项目计划是可以灵活调整地。
2.为什么迭代过程更容易管理变更?只用一次迭代就能完成项目的敏捷过程是否存在?解释你的答案。
答:
敏捷过程模型提供软件增量,然后是客户反馈和修订。因为增量很小,客户反馈很及时,所以在下一个软件增量中合并更改相对容易。
存在,例如,敏捷软件开发(ASD)使用一个迭代过程,该过程包括适应性周期规划、相对严格的需求收集方法,以及一个迭代开发周期,该周期包括以客户为中心的小组和正式的技术评审,作为实时反馈机制。
3.为什么需求变更这么大?人们终究无法确定他们想要什么吗?
答:
需求变化如此之大,以至于很难提前预测哪些软件需求将持续存在,哪些将发生变化。随着项目的进行,同样难以预测客户的优先级将如何变化。
人们通常很难描述他们的软件需求,直到他们看到一个工作的原型意识到他们忘记了考虑一些重要的事情。
5.什么是XP的spike解决方案?
答:
在某个故事设计中遇到困难时,立即建立这部分设计的可执行原型,实现并评估设计原型。其目的是在真正的实施开始时降低风险,并验证包含设计问题的故事的原始估计。
6.用自己的话描述XP的重构和结对编程的概念。
答:
重构是不改变代码外部行为而改进其内部结构的方式来修改软件系统的过程。
结对编程两个人面对同一台计算机共同为一个故事开发代码。
一个卓有成效的软件工程师要具备:
凝聚力:
一个有凝聚力的团队是一组团结紧密的人,他们的整体力量大于个体力量的总和。
同一般的团队相比,有凝聚力的团队成员具有更高的生产率和更大的动力。他们拥有统一的目标和共同的文化,而且在很多情况下,“精英意识”使得他们独一无二。
团队毒性
应该避免“团队毒性”,5个培育潜在含毒团队的环境:
团队结构取决于组织的管理风格、团队里的人员数目与技能水平,以及问题的总体难易程度。
规划软件工程团队结构应该考虑的7个项目因素:
软件工程团队的四种组织模式:
主程序员团队
从历史的角度看,最早的软件团队组织是封闭式模式结构,最初称为主程序员团队。团队的核心成员包括:
优点:
缺点:
随机式组织结构
随机式范型主张建立具有独立创新性的团队,其工作方式可恰当地称为创新的无政府状态。为了建成一支绩效良好的团队:
特点:
优点:
缺点:
什么是敏捷团队?
小组沟通的有效性:
Alpha Test VS Beta Test
协作工具(例如Git, SVN)
20个世纪的软件开发环境(SDE)已变成协作开发环境(Collaborative Development Environments,CDE)。有价值的CDE会提供为协同工作特别设计的服务:
全球化软件开发(GSD)团队面临距离的挑战:
1.根据你对优秀软件开发者的观察,说出三个共同的个人特质。
答:
有高度的责任感、有强大的抗压能力、注重细节。
2.怎样做到“毫无保留地诚实”,同时又不被其他人视为有侮辱意图或者攻击性?
答:
使用商定的标准和书面要求作为向团队成员反馈的基础,有助于对工作产品的不足之处进行评论时减少个人感情色彩。
3.如果要选择敏捷团队区别于传统软件团队的一个属性,你会选哪个?
答:
敏捷团队是自组织的,在项目生命周期的不同阶段可能会改变其组织结构
4.距离为什么会使交流复杂化?距离为什么会强调对协调的需求?距离会导致哪些种类的障碍和复杂性?
答:
距离会使与团队成员的联系变得更加困难(例如,一天中可能有12小时或更长的时差)。生活在不同国家的团队成员有不同的经历、不同的文化期望,可能会使用不同的语言。
协调工作对于项目的成功至关重要。
有效的沟通需要发送、接收和响应消息,任何一个失败点都可能妨碍团队成员和利益相关者之间有效的信息交流。
软件需求
对期望的软件行为的表达,分为功能需求、非功能需求:
需求工程的定义:
需求工程是指致力于不断理解需求的大量任务和技术。从软件过程的角度来看,需求工程是一个软件工程动作,开始于沟通并持续到建模活动。
需求工程在设计和构建之间建立起联系的桥梁:
两种需求过程:
需求工程过程主要通过执行七个不同的活动来实现:
起始、获取、细化、协商、规格说明、确认和管理。
(1)起始
多数项目都是当确定了商业要求或是发现了潜在的新市场、新服务时才开始。
业务领域的利益相关者(如业务管理人员、市场人员、产品管理人员)定义业务用例,确定市场的宽度和深度,进行粗略的可行性分析,并确定项目范围的工作说明。
在项目起始阶段中,要建立基本的理解,包括对问题、谁需要解决方案、解决方案的性质、与项目利益相关者和开发人员之间达成初步交流合作的效果。
(2)获取
询问客户、用户和其他人:
这些问题看似简单,实际上并非如此简单—相反是非常困难的。
获取需求为什么困难?
(3)细化
在起始和获取阶段获得的信息将在细化阶段进行扩展和提炼。
该任务集中于开发一个精确的需求模型,用以说明软件的功能、特征和信息的各个方面。
(4)协商
存在问题:
需求工程师必须通过协商过程来调解这些冲突。应该让客户、用户和其他利益相关者对各自的需求排序,然后按优先级讨论冲突。
使用迭代的方法给需求排序,评估每项需求对项目产生的成本和风险,表述内部冲突,删除、组合和(或)修改需求,以便参与各方均能达到一定的满意度。
(5)规格说明
在基于计算机的系统(和软件)的环境下,术语规格说明对不同的人有不同的含义。一个规格说明可以是一份写好的文档、一套图形化的模型、一个形式化的数学模型、一组使用场景、一个原型或上述各项的任意组合。
在开发规格说明时保持灵活性有时是必要的:对大型系统而言,文档最好采用自然语言描述和图形化模型来编写。 而对于技术环节明确的较小产品或系统,使用场景可能就足够了。
两种需求文档:
(6)确认
这一步将对需求工程的工作产品进行质量评估。
正式的技术评审是最主要的需求确认机制。确认需求的评审小组包括软件工程师、客户、用户和其他利益相关者,他们检查系统规格说明,寻找:
(7)需求管理
计算机的系统的需求会变更,而且变更的需求贯穿于系统的整个生存期。需求管理是用于帮助项目组在项目进展中标识、控制和跟踪需求以及需求变更的一组活动。
利益相关者的定义
直接或间接地从正在开发的系统中获益的人。包括:业务运行管理人员、产品管理人员、市场销售人员、内部和外部客户、最终用户、顾问、产品工程师、软件工程师、支持和维护工程师以及其他人员。
每个利益相关者对系统都有不同的考虑,当系统成功开发后所获得的利益不相同,当系统开发失败时所面临的风险也是不同的。
因为存在很多不同的利益相关者,所以系统需求调研也将从很多不同的视角开展。例如:
当从多个角度收集信息时,所形成的需求可能存在不一致性或是相互矛盾。
需求工程师的工作是标识公共区域 (即所有利益相关者都同意的需求)和矛盾区域或不一致区域 (即某个利益相关者提出的需求和其他利益相关者的需求相矛盾)。
在很多情况下,一个强有力的“项目领导者”(例如业务经理或高级技术员)可能要对删减哪些需求做出最终决策。
协作收集需求的基本原则:
质量功能部署 (Quality Function Deployment, QFD)
是一种将客户要求转化成软件技术需求的质量管理技术。
QFD目的
是最大限度地让客户从软件工程过程中感到满意。为了达到这个目标,QFD强调理解“什么是对客户有价值的”,然后在整个工程活动中部署这些价值。QFD确认了三类需求:
问题描述
功能分析
问题描述
功能分析
用例:初始化监控
主要参与者:房主
目标:设置系统在房主离开住宅或留在房间内时监测传感器
前提条件:系统已经输入密码并识别各种传感器
触发器:房主决定“设置”系统,即打开警报功能
场景:
优先级:必须实现
何时可用:第一个增量
使用频率:每天多次
使用方式:通过控制面板接口
次要参与者:技术支持人员,传感器
次要参与者使用方式:
未解决的问题:
基于场景的元素:(活动图)
可以从用户的视角描述系统。例如,基本的用例及其相应的用例图可以演化成更精细的基于模板的用例。基于场景的元素通常是正在开发模型的第一部分。同样,它们也作为创建其他建模元素时的输入。
基于类的元素:(类图)
每个使用场景都暗示着当一个参与者和系统交互时所操作的一组对象。这些对象被分成类—具有相似属性和共同行为的事务集合。
行为元素:(状态图)
状态图是一种表现系统行为的方法,该方法描绘:系统状态、导致系统改变状态的事件、某个特殊事件后采取什么动作。
面向数据流的元素:(数据流图)
信息在基于计算机的系统中流动时会被转换,系统接受多种形式的输入,使用函数将其转换生成多种形式的输出。
输入可以是由变频器发送的控制信号,可以是操作人员输入的数字,也可以是网络上传送的信息包或从备份存储器取回的庞大数据文件。
转换可能由单一的逻辑比较、复杂的数值算法或专家系统的规则推理方法构成。
输出可能是点亮一个发光二极管或是生成一份200页的报告。
作为软件团队实施需求工程时必须避免的三个相关错误:
1.为什么大量的软件开发人员没有足够重视需求工程?
答:
首先软件开发人员认为客户已经把需求说清楚了,但是大多数情况初步的需求都是模糊的。其次工程的进度要求很紧迫,软件开发人员迫切希望投入到代码编写阶段。最后和客户沟通比较困难,使得大多数软件开发人员不重视需求工程。
2.讨论一下当需求必须从三四个不同的客户中提取时会发生什么问题。
答:
每个人的需求会不一致甚至产生冲突。
3.想出3个以上在需求起始阶段可能要问利益相关者的“与环境无关的问题”。
答:
①谁是这项工作的最初请求者?②谁将使用该解决方案?③成功的解决方案将带来什么样的经济收益?
4.为如下活动之一开发一个完整的用例:a. 在ATM提款。b. 在餐厅使用信用卡付费。c. 使用一个在线经纪人账户购买股票。 d. 使用在线书店搜索书(某个指定主题)。
答:
5.在需求工程活动的协商情境中,“双赢”意味着什么?
答:
利益相关者的“赢”:获得满足客户大多数需要的系统或产品;软件团队的“赢”:按照实际情况、在可实现的预算和时间内完成工作。
需求模型的三个主要目标:
在创建分析模型时应该遵循的经验原则:
目标:查找或创建那些广泛应用的分析类或分析模式,使其能够复用。
域分析师的角色是发现和定义可复用的分析模式、分析类和相关的信息。
四类需求建模方法:
在需求提出之初,往往是模糊的。设计者可以根据这些需求编写一个具体的例子——用例或场景。
用例的定义
用例只是帮助定义系统之外存在什么以及系统应完成什么。也就是,用例是从某个特定参与者的角度出发,采用简明的语言描述一个特定的使用场景。
描述性用例
描述性用例的另一种表达形式是通过用户活动的顺序序列来表现交互,每个行动由声明性的语句表示。值得注意的是,这个连续步骤的陈述没有考虑其他可能的交互 (暂时不考虑细化问题)。这种类型的用例有时被称作主场景。
主场景中的每个步骤将通过如下提问得到评估:
这些问题的答案导致创建一组次场景,次场景属于原始用例的一部分但是表现了可供选择的行为。
数据建模概念:
定义在系统内处理的所有数据对象、数据对象之间的关系以及其它与这些关系相关的信息。
类-职责-协作者CRC (Class-Responsibility-Collaborator)建模:提供了一个简单方法,用于识别和组织与系统或产品需求相关的类。
CRC模型是表示类的标准索引卡片的集合,分成三部分:
职责:
分配职责的5个指导原则
协作
类有两种方法实现其职责:
类间的三种通用关系
is-part-of (是……的一部分)【组合】{实心菱形}、has-a (有…)【聚合】{空心菱形}
组合是一种较为紧密的关系,从生命周期上看,部分和整体是共存亡的关系。聚合则是一种较为松散的关系,部分和整体的生命周期未必一致。
has-knowledge-of (有关于……的知识)
当一个类需要从另一个类中获取信息时;例如,ControlPanel必须从Sensor类中获取每个传感器的状态;
depends-upon (依赖……)
意味着两个类之间具有is-part-of和has-knowledge-of 不能实现的依赖关系:例如,PlayerHeader通常必须连接到PlayerBody;
关联
两个分析类以某种方式相互联系着,这些联系被称作关联(associations)。在某些情况下,关联可以更进一步地指出多样性。多样性限制的表示有以下几种情况:
依赖
一个Camera对象向一个DisplayWindow对象提供视频图像。这两个对象间的关系不是简单的关联,而是存在着依赖关系。建模者必须提供特定的密码才能查看指定摄像机的位置。《access》意味着通过特定的密码控制使用摄像机的输出。
分析包的定义
将分析模型的各种元素(如用例、分析类)以一种方式分类,分组打包后称其为分析包,并取一个有代表性的名。
每个包中分析类名字前加的符号有三种:
面向流建模
描述了数据对象在系统中的变换过程。采用数据流图(data flow diagram,DFD)、状态迁移图等。
DFD采取了系统的输入-处理-输出观点,即流入软件的数据对象,经由处理元素变换,最后结果以数据对象的形式流出软件。
数据流图(记号)
示例:
导出数据流图的指导原则:
(1) 第0层DFD(也称环境层DFD或顶层DFD)将系统描述成一个泡泡;
(2) 仔细标记主要的输入和输出;
(3) 通过把选定的处理、数据对象和数据存储分离为下一层表示而开始精化过程,即逐步求精,一次精化一个处理;
(4) 使用有意义的名称,标记所有的箭头和泡泡;
(5) 从一层转至另一层时,注意保持信息流的连续性;
(6) 一次精化一个泡泡。
示例:【示例来源:如何画好数据流图?】
(ps:有些教材把顶层图表示为0层,依次类推,这里的0层就表示为1层,1层表示为2层)
判定表
一个表格,描述条件和条件导致的动作的集合。
数据字典
管理各种关系模型中的信息,具体信息包括:
数据元素组成数据对象的方式:
符号:
行为模型
描述了系统如何响应外部事件或激励。
类的状态有被动和主动两种特征:
状态图:
为每个类呈现了主动状态和导致这些主动状态变化的事件。
示例:
顺序图
顺序图将交互关系表示为一个二维图,用时间函数表明事件如何引发从一个对象到另一个对象的转移。
需求模型由各种元素组成:
基于场景(用例)、基于数据(数据模型)、基于类、基于流和行为。其中,每个元素都是从不同的视角检查问题,并且每一个都提供一种发现模式的机会,可能发生在整个应用领域,或者发生在类似但横跨不同的应用领域。
在需求模型的描述中最基本的元素是用例。一套连贯用例可以成为服务于发现一个或多个分析模式的基础。
1.表示行为建模时有两种不同的“状态”类型,他们是什么?
答:
状态图、顺序图
2.如何区分状态图和顺序图?
答:
状态图描述一个对象状态的变迁,而顺序图描述几个对象之间交互的顺序。
3.配置模型的目的是什么?
答:
将具有不同来源的配置转换成Configuration对象。
软件的设计
软件的设计是将需求转变为软件陈述(表达)的过程。系统通过逐步求精,使得设计陈述逐渐接近源代码:
需求模型提供了创建四种设计模型所需信息:
良好设计演化的三个特征:
质量指导原则
为了评估某个设计表示的质量,软件团队中的成员必须建立良好设计的技术标准,这些将作为软件质量的标准:
质量属性
软件质量属性(FURPS)体现了所有软件设计的目标:
抽象是控制复杂性的基本策略,是人类处理问题的基本方法。
抽象过程:从特殊到一般的过程,上层概念是下层概念的抽象,下层概念是上层概念的精化和细化。在最高的抽象级上,用概括性的术语描述解决方案。在较低的抽象级上,将提供更详细的解决方案说明。
两种不同的抽象:
==软件体系结构定义 ==
软件的整体结构和这种结构为系统提供概念完整性的方式。
软件体系结构设计的一组属性:
设计模式是经过验证的,用于解决在特定环境下、重复出现的、特定问题的解决方案 。
关注点是一个特征或一个行为,被指定为软件需求模型的一部分。
关注点分离表明任何复杂问题如果被分解为可以独立解决或优化的若干块,该复杂问题能够更容易地被处理。
“分而治之”的策略——把一个复杂问题分解为若干可管理的块来求解时将会更容易。
模块是相对独立的程序体:
模块化就是把程序划分成独立命名且可直接访问的模块,各个模块完成一个子功能,这些模块集成起来构成一个整体,完成指定功能。
如果我们无限制地划分软件,开发它所需的工作量会变得小到可以忽略?
答:错误,模块数量增加时,只是使各个子模块的工作量之和有所减小,开发工作量还有很大一部分来自于模块间的接口和集成,除了技术上的接口和集成,还包括人与人之间的沟通,集成和沟通的开销到一定程度就会成为开发工作量的主要部分。
模块数增加时,模块间的关系也随之增加,接口和集成的工作量也随之增加;
结论:寻找最佳模块化程度平衡点。
模块化的优点
信息屏蔽的概念
每个模块都尽量对其他模块隐藏自己的内部实现细节,只交流实现软件功能所必需的那些信息,模块内部的数据和过程不允许其它不需要这些信息的模块使用。
典型的信息隐蔽:面向对象的访问控制符。
信息隐蔽是实现抽象/模块化机制的基本支撑。
信息隐蔽的优点
功能独立是关注点分离、模块化、抽象概念和信息隐蔽的直接结果。
功能独立的重要性——具有有效模块化 (也就是独立模块)的软件更容易开发。
内聚度与耦合度
内聚(cohesion):一个模块内部各个元素彼此结合的紧密程度。
耦合(coupling):模块之间相互关联的程度。
内聚度的七个层次
耦合度的七个层次
求精:对各种抽象的细化
逐步求精:为了集中精力解决主要问题而尽量推迟对细节的考虑,是一种自顶向下的设计策略
抽象和求精是互补的概念:
抽象能够明确说明内部过程和数据,但对“外部使用者”隐藏低层细节,求精有助于在设计过程中揭示低层细节。
重构——是一种重新组织的技术,可以简化构件的设计(或代码)而无需改变其功能或行为。
定义:不改变代码[设计]的外部行为而是改变其内部结构。
面向对象设计模式解决的是类与相互通信的对象之间的组织关系,包括它们的角色、职责、协作方式几个方面。
五种设计类,每一种都表示体系结构的一个不同层次:
组织良好的设计类的四个特征:
依赖倒置
高层模块(类)不应当(直接)依赖于低层模块,两者都应当依赖于抽象。抽象不应当依赖于细节,细节应当依赖于抽象。
接缝
即详细设计中的一些位置,在这些位置可以“插入一些测试代码,这些代码可用以探测运行中软件的状态”,以及“将待测试的代码从它的产生环境中分离出来,以便在受控的测试环境中执行这些代码。
体系结构模型从以下3个来源获得:
(1) 将要构建软件的应用域信息(应用场景);
(2) 特定的需求模型元素,如数据流图或分析类;
(3) 体系结构模式。
软件接口设计元素描述了信息如何流入和流出系统以及被定义为体系结构一部分的构件之间是如何通信的。
接口设计的3个元素:
软件的构件级设计完整地描述了每个软件构件的内部细节:
UML构件图
也称组件图。描述了软件的各种构件和它们之间
的依赖关系。通常包括三个元素:构件、接口和依赖。
部署级设计元素指明软件功能和子系统将如何在物理计算环境内分布。
1.软件设计和编码有什么不同?
答:
软件设计包括概要设计和详细设计,编码是将详细设计中的过程描述转换成用程序设计语言来描述。
2.如果软件设计不是程序,那它是什么?
答:
软件的设计是将需求转变为软件陈述(表达)的过程。
3.如何评估软件设计的质量?
答:
4.用自己的话来描述软件体系结构。
答:
软件的整体结构和这种结构为系统提供概念完整性的方式
5.什么是关注点分离?分而治之的方法有不合适的时候吗?这种情况对模块化的观点有多大的影响?
答:
关注点分离(Separation of concerns,SOC)是对只与“特定概念、目标”(关注点)相关联的软件组成部分进行“标识、封装和操纵”的能力。
有,当复杂问题无法分解或者分解完子问题不可编码实现时,分而治之的方法就不合适了。
会导致无法进行模块化处理。
6.什么是信息屏蔽?
答:
每个模块都尽量对其他模块隐藏自己的内部实现细节。
7.重构意味着迭代地修改整个设计吗?如果不是,它意味着什么?
答:
不是,重构意味着不改变设计的外部行为而是改变其内部结构。
8.什么是依赖倒置?
答:
高层模块(类)不应当(直接)依赖于低层模块,两者都应当依赖于抽象。抽象不应当依赖于细节,细节应当依赖于抽象。
9.简要描述设计模型的四个元素。
答:
①数据设计元素创建了在高抽象级上表示的数据模型和信息模型。②体系结构设计元素被描述为一组相互联系的子系统,且常常从需求模型中的分析包导出。③接口设计元素描述了信息如何流入和流出系统,以及被定义为体系结构一部分的构件之间是如何通信的。④构件级设计元素完整地描述了每个软件构件的内部细节。
体系结构的概念
也称架构,它是系统的一个或多个结构。它包括:构件,构件的外部可见属性以及它们之间的相互关系。
软件体系结构的作用:
(1) 对设计在满足规定需求方面的有效性进行分析;
(2) 在设计变更相对容易的阶段,考虑体系结构可能的选择方案;
(3) 降低与软件构造相关联的风险;
“体系结构”和“设计”的区别
设计是体系结构的一个实例,对于同一个体系结构,可能会产生多种基于该体系结构的设计。
体系结构为什么重要
以数据为中心的体系结构
数据存储驻留在体系结构的中心,其他构件访问该数据存储,并进行各种数据操作(更新、增加、删除或修改)。
黑板(变种):当用户感兴趣的数据发生变化时,它将通知客户软件。
优点:
问题:
数据流体系结构
当输入数据经过一系列的计算构件和操作构件的变换形成输出数据时,可应用该体系结构。
优点:
问题:
调用和返回体系结构
该体系结构风格能够设计出一个相对易于修改和扩展的程序结构。存在以下子风格:
面向对象体系结构
系统的构件封装了数据和应用到该数据上的操作。构件间通过消息传递进行通信与合作。
层次体系结构
定义了不同的层次,各个层次完成各自操作;每一层为上层提供服务,又接受下层的服务;
优点:明确的抽象层次、易于增减或修改层次;
问题:系统并不是总能分层。
模式:体系结构模式在特定坏境和一系列限制与约束下处理特定的应用问题。
体系结构框架是:一个特定应用领域问题的体系模式;一个待实例化的完整系统。
体系结构考虑要素
决策模型
记录了所需要的体系结构决策、在过往的项目中实际做出的决策以及支持这些决策的理由。
系统环境的表示
软件体系结构设计师利用体系结构环境图对软件与外部实体的交互方式进行建模。
与目标系统交互的系统,即外部实体可表示为:
原型
原型是表示系统行为元素的一种抽象。
在将软件体系结构精化为构件时,系统的结构就开始显现。
构件的来源如下:
每一个顶层构件都必须经过反复的迭代精化。
WebApp是典型的使用多层次体系结构来构造的客户端–服务器应用软件,包括用户界面或表现层、一个基于一组业务规则来指导与客户端浏览器进行信息交互的控制器,以及可以包含WebApp的业务规则的内容层或模型层。
移动App是典型的使用多层体系结构来构造的系统,包括用户界面层、业务层以及数据层。
影响移动App体系结构设计的方面:
(1)将要建立的Web客户类型(瘦或富客户端);
(2)所支持的设备种类(如智能手机、平板电脑);
(3)连接程度需求(偶尔的还是持久的);
(4)带宽需求;
(5)移动平台的限制;
(6)重用和可维护性的程度也是重要的;
(7)设备资源的限制(如电池寿命、内存大小、处理器速度)。
体系结构评审
体系结构评审是一种特定的技术性评审,它提供了一种评估方法,该方法可以评估软件体系结构满足系统质量需求的能力以及识别任何潜在风险的能力。体系结构评审可以尽早检测到设计问题,具有降低项目成本的潜能。
与需求评审会涉及所有利益相关者的代表不同,体系结构评审往往只涉及软件工程团队成员,并辅以独立的专家。业界最常用的体系结构评审技术有:基于经验的推理、原型评估、情境评审以及检查单的使用。
经验学习
Wright [Wri11]建议了几种决策分析和解决方案(Decision Analysis and Resolution,DAR)的方法,有助于消除分歧和促成协作。三个代表性DAR方法如下:
基于模式的体系结构评审
基于模式的体系结构评审(Patten-Based Architecture Review, PBAR) 是一种用来平衡体系结构模式与软件质量属性之间关系的评估方法。
PBAR是一种轻量的评估方法,非常适用于小规模敏捷团队,只需要相对较少的额外项目时间和精力。只需要很短的准备及评审时间,PBAR便能够适应不断变更的需求和较短的建设周期,同时,也有助于团队理解系统体系结构。
PBAR包含以下的迭代步骤:
构件定义
计算机软件中的一个模块化的构造块。
OMG UML的构件定义:
系统中模块化的、可部署的和可替换的部件,该部件封装实现并暴露一组接口。
内聚性
描述为构件的专一性。
内聚性意味着构件或者类只封装那些相互关联密切,以及与构件或类自身有密切关系的属性和操作。
内聚性分类
构件之间彼此联系紧密程度的一种定性度量。随着构件相互依赖的增加,构件的耦合程度也会增加。
耦合性的分类
模块关联的评价指标
扇出:一个模块直接控制的模块数目。扇出过大意味着模块过分复杂,需要控制和协调过多的下级模块。理想的平均扇出为3-4(上限为5-9)。
扇入:有多少个上级模块直接调用它。扇入越大意味着共享该模块的数目越多。
设计得好的软件结构通常顶层扇出高,中层扇出少,底层高扇入。
实施构件级设计步骤
步骤1:标识出所有与问题域对应的设计类:
步骤2:确定所有与基础设施对应的设计类:
步骤3:细化所有不能作为复用构件的设计类:
步骤3a:说明消息细节
步骤3b:确定接口
步骤3c:细化属性
步骤3d:详细描述操作中处理流
步骤4:说明持久数据源(数据库和文件)并确定管理数据源所需要的类:
步骤5:开发并且细化类或构件的行为表示 (可用状态图):
步骤6:细化部署图以提供额外的实现细节
步骤7:考虑每一个构件级设计表示,并且时刻考虑其他可选方案:
WebApp构件是:
(1)为最终用户处理内容,或提供计算或数据处理;
(2)提供最终用户所需的功能。
因此WebApp构件级设计通常包括内容设计元素和功能设计元素。
基于构件的软件工程(Component-Based Software Engineering,CBSE)是一种强调使用可复用的软件构件来设计与构造计算机系统的过程:
关于界面设计的三条黄金原则
界面设计时,总会遇到以下6个问题:
软件工程知识点总结——第三、四部分