软件工程重点汇总

一、绪论

1.软件的特点:软件是抽象的(逻辑实体,是抽象的,不具有物理实体的特性)、软件是永不磨损的**、软件是可移植的、软件是复杂的**(软件自身的抽象性、其所解决的问题的复杂性和管理开发过程的难度等因素都导致了软件的复杂性)、软件是昂贵的

2.软件从技术层面分类:系统软件、支撑软件和应用软件

系统软件:处在计算机软件的底层,向下直接与硬件打交道,向上直接与应用软件打交道,其主要功能是调度、监控和维护计算机系统,负责管理计算机系统中各个独立的硬件,以使它们能够协调、高效的工作。最典型操作系统。

支撑软件是支撑其他软件的开发、运行与维护的一系列软件。如软件开发环境、数据库管理系统、网络软件。

应用软件:是为了满足用户不同领域、不同问题的应用需求而提供的那部分软件。

3.软件从商务层面分类:通用软件、定制软件以及开源软件。

4.早期的软件危机的表现:对软件开发的进度及成本难以控制、软件产品质量无法保证、用户对产品难以满意、生产出来的软件难以维护、软件缺少适当的文档资料。

20世纪80年代这一阶段软件危机的主要表现:(1)软件成本在计算机系统总成本所占的比例居高不下,且逐年上升。(2)软件开发生产率提高的速度远远跟不上计算机应用迅速普及深入的需要,软件产品供不应求的状况使得现代计算机硬件所能提供的巨大潜力得不到充分利用。

5.软件危机的原因:客户需求不明确、缺乏正确的理论指导与方法、软件开发规模越来越大、软件开发的复杂度越来越高、软件开发人员自身的不足。

6.软件工程人员应当遵守以下8条原则:公众感、客户与雇主、产品、判断力、管理、职业感、同事、自身。

二、软件工程要素

1.软件工程包括3个要素:软件方法、软件工具、软件过程

软件方法是完成各项软件开发任务的技术方法,为软件开发提供"如何做"的技术。如可行性分析、需求分析、系统设计、需求获取。

软件工程的工具为软件工程方法提供了自动的或半自动的软件支撑环境,软件工具集成起来,建立起称为计算机辅助软件工具(CASE),CASE将各种软件工具、开发机器和存放开发过程信息的工程数据库组合起来形成一个软件工程环境。

软件工程的过程则是将软件工程的方法和工具结合起来,以达到合理、及时地进行计算机软件开发的目的。

2**.软件过程是为了获得高质量软件所需要完成的一系列任务的框架,针对软件生命周期的一般规律,规定了完成各项任务的工作顺序和在完成开发及维护任务时必须进行的一些必要活动**。

基本的软件活动:需求、分析、设计、实现、维护、软件质量保证/测试和项目管理

3**.问题定义**就是确定目标软件系统的目的、业务范围、面向的用户群体、意义、目标等

4.可行性研究的任务是研究问题的范围、探索这个问题是否值得去解、是否有可行的解。我们通常需要考虑的因素主要有工期、成本和技术可行性。

技术可行性分析包括:风险分析、资源分析和技术分析

5.需求分析:确定为了解决客户的问题,目标软件系统必须做什么、目标软件系统必须具备哪些功能。需求分为功能性需求和非功能性需求。

功能性需求是指对软件系统和业务功能直接相关的行为方面的要求,例如顾客登录/登出、旅客查询列车时刻表等。

非功能性需求是指目标软件系统除功能需求之外,为满足用户业务需求还必须具有的特性,包括系统的性能、可靠性、健壮性、可维护性等。

6.分析:软件分析的目的是分析并精华需求。需求的工作是面向客户的,而分析的工作是面向开发团队的。

软件分析的工作就是用IT的思想、软件的方法对需求做进一步的分析、精炼和提升,以获得正确开发软件产品和易于维护之所必需的需求**。分析阶段的成果是分析文档,也称为产品规格说明,它回答目标软件系统做什么,但不回答如何实现目标软件系统。**

如果采用的是结构化范型,则对需求做结构化分析,如果采用的是面向对象范型,则对需求做面向对象分析。

7.设计:软件设计的任务就是要回答如何实现目标软件系统。软件系统设计包括架构设计和详细设计。

架构设计又称高层设计,是指在基于一定的设计原则,指定整个软件系统的组织和拓扑结构确定并描述软件系统中的各个组件之间所存在的关系,如外部系统接口、用户界面、商业逻辑组件、数据库等。

详细设计是在确定了系统架构之后开始的。详细设计包括用户界面设计、数据库设计、功能模块设计和数据结构与算法设计。

设计阶段的工作成果是设计文档

8.实现:实现阶段的任务就是基于设计方案,利用所选择的编程语言来编程,从而获得目标软件系统的计算机程序,即实现目标软件系统。

9.维护:软件产品的维护在时间和成本上占其整个软件生命周期的六成以上。

