1.绪论软件=程序+数据+文档;软件工程=过程+方法+工具(过程:when、in what order方法:what);软件过程:是指一套关于项目的阶段、状态、方法、技术和开发、维护软件的人员以及相关Artifacts(计划、文档、模型、编码、测试、手册等)组成。
三种方法:UP(the unified process),The OPEN Process,OOSP(The Object-Oriented Software Process)。
2.软件工程模型回顾软件过程的基本模型:线性顺序模型:瀑布模型(Waterfall);进化模型:原型法模型(Prototyping);基于构件的开发模型(Component-Based Development)。
迭代模型:增量模型(Incremental);螺旋模型(Spiral)其他(Formal,RAD,4GT) 2.1瀑布模型(Royce,1970)历史最悠久、应用最广泛,虽然Royce 提出的瀑布模型支持反馈环,但大多数使用该过程模型的机构均将其视为严格线性的过程模型。
瀑布模型的流程(无反馈环):分析→设计→编码→测试。
缺点:①实际项目很少按照该模型给出的流程进行。
虽然线性容许迭代,但这种迭代是间接的,且极容易导致混乱。
②客户常常很难清楚地给出所有需求,但该模型却要求非得如此,并且不能忍受项目开始阶段自然存在的不确定性。
③客户必须有足够的耐心,因为软件产品的运行版本一直要等到项目开发周期的晚期才能得到。
④如果直到检查运行程序时才发现大的错误,其后果很有可能是灾难性的。
⑤线性顺序会导致“阻塞状态”,即等待时间> 开发时间。
2.2原型法模型(Bernard Boar,1984)帮助客户明确其需求(以增量方式进行)原型法模型的流程(环状)规格描述、开发和验证等阶段交织在一起;原型的本质:“口香糖+ 打包绳”。
优点①开发者与客户之间的误解,可通过对系统功能的“示范”而被识别出来。
②客户在使用原型法模型期间,可以发现新的需求或找出未发觉的问题。
③可大量节约开发成本,并可提高系统的应变能力。
缺点①原型只包含局部功能,难以掌握系统的整体动态状况。
②许多机构认为在原型上花费过多资源是一种浪费,因为原型一般(二般呢?……) 无法成为真正的系统而必须抛弃。
③维护工作较为困难。
2.3基于构件的开发(Component-Based Development,CBD)出发点:复用;基础:庞大的可复用软件构件库+ 构件的集成框架;CBD 的典型代表:统一软件开发过程(Unified Software Development Process,USDP)优点①能显著减少软件开发工作量(70%),从而能显著降低开发成本(84%) 和开发风险。
②软件产品可以尽快交付客户。
缺点①需求折衷无法回避,可能导致系统与客户实际需求背离。
②当可复用构件的新版本不受开发者的掌控时,系统的演化能力将可能受损。
未来:面向对象技术将使CBD 如虎添翼,因为面向对象技术能够开发出大量可复用的构件。
2.4增量模型:融合了瀑布模型的基本成分和原型法模型的进化特征;每一个线性序列产生软件的一个可发布的“增量”;任何增量的处理流程均可以结合原型法模型;第一个增量往往是核心的产品增量模型vs.原型法模型:与原型法模型最大的不同在于,增量模型特别强调每一个增量均发布一个可操作产品,亦即早期的增量是最终产品的“可拆卸”版本。
优点①不必等到最终产品完成,客户便可以从早期增量受益。
②客户可以把早期增量作为原型,并为后期增量提出需求。
③尽管某些增量可能存在问题,但是整个项目的风险较低。
局限性①增量不能太大②每个增量均应具备一定功能③客户需求与增量大小之间的映射应匹配。
发展:极限编程。
2.5螺旋模型(Boehm,1988)吸收了瀑布模型和原型法模型的优点;增加了风险分析;使软件的增量版本的快速开发成为可能。
优点①使用原型实现作为降低风险的机制。
②在系统开发初期,风险性高的部分首先被考虑,从而能及早发现错误、降低风险并减少开发成本。
③在编写软件时,已有产品可供运行或“示范”。
缺点①客户对该模型的可控性常常产生疑虑。
②开发者需要具备和掌握较多风险评估的知识和技术。
③如果某个大风险未被及时考虑,会给后续开发造成困难。
2.6形式化模型(Formal)的局限性:开发很费时、很昂贵。
具有使用形式化模型所必需背景的开发者寥若晨星,尚需多方面的培训。
当客户对形式化模型一无所知时,开发者无法将该模型作为和客户进行通信的机制。
2.7快速应用开发(RAD)强调极短的开发周期;是线性顺序模型的一个“高速”变种;与增量模型具有相似性;通过使用基于构件的建造方法实现快速开发;RAD主要用于信息系统开发。
缺点①对于大型软件开发项目必须有足够的人力资源支持②要求客户和开发者均应在短的时间框架内完成各自相应的快速活动,任何一方爽约均会导致项目失败③当系统难以模块化时,或者当高性能是系统的主要指标时,RAD 将可能失效④RAD不适合技术风险高的情况2.8第四代技术(4GT)是多种软件过程模型的综合;包含了一系列软件工具;开发者在更高抽象层次上描述软件规格;软件工具根据开发者的软件规格描述自动生成源代码。
优点①显著缩短了软件的开发时间②显著提高了建造软件的生产率。
缺点①目前的4GT 工具易用性不够高②目前的4GT 工具生成的源代码太低效③使用4GT 工具开发的大型软件产品的可维护性令人生疑。
未来:4GT与基于构件的模型相结合后,将可能成为软件开发的主流方法。
3.面向对象概述问题空间中,对象是现实世界中存在的实体应用所关心的抽象,概念、规则、事件、或者具有明确边界和意义的具体事物。
解空间中,对象是问题空间中的对象在计算机系统中的表示, 封装(encapsulation) 了数据和行为的通信单位。
对象的非严格记法:<对象> ::= <接口,数据,行为>。
对象的基本特征①每个对象均有自己的惟一标识,从而区别于 其他对象。
②对象之间通过消息进行通信。
③对象总是处于一 定的状态。
④对象有若干种行为。
⑤对象的行为分为三类:创建新对象、与其他对象通信、改变自身状态。
⑥对象的状态只能被自身的行为所改变。
⑦某个对象的状态可以由多个其他对象的状态构成。
类是创建对象的模板问题空间中:类代表着具有类似性质的一组对象;类中的每一个对象即为类的不同实例。
解空间中:类是对一组对象的抽象,集中了该组对象的共同特性。
类实际上是具有特定功能的模块。
类vs. 对象:静 vs. 动。
抽象数据类型 (Abstract Data Type ,ADT)是对一组对象的更高层次抽象。
ADT = 数据 + 操作。
ADT vs. 类:类=ADT+实现(可能只是部分);类“瘦”极限(未进行任何实现)=ADT ;“胖”极限(完全实现),有效类。
类间关系:继承 (inheritance);聚合 (aggregation);关联 (relationship)。
继承的含义:是一种“求同存异”的高度抽象方式。
(一般化(generalization),具体化(specialization))。
一般化、具体化、继承等术语均是复用思想的体现;一般化和具体化是对同一个类间关系的不同角度审视:父类是子类的一般化 (从父类角度看);子类是父类的具体化(从子类角度看)。
继承强调一般化 / 具体化关系中共享属性和操作的机制。
聚合的含义:表示“部分——整体”关系(组元类 (component class),组合类(assembly class))。
组合对象的存在依赖于组元对象。
性质:传递性 (递归聚合的基础);逆对称性。
关联的含义:对象实例之间的物理或概念联结被称为链;关联是对一组语义与结构相似的链的抽象;链是关联的实例。
聚合 vs. 继承:聚合更强调对象实例之间的关系,本质上是“与关系”(is partof ,ISP)继承更关注对象类之间的关系,本质上是“或关系”(is a,ISA)。
聚合 vs. 关联:聚合是关联的一种特殊形式;聚合与关联之间的模糊差异无关紧要。
消息是对象之间进行通信的构造或结构;消息分为请求消息和完成消息两种;消息模式:发送对象、接收对象、内容。
事件指对象之间一次消息的传递;多个事件按照时间顺序可构成事件序列。
消息 vs. 事件:静 vs. 动。
消息与对象:一个对象能接收不同形式不同内容的多个消息。
相同形式的消息可以送往不同的对象。
对于相同形式的消息,不同对象可以有 不同的解释,可以做出不同的反应。
消息与方法:对象接收到有效消息后,总会以某种行为做出适当反应。
期间,对象行为复用了类操作的代码实现(即类方法)。
消息与方法可视为同义词。
消息与代码无关,而方法是操作的代码实现。
消息传递 vs. 过程调用:当同一发送对象在不同时刻向同一接收对象多次发送相同消息时,接收对象依其当前状态不同可以做出不同反应。
消息传递可以异步进行,从而允许并行与分布执行。
如果过程体中只有局部变量,当同一调用者用相同参数值调用同一过程时,其调用结果在任何时刻都必然相同。
过程调用只能同步,其本质是串行执行。
多态性:含义:同一个操作可以是多个不同类的行为。
不同对象接收到同一个消息后,可产生完全不同的反应。
同一个消息可调用不同的方法。
意义:允许每个对象以自己最合适的方式去响应共同的消息,从而增强软件的灵活性和可复用性。
面向对象的特性:标识惟一性;分类性;多态性;继承性。
面向对象的主题:抽象;封装;归并数据与行为;共享/复用;强调对象结构而不是程序结构。
面向对象 = 对象 + 分类 + 继承 + 消息4. 典型面向对象方法摘要面向对象方法的发展:面向对象方法最早于 1986 年提出。
刚一开始就有五、六种面向对象方法。
之后的五年间迅速涌现出了 50 余种面向对象方法。
部分著名学者:Grady Booch ;James Rumbaugh ;Ivar Jacobson ;Coad 、Yourdon ;Shlaer 、Mellor ;Martin 、Odell 。
六种典型面向对象方法:①面向对象分析与设计 (OOA/OOD),Grady Booch ②对象建模技术 (OMT),James Rumbaugh ③面向对象软件工程 (OOSE),Ivar Jacobson ④面向对象分析与设计 (OOA/OOD),Coad & Yourdon ⑤面向对象系统分析 (OOSA),Shlaer & Mellor ⑥面向对象分析设计 (OOAD),Martin & Odell 一般化4.1面向对象分析与设计(OOA/OOD)四种模型:逻辑模型、物理模型、静态模型、动态模型;六种图:类图、对象图、交互图、状态迁移图、模块图、进程图;两种过程:宏观过程、微观过程。