10.软件质量保证:软件质量定义为软件产品满足规格说明的程度。测试是软件质量保证重要的和主要的技术手段。软件测试可以分为两种,对可执行代码进行的基于执行测试、对不能执行的各种文档及代码进行的非执行测试。

如何安排软件质量保证(SQA)的相关工作及人员(请从组织架构的层面来思考)

软件质量保证涉及制定和执行质量计划、分配质量管理责任、实施各阶段质量保证措施,并要求SQA人员具备责任心、客观性、沟通能力和对软件开发的深入了解。SQA的目的是通过有计划的评审和审计,确保软件项目遵循既定标准和规格,从而提高透明度和产品质量。这需要SQA人员独立于项目组工作,以保证客观性,并采用持续改进方法。

11.项目管理:为使软件项目开发获得成功,必须对软件开发项目的工作范围、可能遇到的风险、需要的资源(人、软/硬件环境)、要实现的任务、经历的里程碑、成本、进度的安排等做到合理的计划、组织和实施,这一计划就是软件项目管理计划。

12.软件过程定义软件开发的顺序和操作流程,软件方法是完成各项软件开发任务的技术方法,软件工具提供了软件方法中可用的一组图形符号。软件方法主要有面向过程的结构化开发方法、面向数据结构的Jackon方法,面向对象开发方法和敏捷方法等。

13.结构化方法:其基本思想是用结构化分析对软件需求进行分析,之后用结构化设计方法进行系统设计,最后采用结构化编程来实现目标软件系统。

结构化方法总的指导思想是自顶而下,逐层分解,它的基本原则是功能的分解与抽象。它适合解决数据处理领域的问题,不适合解决超大规模的、特别复杂的项目问题,且难以适应需求的变化。

14.Jackson方法是一种面向数据结构的开发方法。JSP方法是以数据结构为驱动的,它适合于小规模的项目。JSD方法是JSP方法的扩展,是一个完整的系统开发方法。

15.面向对象方法的核心思想是提倡用人类在现实生活中本就存在的、一直在使用的思维方法来认识、理解和描述客观事物,强调最终建立的系统能映射问题域,使得系统中的对象及对象之间的关系能够如实地反应问题域中固有的实体及其相互之间的关系。

面向对象开发方法认为客观世界是由对象组成,对象由属性和方法/操作组成,对象可按其属性进行分类,对象之间的联系通过传递小弟来实现,对象具有封装性、继承性和多态性。面向对象开发方法是以用力驱动的、以职责驱动为设计原则、迭代的和渐增式的开发过程。主要包括面向对象分析、面向对象设计、面向对象编程。

16.敏捷开发适用于**(1)软件企业正在开发并准备推向市场的是一个小型或中型的软件产品。(2)机构内的定制化系统开发,客户明确承诺可以参与开发过程,并且没有许多来自外部的规章和法律等影响。**

敏捷开发的分类:极限编程、Scrum、Crystal、适应性软件开发、特征驱动开发。

敏捷方法的基本原则**:客户参与、增量模式、接受变更、开发团队的技术应当得到承认和发扬、保持简洁。**

敏捷开发的共同特性:(1)规格说明、设计和实现过程交织在一起。(2)系统按照一系列增量进行开发。(3)使用广泛的工具来支持开发过程。

17.软件工具:用来辅助软件开发、运行、维护、管理和支持等活动的软件称为软件工具。软件工具也称为计算机辅助软件工具。(1**)开发过程工具**包括需求分析设计工具、编程工具、测试工具

(2)维护过程工具包括文档分析工具、逆向工程工具、再工程工具。(3)管理过程工具包括项目管理工具、版本控制工具、配置管理工具、软件评价工具。

18.管理过程工具包括软件项目管理工具、软件版本控制工具、软件配置管理工具、软件项目评价工具。

软件项目管理工具是为了使工程项目能够按照预定的成本、进度、质量顺利完成,面对人员、产品、过程和项目进行分析和管理的一类软件。

软件版本控制工具提供完备的版本管理功能,用于存储、追踪目录(文件夹)和文件的修改历史。

软件配置管理工具,是指支持完成配置项标识、版本控制、变化控制、审计和状态统计等任务的工具。

三、需求

1.需求是目标软件系统的根和源。正确且恰当的需求是目标软件系统成功的必要的、首要的、基本的条件,需要对目标软件系统的成功起着至关重要的作用。

2.需求的层次:被动型、主动型、引领型

3.如何做需求?需求阶段的工作分为以下4个步骤:(1)准备工作(2)需求调研(3)完成需求调研(4)需求确认

4.准备工作:(1)确认此次需求调研的任务,包括讨论的主题、范围和内容

需求小组向用户提问题应该遵循以下几个原则:问题不宜过大、问题要尽量易于用户回答,而且答案是明确的。

(2)确定此次需求调研拟采用的方法

(3)确定何时、何地、开发方和用户方的哪些相关业务人员参与此次需求调研。

5.需求文档:需求文档绝不是需求记录的简单整合和罗列,而是要通过对需求调研所获得的庞大信息进行仔细地梳理、分析、推敲、研判、扩充和提升,形成业务逻辑合理、能够解决客户和用户的问题、业务范围和业务量适合于预计的工期和预算的需求文档。

6.功能性需求:功能性需求是指对目标软件系统应该提供的业务功能或服务、系统如何对输入做出反应,以及系统在特定条件下业务行为的描述。

7.非功能性需求是指目标软件系统除功能需求之外,为满足用户业务需求还必须具有的特性,包括系统的性能、可靠性、鲁棒性即健壮性、安全性、实用性、可维护性、可扩充性、容量、界面、接口、和所需要的软硬件环境。

8.需求面临的挑战:(1)开发方人员于客户方人员的专业领域背景相去甚远。(2)语言表达方式的不同,也可能造成对方的误解(3)客户很难完整、准确、一致、无遗漏地描述清楚需求。(4)需求小组所面对的有可能是一些对目标软件系统有抵触、惧怕,甚至憎恶情绪的人员,这些人员有可能向开发方提供误导式的,甚至错误的需求信息,试图使目标软件系统向着错误的方向发展,这使得需求工作的挑战更大。(5)协商:如果客户方的需求过高、过多,需求小组就要与客户方协商、谈判,要降低客户的期望值,要说服客户接受比他想要的少的需求。(6)交流机会少(7)做需求一定要本着灵活性和客观性的原则,需求小组要不带任何成见地参加每次需求调研和需求文档撰写。

四、面向对象思想与范型

面向对象方法学里最常设计的基本概念有对象、类、数据封装、信息隐藏、继承、消息和方法等。对象是具有属性即数据和行为方式即方法的几何体。属性是对象的静态特征,而方法是对象的动态特征。类是具有相同或类似属性和方法的对象的抽象。一个类向上可以有超类,向下可以有子类,形成一种层次结构。继承是自动地共享类和对象中的数据与方法的机制。数据封装和信息隐藏机制,使得外界只能看到对象对外界提供的边界上的接口,对象内部对外界是隐藏的,这样能够将对象的使用者和对象的设计者分开,使用者不必知道行为实现的细节,只需使用设计者提供的消息来访问对象。消息是对象与对象之间进行通信的工具,发送消息的对象称为发送者,接受消息的对象称为接受者。

1.模块内部的交互程度最高,且模块之间的交互程度最低。

模块是一个由聚合标识符所标识的、由边界元素界定范围的、词汇上邻接的程序语句序列模块内部的交互程度称为内聚,模块之间的交互程度称为耦合。

2.内聚:内聚性由低到高分别是偶然性内聚、逻辑性内聚、时间性内聚、过程性内聚、通信性内聚、功能性内聚和信息性内聚。

3.偶然性内聚:如果一个模块执行多个完全不相关的操作,则该模块具有偶然性内聚。

偶然性内聚有两个严重的缺点:一是这样的模块极难被读懂、难以理解它到底要做什么,进而导致该模块难调试、难修改、难维护、难升级;二是这样的模块根本不可能被其他软件产品重用,因为不可能其他软件产品"恰好"需要这样一个做同样杂事的模块。

改进具有偶然性内聚模块的办法是将其分解成多个模块,使每个模块分别只执行一个操作。

4.逻辑性内聚:当一个模块进行一系列相关的操作,每个操作由调用模块来选择时,该模块就具有逻辑性内聚。

逻辑性内聚有3个问题:(1)接口传递的数据和变量复杂,难以理解。(2)增加了其与调用模块之间的耦合度,逻辑性内聚模块必然导致调用模块与被调用模块之间的控制耦合。(3)完成多个操作的代码互相交织在一起,导致严重的调试问题和维护问题。具有逻辑性内聚的模块很难重用。

**5.时间性内聚:**如果一个模块执行多个操作,这些操作出现在同一个模块中的理由只是因为它们都要在同一个时间发生,则该模块具有时间性内聚。典型的时间性内聚模块有初始化模块、终止模块、异常处理模块等。

**6.过程性内聚:**如果一个模块执行一系列与要遵循的步骤、顺序相关的操作,也就是说这些操作必须按指定的过程执行,则该模块具有过程性内聚。

7.通信性内聚:如果一个模块执行一系列与产品要遵循的步骤、顺序有关的操作,而且这些操作都在同一个数据结构上进行,或者各操作使用相关的输入数据、产生相同的输出数据,则该模块具有通信性内聚。如某模块生成工资报表、计算总工资成本、计算平均工资。这些操作都使用相同的输入数据"工资记录集合"。

8.功能性内聚:如果一个模块只执行一个操作或只达到单一目的,则该模块具有功能性内聚。

9.信息性内聚:如果一个模块进行多个操作,每个操作都有自己的入口点,每个操作的代码相互独立,且所有操作都基于相同的数据结构来完成,则该模块具有信息性内聚。

好处:信息性内聚模块的各操作是相互独立的、互不相干的、有各自的入口点和出口点。信息性内聚模块可以用来实现一种抽象的数据类型,获得实现抽象数据类型的所有优点。功能性内聚是结构化技术能做到的最好,信息性内聚是面向对象技术能做到的最好。

10.耦合:软件模块的耦合按照从强到弱为内容耦合、公共耦合、控制耦合、印记耦合和数据耦合。

11.内容耦合:如果两个模块中的一个直接访问了另一个模块的内容,则它们之间就是内容耦合。

缺点:(1)一个模块访问另一个模块的内容必然会造成两个模块的耦合度高,互相的交织和渗透较多,从而导致这两个模块的可读性、可理解性、可维护性差。

(2)模块之间的高耦合度必然导致模块的独立性差、可重用性差。

(3)模块中的内容可被直接访问,给计算机犯罪分子以可乘之机,他们能够篡改或损坏系统中的重要数据,如客户的银行账号余额、

12.公共耦合:如果两个模块都可以存取相同的全局数据,则它们之间具有公共耦合。

**13.控制耦合:**如果两个模块中的一个模块向另一个模块传递控制元素,则它们之间具有控制耦合,即一个模块明确地控制另一个模块内部的流程。

控制耦合会导致被调用模块EFG的逻辑性内聚,反之,逻辑性内聚的模块必然导致与其调用模块之间的控制耦合。

14.印记耦合:如果被调用模块只利用到传递的数据结构中的一部分数据,则这两个模块之间具有印记耦合。

印记耦合传递的数据多于所需要的数据。

15.数据耦合:如果两个模块之间传递的参数,无论是简单数据类型,还是复杂的数据结构,在被调用模块中都被全部利用,则这两个模块之间具有数据耦合。

16.信息隐藏:模块的实现细节(包括属性和方法的实现细节)能够隐藏起来、对外界不可见,这样其他模块除了可以访问该模块对外界所提供的接口之外,没有机会触碰到模块的内部,从而能够避免内容耦合。

17.类之间的关系大致可以分为三类:继承、聚合和关联

继承关系可以用UML的类图表示,用一个空心三角从子类指向父类。继承的层数过多,则容易导致"脆弱的基类问题",也就是基类的一点改动都将影响很多其他类。

聚合关系:个人计算机由主机、显示器、键盘和鼠标聚合而成,则个人计算机是整体类,主机、显示器、键盘和鼠标是部分类。

整体类与部分类之间有数量的对应关系,称为阶元关系。用空心菱形指向整体类。

如果两个类之间有关系,但既不是继承关系,也不是聚合关系或组合关系,则称这两个类之间具有关联关系。关联关系在类图中用有向线段从关系发生的主动方指向被动方。

18.一个方法可以有多个实现版本,这称为多态性。面向对象范型有3中机制支持多态,它们是覆盖、重载和接口

19.面向对象语言允许一个类中多个方法拥有相同的名称,只要其参数的个数、顺序或类型不同集合,也就是说一个方法可以有多个版本;在调用该方法时,系统根据参数自动匹配和调用相应的版本,这称为重载

20.面向对象范型的优势:(1)面向对象范型使得软件开发容易,因为面向对象 软件系统很大程度上就是对现实世界的真实对应。(2)设计良好的对象是一个相对独立的单元。(3)面向对象编程语言支持模块的信息性内聚,从而使封装和信息隐藏成为可能,使得对象不仅是一个概念上独立的实体,同时也是一个物理上独立的实体。这使得面向对象的软件系统能够具有比传统范型的软件系统更高的内聚和更低的耦合及更高的安全性。

21**.UML图包括:用例图、活动图、初始类图、顺序图、状态图、详细类图、协作图**

五、面向对象分析

1.分析目的与定位:需求与系统设计之间搭建起一座"桥梁",把用领域术语和语言描述的业务需求用软件的术语和语言来描述,这就是规格说明文档。分析工作使目标软件产品的需求获得更深刻的理解和分析,使设计和实现能够更容易、更高质量地开展。规格说明文档回答目标软件系统将做什么、将为用户提供什么功能,但并不说明如何实现这些功能。

2.结构化分析方法:是一种单纯的自顶逐步求精的功能分解方法。

3.面向对象分析方法:面向对象把分析建立在系统对象及对象间交互的基础上。面向对象的问题分析模型:对象模型、动态模型和功能模型。

4.结构化分析方法与面向对象分析方法的区别:(1)将系统分解成子系统的方式不同。前者将系统描述成一组交互作用的处理,后者则描述成一组交互作用的对象。(2)子系统之间交互关系到描述方式不一样。前者功能之间的交互是通过不太精确的数据流来表示的,而后者对象之间通过消息传递交互关系。

5.面向对象分析 是对目标软件系统需求的深入、精确的建模,但并不回答如何实现目标软件系统。因此它只针对能够体现和说明业务功能的实体类 。实体类的提取包括3个迭代和增量式执行的步骤。(1)用例建模,即功能建模,得到反映目标系统外部与该系统的交互情况的用例图。(2)实体类建模,确定实体类、其属性及他们之间的关系,得到初始类图,也称简单类图。(3)动态建模,确定每个实体类的实例的状态、造成状态变化的事件/操作或条件满足,得到状态图。

6.用例建模:包括参与者、用例及参与者与用例之间的关系。

7.在进行用例建模时,先要确定与目标软件系统有交互、有关联的系统外部。这些与系统有交互、有关联的系统外部就称为系统的参与者。

参与者的类型:人、外部设备、外部系统

参与者的关系:派生(大学生和大四学生,用空心三角)、代理关系(有向虚线)

8.用例之间的关系:派生关系(行内转账和行间转账有着各自的,不同的事件流,它们分别是一个用例,但同时它们又都是一种转账)、

包含关系(一个用例的成功包含另一个用例的成功,那么这两个用例之间就构成包含关系,前者成为基用例,后者称为包含用例;有向虚线从基用例指向包含用例,并标识《include》)

9.一个面向对象软件系统由实体类、边界类和控制类3中类型的类构成。

实体类是对持久性信息的建模。

边界类:目标软件系统有参与者与之进行交互 ,那么该软件系统必须提供其与参与者进行交互的技术可能,即边界。面向对象软件系统的边界由边界类构成。如果参与者是人,则边界就是指用户界面;如果参与者是机器设备或其他系统,则边界即是指系统和外界的接口。

控制类是指对系统框架、系统流程、业务逻辑复杂的算法进行建模。

10.面向对象分析阶段进行的类建模是对目标软件系统功能性需求的静态建模,它只针对一个软件系统范畴内的实体类及其属性、实体类之间的关系 ,不考虑与具体实现有关的边界类和控制类。类建模的成果是初始类图,也称简单类图

进行类建模有两种方法:名词抽取和CRC卡片。

类建模的基本步骤包括名词抽取、确定候选类、构造初始类图

名词抽取:(1)业务领域中的物理实体 ,如商品,楼房。(2)业务领域中的概念实体、逻辑实体 。通常指领域名词,如银行账户(3)业务领域中的动词 ,如考试(4)用例模型中的参与者。做名词抽取,首先要对目标软件系统做言简意赅的描述,从中抽取名词。

eg.国内某慕课平台向广大学员免费提供大量的优质课程资源。课程教师可在该慕课平台管理信息系统上免费注册成为教师用户,注册信息有账号、密码、姓名、所在高校、职称和电子邮箱等;学员可在该系统上免费注册成为学院用户,注册信息有账号、密码、身份证号或学号、就读学校或工作单位、电子邮箱等。已注册的教师登录后可以设置课程,包括课程名称,系统自动生成课程编号;然后教师可以设置该课程新的开课学期,具体信息包括学期开始时间、学期结束时间、课程简介、课程大纲、参考教材等,然后设置课程资源,包括课程教学视频、课程PPT、单元测试题、作业、论坛论题、结课考试试卷等。教师可以参与论坛讨论,对学员进行辅导和启发。已注册的学员用户登录后可以免费选课、观看课程教学视频、浏览课程PPT、做单元测试、做作业、参与论坛讨论、参与结课考试,并可查看自己的结课成绩。一个开课学期结束后,教师可以设置下一个开题学期。

第一步名词提取:国内、慕课、慕课平台、学员、课程、课程资源、教师、慕课平台管理信息系统、用户、注册信息(账号、密码、姓名、所在高校、职称、电子邮箱)、注册、注册信息(账号、密码、身份证号、学号、就读学校、工作单位、电子邮箱)、登录、课程(课程名称、课程编号)、课程开课学期(学习开始时间、学期结束时间、课程简介、课程大纲、参考教材)、课程资源(课程教学视频、课程PPT、单元测试题、作业、论坛论题、结课考试试卷)、观看课程教学视频、浏览课程PPT、做单元测试、做作业、参与论坛讨论、参与结课考试)、结课成绩

第二部确定候选类

学员、教师、用户、账号、密码、姓名、所在高校、职称、电子邮箱、身份证号、学号、就读学校、工作单位、课程(课程名称、课程编号)、课程开课学期(学习开始时间、学期结束时间、课程简介、课程大纲、参考教材)、课程资源(课程教学视频、课程PPT、单元测试题、作业、论坛论题、结课考试试卷)、观看课程教学视频、浏览课程PPT、做单元测试、做作业、参与论坛讨论、参与结课考试)、结课成绩

备注:用户是系统的实体类,"教师"和"学员"是用户的子类;注册信息只是对账号、密码这些业务名称的概称,就没必要保留了。

对候选类进行详细分析:用户(账号、密码、姓名、电子邮箱)、教师(所在高校、职称)、学员(身份证号或学号、就读学校或工作单位)、课程(课程名称、课程编号)、课程开课学期(学习开始时间、学期结束时间、课程简介、课程大纲、参考教材)、课程资源(课程教学视频、课程PPT、单元测试题、作业、论坛论题、结课考试试卷)

第三部:构造初始类图

电梯控制系统的初始类图

某高校图书馆管理信息系统为全校师生员工提供服务,全校师生员工都是借阅者 。身份验证合格的借阅者可以在自助借还书机 上自助办理借书、还书 ,而且借阅者也可以在Web浏览器 上登录图书馆管理信息系统,并可以进行自助续借图书和自助预约图书 。借一本书或续借一本书都在系统中生成一条借书记录 并永久保存。预约图书则在系统中生成一条预约记录并保存在系统中,如果预约时间超过48小时或在48小时内被预约者借出,则该预约记录被删除。系统也永久记录借阅者实际还书时间,每名借阅者最多可以持有15本在借图书。

11.类图是软件系统的静态模型 ,它描述了类承载的数据及其责任、确定了类之间的关系。但类图无法对系统的动态行为和状态进行描述,也就是它无法描述系统重的对象的生成与消亡、对象的状态及其转变、各种事件和条件等。因此,静态模型不能全面描述业务需求。所以在面向对象软件分析过程中,对业务除了要做静态分析,还要做动态分析。

如果系统中的某些对象满足以下条件,则需要对该对象的生命周期进行建模,即需要对这些对象抽象处的类做动态建模,获得该类的状态图。(1)该对象的生命历程中经历了至少两种状态(2)这些状态之间可以单向或双向转变(3)状态的转变是因为某些时间的发生,或者是因为某些条件的满足而产生的。

12**.状态图:状态图用于描述一个对象在其生命周期内所有可能的状态,以及引起状态改变的时间或条件**。状态图的目的是通过**描述某个对象的状态和引起状态转变的事件或条件来描述对象的行为特征。**

**13.条件:**在状态图中,条件通常是时间条件或一个布尔表达式,时间条件满足或布尔表达式的值为真,则发生状态的变化。用[ ]来标识条件,将条件或布尔表达式写到[ ]中。事件和条件可以兼而有之。

动态建模案例:

(1)媒体播放器

(2)图书管理信息系统中的图书

(3)网上购物系统中的订单

(4).电梯控制系统中的电梯

14.类-职责-协作(CSC)卡片是对面向对象分析的成果进行测试的一种重要技术手段。

六、面向对象设计

软件系统设计是从软件需求规格说明出发,针对功能性需求和非功能性需求,形成软件具体设计方案的过程。

软件架构是具有一定形式的结构化元素,即构件的集合,包括处理构件、数据构件和连接构件。处理构件负责对数据进行加工,数据构件是被加工的信息,连接构件把体系结构不同部分组合连接起来。

1.数据库的主要挑战是高速处理大容量的数据数据库的性能 取决于数据库设计和数据库管理系统两个方面。

数据库有两种类型:关系型数据库与非关系型数据库

2.数据库设计是指根据目标软件系统的需求,在某一具体的数据库管理系统上,设计数据库的结构和建立数据库的过程。

在进行关系型数据库的设计过程中,要遵循以下几个原则:(1)命名规范化(2)数据的一致性和完整性(3)数据冗余(4)范式理论(5)善用视图和存储过程

3.软件系统功能模块化就是将程序划分成若干个功能模块,每个功能模块完成一个子功能,再把这些功能模块总起来组成一个整体,以满足整个系统的功能要求。

4.数据结构是以某种形式将数据组织在一起的集合,它不仅存储程序中的数据,还支持对数据的访问和处理。算法是为求解一个问题需要遵循的、被清楚指定的简单指令的集合。

5.用户界面设计三大原则:置界面于用户的控制之下、减少用户的记忆负担、保持界面的一致性

6.面向对象设计概要:一个软件产品必不可少的两个元素:一是职责即操作,二是支持职责履行的数据。因此衍生出两种软件设计的方法:面向操作设计和面向数据设计。

面向对象设计包括以下4项主要工作:(1)构建交互图(2)完成详细类图(3)构造客户-对象关系图(4)对方法进行详细设计

7.UML交互图:用户描述每一个用例情景实现过程中对象之间的交互内容和交互过程,所以交互图是针对用例的。交互图分为顺序图和协作图两种。它们描述的对象是相同的,即参与该用例情景的对象,以及对象之间传递的消息。但是以不同的方式来表达。

8.顺序图:强调的是顺序、时序,是对象之间传递的消息流的序列每一条消息的发送者和接收者。

顺序图的要素有参与者实例、对象、生命线、对象之间传递的消息及其次序

建立顺序图的基本步骤和原则:(1)确定交互过程上下文,要详细审阅有关资料,包括需求、用例建模、类建模和动态建模等文档。

(2)识别参与交互过程的对象,通过对用例基本流和可选流情景的实现过程的设计来识别在其实现过程中需要交互的对象,包括边界类、控制类和实体类。在顺序图的上部列出所选定的一组对象(应该同时给出其类名),并为每个对象设置生命线。通常按照阅读习惯,把发起交互的对象放在左边。

(3)按照通常的阅读习惯,一个顺序图中的第一条消息从顶端开始,并且一般位于图的左边,然后将继发的消息加入图中,稍微比前面的消息低一些。全部消息按照发生的先后,从上向下纵向排列,而且全部消息从序号1开始排序,以减少歧义、便于阅读和识别。

(4)如果因为条件判断出现多个分支,则用A、B、C等字母区分各分支,从而消息序号可能如6A,6B,6C。

(5)确定消息将怎样或以什么样的序列在对象之间传递。从发出信息的对象视角,确定它需要哪些对象的协作,而它又向哪些对象提供协作。

(6)关于消息的指向,要进行深入的分析和设计。

9.教学管理信息系统中的用例|"学生登录"

10.类图并不能反应类之间的层次关系,而客户-对象关系图就是重点反应这些类的层次关系。类之间消息的传递就反映出这种客户-对象关系。消息发送方就是客户,消息的接收方就是对象。在客户-对象关系图中,用箭头从客户指向对象。

七、实现

编程语言的选择应该综合考虑技术因素、经济成本和风险

1.技术因素是指客户对目标软件系统技术方面的需求,这必须在软件系统的整个技术方案中有所考虑。首先,要考虑目标软件系统的应用领域,选择适合该应用领域的编程语言。其次,要考虑目标软件系统是否需要与客户现有的软件系统进行整合,如果是,就要考虑现有软件系统的技术架构,新的软件系统要能够与现有的软件系统无缝对接、整合,要能够以最小的代价实现整合。最后,要考虑开发团队的技术经验和管理经验。

2.经济成本:在软件项目开发过程中,开发方对每一阶段、某一项工作都要考虑成本,否则开发方自身将面临极大的经济压力。编程语言本身与成本无关,但使用编程语言是有成本的。选择某种编程语言就意味着需要掌握该语言的技术开发与维护人员,以及相应的开发工具与平台、服务器等。

八、软件质量保证

1.软件质量指软件产品满足规格说明的程度。软件质量体现在多个方面。主要包括(1)无缺陷(2)满意度(3)产品价值(4)关键属性(5)过程质量。

2**.软件质量保证是指用于衡量和提高软件产品质量的所有活动**。SQA主要有以下两类活动,即V&V

(1)验证:每个阶段结束时,对成果进行验证,即检查每个阶段的成果是否符合其需求和规格说明。

(2)确认:检查最终完成的软件产品是否符合客户和用户的需求和规格说明。

3.SQA管理:软件质量保证由各个工作共同发挥积极作用而达成,参与这些工作的人员主要有两类:参与开发工作的技术小组和负责保证软件质量的SQA小组。

**软件质量小组:**保证交付的软件产品是客户所需要且满意的软件系统,SQA在软件开发的整个流程中都发挥着作用。

一个软件团队分别设置软件开发小组和SQA小组,不仅不会增加软件开发的成本,相反会提高软件产品的质量、可靠性和可维护性,会从后期的开发和维护中得到数倍、数十倍,乃至于数百步的补偿。

4.软件测试是软件质量保证重要的和主要的技术手段。主要有以下两个主要目的(1)发现软件系统中的缺陷,以便修正或减少缺陷。(2)提供该软件系统质量的总体评估,为软件产品在大多数情况下正常运行提供一定程度的保证,并对可能存在的缺陷进行评估。

5.非执行测试:就是在不运行软件代码的前提下测试软件。评审分为走查和审查两种类型。

走查:(1)参与者驱动的方法(2)文档驱动的方法

审查:(1)由负责生成文档的人提供待审查的文档,然后将文档分发给参与者。(2)在准备阶段,每位参与者都试图去详细理解发放的文档。(3)在审查的现场,由一位参与者与审查小组的所有人一起通读整个文档,并且保证涉及文档中的每一个细节,开始查找错误,形成一份潜在错误的清单。与走查一样,审查的主要目的也仅仅是查找错误,而不是修正错误。

**6.基于执行的测试:**基于执行的测试是基于或部分基于在已知环境下,用经过选择的输入执行产品而得到的结果,对软件产品的特定行为特征进行推断的过程。

(1)单元测试:测试单个功能单元,如单个类、单个过程或单个方法。(2)构件测试:把一个功能构件中的多个模块集成在一起进行测试,以测试这些模块的接口的行为与其规格说明是否相一致,它们集成在一起是否能够作为一个功能构件正常工作。(3)系统测试:把该目标软件的所有构件集成在一起,作为一个完整的软件系统来进行测试。

7.假如组织A只使用基于执行的测试,而组织B在进行基于执行的测试前还经过审查。那么你认为组织A的程序员编写出的代码和组织B的程序员编写出的代码会有什么不同。组织A和组织B的后续
维护成本上有何不同?

代码质量的差异:①组织A代码质量可能更低,因为缺少审查,错误和设计缺陷更容易被忽略。程序员更依赖测试来发现问题,而不是在早期就预防错误。可能存在代码风格不一致或设计不

理的情况 ②组织B代码质量更高,因为代码在测试前经过审查,潜在问题可以提前发现,程序员更重视代码可读性和设计规范,减少低级错误,更容易形成高质量的代码库和团队间的知识共享。

维护成本的差异:①组织A维护成本更高,因为缺陷和技术债务在交付后才显现,修复成本增加。可能需要频繁的补丁和紧急修复,导致长期维护负担加重 ②组织B维护成本较低,因为早期

的审查减少了缺陷,代码更易维护。代码质量和设计更稳定,长期来看,减少了故障率和维护复杂度。

总的来说,组织B通过审查提高代码质量,降低了长期维护成本,而组织A可能在交付后面临

更多修复和维护成本。

九、维护

软件维护分为三大类:(1)纠错性维护:软件可能在特定的使用条件下暴露出的一些在测试中没有发现的潜在错误或涉及缺陷。这些错误需要纠正,无论是需求错误、分析错误,还是其他任何错误,这种维护称为纠错性维护。(2)完善性维护。(3)适应性维护

十、软件生命周期

1.瀑布模型:整个过程像瀑布一样,自顶向下,顺次进行需求、分析、设计、实现与维护,直到退役。

瀑布模型中各阶段之间的界限分明,每一个阶段都要严格地等上一阶段结束才能开始,上一阶段输出的工作成果是下一阶段工作的输入。

瀑布模型的优点:(1)软件文档的完备性。(2)有着完备的文档,维护就会更容易;缺点:(1)理解并期盼的软件系统可能与最终实际交付的软件系统有很大的差异(2)不能适应变化的需求。

2.快速原型模型:用快速原型来取代需求阶段,利用可视的、可简单运行的快速原型对软件的需求进行初步的分析和设计,该原型能够明确、清晰地体现和演示目标软件系统的主要功能,客户和用户可以与该原型进行接触和互动,进而基于原型给出更具体的意见和更多的需求细节。

3.迭代与增量模型:即将整个目标软件产品分成若干个子系统,对这些子系统逐一开发并交付,直至整个目标软件产品全部交付给用户,这就是增量;在这些子系统内部则以迭代的方式进行开发。

迭代是重复反馈过程的活动,每一次迭代而产生的版本都越来越逼近目标或结果,直至最终建造出各方面都满意的产品。每一次对过程的重复反馈就称为一次迭代,而每一次迭代得到的结果会作为下一次迭代的初始值。

增量和迭代相互结合和配合;目标软件产品被分成逐个部分的开发和交付,即增量。而每一个增量都经历多个版本,即迭代。

4**.同步稳定模型:**同步稳定软件生命周期模型是主要为软件公司所采用的一种迭代-增量模型,也称为微软解决框架。

5.螺旋模型:可以将螺旋模型简单地看作是在每一个阶段之前带有风险的瀑布模型或快速原型模型。

十一、敏捷软件开发

1.敏捷开发适用于:(1)软件团队拟构件、开发并准备推向市场的是一个小型或中型的团建产品。(2)单位内部定制软件系统的开发(3)客户参与(4)增量式交付(5)人非过程(6)接受变更(7)保持简单性

2.敏捷方法,开发团队将主要经历集中在目标软件本身,而不是在完成大量的文档上。敏捷方法依赖于迭代方法来完成软件分析、设计和开发,最适合在开发过程中需求不断变化的目标软件系统,客户新的需求在下一次迭代中进行设计、实现和交付。

3.敏捷方法的基本原理体现在敏捷宣言,强调软件开发的4种核心价值。(1)个体和互动高于流程个工具(2)运行良好的软件高于详尽的文档(3)客户合作高于合同谈判(4)适应需求变化高于遵循计划,

4.极限编程:敏捷软件开发中富有成效的几种方法之一。它的基础和价值观是交流、朴素、反馈和勇气。即任何一个软件项目都可以从四个方面入手进行改善:加强交流、从简单做起、寻求反馈、用于实事求是。主要目标是降低因需求变更而带来的成本。

5.结对编程:程序员两两配对组合,在同一台计算机上协同工作。

十二、案例实践

相关推荐
蒟蒻的贤8 小时前
软件工程选择题
软件工程
粟悟饭&龟波功1 天前
【软考系统架构设计师】四、信息系统基础知识
系统架构·软件工程
张较瘦_1 天前
[论文阅读] AI + 软件工程 | 叙事的力量+专家智慧:解锁定性软件工程研究的过去、现在与未来
论文阅读·人工智能·软件工程
郝学胜-神的一滴1 天前
设计模式依赖于多态特性
java·开发语言·c++·python·程序人生·设计模式·软件工程
帅次1 天前
系统分析师:软件需求工程的软件需求概述、需求获取、需求分析
设计模式·重构·软件工程·团队开发·软件构建·需求分析·规格说明书
粟悟饭&龟波功1 天前
【软考系统架构设计师】三、计算机系统基础知识
系统架构·软件工程
好大哥呀2 天前
Rider 2025 游戏多引擎适配,开发更高效安装教程
软件工程
粟悟饭&龟波功2 天前
【软考系统架构设计师】一、考试范围及核心知识点梳理
系统架构·软件工程
DisonTangor2 天前
Mistral AI 开源一款专为软件工程任务设计的智能大语言模型——Devstral 2 123B Instruct 2512
人工智能·开源·aigc·软件工程