测试驱动的面向对象软件开发 pdf-软件安全开发生命周期 pdf
让我们一起学习面向对象的软件开发 Linda M. Northrop 我有话要说... 1 历史回顾 为了应对日益复杂的软件需求的挑战,软件行业开发了面向对象(OO)的软件开发模型。 目前,作为应对“软件危机”的最佳对策,面向对象技术受到了广泛关注。 最初被大多数人视为不切实际的方法和满足一时好奇心的研究现在获得了近乎狂热的接受。 许多编程语言都发布了支持面向对象的新版本。 大量面向对象的开发方法被提出。 关于 OO 的会议、研讨会和课程非常受欢迎。 许多专业学术期刊都有专门讨论这个主题的页面。 一些软件开发合同甚至规定必须使用OO技术和语言。 面向对象的软件开发在 90 年代就像结构化软件开发在 70 年代一样,并且 OO 正在获得发展势头。 “对象”和“对象的属性”等概念可以追溯到 20 世纪 50 年代初期。 它们首先出现在有关人工智能的早期著作中。 然而,面向对象的真正发展始于1966年(中国爆发文化大革命的那一年)。 当时,Kisten Nygaard 和 Ole-Johan Dahl 开发了具有更高级别抽象机制的 Simula 语言。 Simula 提供了比子程序更高层次的抽象和封装; 为了模拟一个实际问题,引入了数据抽象和类的概念。
大约在同一时间,Alan Kay 正在犹他大学的个人电脑上努力工作,他希望在这台电脑上实现图形和模拟。 虽然由于硬件和软件的限制,凯的尝试没有成功,但他的想法并没有落空。 70 年代初期,他加入了帕洛阿尔托研究中心 (PARC),将这些想法再次变为现实。 在 PARC,他是一个研究小组的成员,该小组坚信计算技术是改善人与人之间以及人与机器之间沟通渠道的关键。 在这种信念的支持下,并借鉴Simula类的概念,他们开发了Smalltalk语言; 1972 年 PARC 发布了 Smalltalk 的第一个版本。 大约在这个时候,术语“面向对象”正式化了。 Smalltalk 被认为是第一个真正面向对象的语言。 Smalltalk 的目标是使软件设计能够在尽可能自动化的单元中执行。 Smalltalk 中的一切都是对象 ----- 某个类的实例。 在最初的 Smalltalk 世界中,对象与名词密切相关。 Smalltalk 还支持高度交互的开发环境和原型制作方法。 这项原创工作最初未发表,但被视为具有强烈实验性质的学术兴趣。 Smalltalk-80 是 PARC 的 Smalltalk 系列版本,于 1981 年发行。该杂志 1981 年 8 月号发表了 Smalltalk 开发组的重要成果。
在本期杂志的封面上,一个热气球正从孤岛升起,标志着PARC面向对象思想的背离。 是时候向软件开发社区公开发布了。 起初,影响是渐进的,但很快就跃升至爆炸性的程度。 热气球确实起飞了,并产生了深远的影响。 早期的 Smalltalk 对开发环境的研究导致了后续的一系列开发:窗口(window)、图标(icon)、鼠标(mouse)和下拉窗口环境。 Smalltalk 语言也影响了 20 世纪 80 年代早期和中期的面向对象语言,例如:Object-C (1986)、C (1986)、Self (1987)、Eiffl (1987)、Flavors (1986)。 面向对象的应用领域也得到了拓宽。 对象不再仅仅与名词相关联,还与事件和过程相关联。 1980年Grady Booch首先提出面向对象设计(OOD)的概念。 然后其他人紧随其后,面向对象的分析技术开始发表。 1985年,第一个商业化的面向对象数据库问世。 20世纪90年代以来,面向对象的分析、测试、测量和管理等方面的研究都得到了突飞猛进的发展。 目前对象技术的前沿课题包括设计模式、分布式对象系统和基于网络的对象应用。 2 为什么面向对象运动发展到如此狂暴的地步? 一部分源于人们长久以来的希望:人们希望它和以前的其他软件开发技术一样,能够满足软件开发在生产力、可靠性、易维护性、易用性等方面更高、更快、更快的要求。管理。 更迫切的需求。
此外,还有很多原因促成了它的流行。 面向对象开发强调从问题域的概念到软件程序和接口的直接映射; 心理学研究也表明,把客观世界看成许多物体更接近人类的自然思维方式。 对象比函数更稳定; 软件需求的变化通常是与功能相关的变化,而其功能的执行者——对象——通常不会发生重大变化。 此外,面向对象开发支持并鼓励软件工程实践中的信息隐藏、数据抽象和封装。 对象内的修改在本地被隔离。 面向对象的软件易于修改、扩展和维护。 面向对象也被扩展到适用于软件生命周期的所有阶段——从分析到编码。 而且,面向对象的方法天然地支持快速原型制作和RAD(快速应用程序开发)。 面向对象开发的使用鼓励重用,不仅是软件,还有分析和设计模型。 此外,面向对象技术还促进了软件的互换性,即网络中一个节点上的应用程序可以利用另一个节点上的资源。 面向对象开发还支持并发、层次和复杂性,这些都是当今软件系统中的普遍现象。 今天我们经常需要构建一些软件系统——而不仅仅是一个黑盒应用程序。 这些复杂系统通常包含多个子系统的层次结构。 面向对象开发支持开放系统的构建; 使用不同的应用程序进行软件集成具有更大的灵活性。
最后,使用面向对象开发可以减少开发复杂系统时面临的危险,这主要是因为系统集成遍及软件生命周期的所有阶段。 3 面向对象建模 面向对象建模不仅仅是新编程语言的集合。 这是一种新的思维方式,一种关于计算和结构化信息的新思维方式。 面向对象建模将系统视为相互协作的对象。 这些对象是结构和行为的封装,都属于某个类,那些类具有一定的层次结构。 系统的所有功能都是通过对象相互发送消息获得的。 面向对象建模可以看作是一个概念框架,包括以下元素:抽象、封装、模块化、层次结构、分类、并行性、稳定性、可重用性和可扩展性。 面向对象建模的出现算不上是计算领域的一场革命。 相反,它是面向过程和严格数据驱动的软件开发方法的演变结果。 软件开发的新方法由两个来源驱动:编程语言的发展和日益复杂的问题领域的需求。 虽然在实践中分析和设计是在编程阶段之前进行的,但从发展历史来看,是编程语言的创新带来了设计和分析技术的变革。 同样,语言的演变是对日益复杂的计算机体系结构和需求的自然反应。 在影响OO出现的众多因素中,最重要的可能是编程方法的进步。 在过去的几十年里,编程语言对抽象机制的支持已经发展到很高的水平。 这种抽象从地址(机器语言)发展到名称(汇编语言),再到表达式(第一代高级语言,如Fortran),再到控制(第二代高级语言,如Cobol),再到过程和函数(第二代和早期的第三代高级语言,如 Pascal),到模块和数据(第三代后期的高级语言,如 modula),最后到对象(基于对象和面向对象)语言)。
Smalltalk 和其他面向对象语言的发展使得新的分析和设计技术的实施成为可能。 这些新的 OO 技术实际上是结构化方法和数据库方法的融合。 在 OO 方法中,对面向数据流的狭隘关注(例如耦合和聚合)也很重要。 同样,对象内的行为最终需要面向过程的设计方法。 数据库技术中实体-关系(ER图)的数据建模思想在OO方法中也有所体现。 计算机硬件体系结构的进步,性能价格比的提高,硬件设计中对象概念的引入,都对OO的发展产生了一定的影响。 OO 程序通常更频繁地访问内存,需要更高的处理速度。 他们需要并且正在利用强大的计算机硬件功能。 哲学和认知科学的层次和分类理论也促进了OO的产生和发展。 最后,计算机系统不断增加的规模、复杂性和分布都对面向对象技术起到了或多或少的推动作用。 因为影响OO发展的因素很多,而OO技术本身还不成熟,所以在思想和术语上有很多不同的提法。 并非所有 OO 语言生而平等,它们在术语和概念的使用上有所不同。 虽然也有统一的趋势,但是对于如何进行面向对象的分析和设计还没有完全的共识,也没有统一的符号来描述这些活动。 (解释:UML 正朝着这个方向努力)然而,OO 开发已在以下领域证明是成功的:空中交通管理、动画设计、银行、业务数据处理、指挥和控制系统、CAD、CIM、数据库、专家系统、图像识别、数学分析、音乐合成、操作系统、过程控制、空间站软件、机器人技术、电信、界面设计和 VLSI 设计。
毫无疑问,OO技术的应用已经成为软件业发展的主流。 4 面向对象程序设计的概念 在面向对象程序设计中,程序被看作是相互协作的对象的集合,每个对象都是某个类的实例,所有的类形成一个层次结构,通过继承关系连接起来。 面向对象的语言往往具有以下特点:对象生成能力、消息传递机制、类和继承机制。 这些概念当然可以而且已经分别出现在其他编程语言中,但只有在面向对象的语言中它们才会一起出现,以一种独特的合作方式协同工作并相互补充。 程序编程方式:参数输入----- | 代码 | ------结果输出 为了实现某个功能,将参数传入某个过程,最后返回计算结果。 | Object ------ 数据结构 面向对象编程模式:接口 | 对象 ------ 和 | Object ------ Operation 在OOP中,函数是通过与对象的通信获得的。 对象可以定义为封装了状态和行为的实体; 或数据结构(或属性)和操作。 状态实际上是为了执行行为而必须存储在对象中的数据和信息。 对象的接口,也称为协议,是对象可以响应的消息的集合。 消息是对象进行通信并因此获得功能的方式。 对象在收到发给他的消息后,要么执行内部操作(有时称为方法或过程),要么调用其他对象的操作。
所有对象都是类的实例。 类是具有相同特性的对象的集合,或者也可以说类是可以用来生成对象的模板。 对象为响应消息而调用的方法由接收消息的对象决定。 类可以按层次结构排列。 在这个层次结构中,子类可以从更高的超类继承状态和方法。 当一个对象接收到一个消息时,寻找对应方法的过程会从对象的类开始,在类的层次结构中展开测试驱动的面向对象软件开发 pdf,最后,直到找到方法,或者什么都没有(会报错)错误)。 在某些语言中,一个给定的类可以从多个超类继承,这称为多重继承。 如果使用动态绑定,继承会导致多态性。 多态性描述了如下现象:如果几个子类都重新定义了超类的一个函数(都具有相同的函数名),当一个消息被发送到一个子类对象时,该消息将被执行,因为不同的子类被解释为不同的操作。 方法也可以包含在超类的接口中,由子类继承而无需实际定义它。 这样的超类也称为抽象类。 抽象类不能被实例化,所以只能用来生成子类。 语言面向对象语言包含4个基本分支:1基于Smalltalk; 包括5个版本的smalltalk,以Smalltalk-80为代表。 2 C 为基础; 包括基于LISP的objective-C、C、Java3; 包括Flavors、XLISP、LOOPS、基于PASCAL的CLOS4。
包括Object Pascal,Turbo Pascal,Eiffel,Ada 95Simula其实是所有这些语言的始祖。 在这些面向对象的语言中,术语的命名和支持面向对象的能力都有不同程度的不同。 Smalltalk-80虽然不支持多重继承,但仍然被认为是最面向对象的语言(最真实的OO语言)。 在基于 C 的 OO 语言中,Object-C 是由 Brad Cox 开发的,它自带丰富的类库,已成功用于大型系统的开发。 C 由贝尔实验室的 Bjarne Stroustrup 编写。 它将C语言中的STRUCT扩展为具有数据隐藏功能的CLASS。 多态性是通过虚函数实现的。 C 2.0 支持多重继承。 C 是大多数软件领域的首选面向对象编程语言,尤其是在 Unix 平台上。 Sun 微系统公司开发了一种类似于 C 和 C 的新一代基于 Internet 的面向对象语言 Java。 随着互联网的兴起,它在 1995 年风靡一时。 用 Java 编写的 Applet 可以嵌入到 HTML 中进行解释和执行,这使其具有跨平台性。 和 Ada 一样,Java 支持多线程和并发,并且和 C 一样简单和可移植。
基于 LISP 的语言多用于知识表示和推理的应用。 其中,CLOS(Common LISP Object System)是面向对象LISP的标准版本。 在基于 Pascal 的语言中,Object Pascal 是由 Apple 和 Niklaus Wirth 为 Macintosh 开发的,它的类库是 MacApp。 Turbo Pascal 是由 Borland 公司在 Object Pascal 的基础上开发的。 Eiffel 于 1987 年由交互式软件工程的 Bertrand Meyer 发布。 它的语法类似于 Ada,运行在 Unix 环境中。 Ada在1983年刚出来的时候不支持继承和多态,所以不是面向对象的。 1995年,一个面向对象的Ada终于出来了,也就是Ada 95。除了上面提到的面向对象语言之外,还有一些被认为是基于对象的语言。 它们是:Alphard、CLU、Euclid、Gypsy、Mesa、Modula。 5 面向对象软件工程生命周期 尽管面向对象语言取得了激动人心的进展,但我们都知道编码并不是软件开发中问题的主要来源。 相比之下,需求和分析方面的问题更常见,而且纠正它们的成本更高。
因此,对OO开发技术的关注不应只关注编码,还应关注软件工程的其他方面。 OO方法在处理复杂系统的分析和设计以及分析和设计的重用方面的应用前景也十分广阔。 如果我们承认面向对象的软件开发不限于编码活动,那么必须采用新的开发模型,包括新的软件生命周期。 迄今为止最常见的生命周期是“瀑布”模型(结构化)。 它是 20 世纪 60 年代后期“软件危机”之后出现的第一个生命周期模型。 如下。 分析-----设计-----编码-----测试-----维护 如图所示,瀑布式生命周期的开发过程是按顺序进行的; 活动流程基本上是单向的。 它假设开发人员在开发的早期阶段对系统有足够清晰的认识。 不幸的是,无论您是否提前计划,任何软件开发活动都不可避免地涉及大量迭代过程。 好的设计师是既能在抽象层次上工作又能在具体细节上工作的实践者。 总的来说,瀑布式生命周期的缺点表现在三个方面: 后期变更、迭代困难,变更不支持复用 没有统一的模型链接各个阶段。 面向对象的方法是从问题模型开始,然后是识别对象并不断细化的过程。 它本质上是迭代和增量的。 在这里,快速原型制作和反馈回路是必需的标准结构。 开发过程是一个迭代迭代的过程。
随着迭代的进行,系统的功能不断改进。 在这里,传统开发模型在分析、设计和编码阶段之间的界限变得模糊。 之所以这样,是因为对象的概念贯穿了整个开发过程。 对象及其关系成为分析、设计和编码所有阶段的通用表达媒介。 开发的重心已经从编码转向分析,从以功能为中心转向以数据为中心。 此外,面向对象开发的迭代和无缝本质使重用更加自然。 最近,为了提高面向对象开发的可管理性,伯姆(Boehm,1988)提出了一种结合宏观和微观视角(macro & microview)的螺旋式开发模型。 宏观上包括3个阶段: 1分析——发现和识别对象; 2 设计---发明和设计对象; 3 implement---创建和实现对象。 每个宏观阶段都包含一些微观迭代活动。 6 OOA和OOD 由于面向对象技术比较新,因此出现了很多面向对象的分析和设计方法。 面向对象分析 (OOA) 建立在以前的信息建模技术之上,可以定义为一种分析方法,它根据在问题域的词汇表中找到的类和对象的概念来检查需求。 OOA 的结果是从问题域派生出一系列“黑盒”对象。 OOA 通常使用“场景”来帮助确定基本的对象行为。 场景是在问题域中发生的一系列连续活动。
在给定问题域上执行 OOA 时,“框架”的概念非常有用。 框架是应用程序或应用程序子系统的骨架,包含一些具体或抽象类。 换句话说,框架是由描述问题域的抽象父类组成的特定层次结构。 今天流行的所有 OOA 方法的一个缺点是它们都缺乏固定的形式。 在面向对象设计(OOD)阶段,关注的焦点从问题空间转移到理解空间。 OOD 是一种设计方法,包括设计系统的逻辑和物理过程描述,以及系统的静态和动态模型(Booch,1994)。 在 OOA 和 OOD 中,都关注可重用性。 目前,面向对象技术的研究人员正在尝试定义“设计模式”的概念。 它是一种可重用的“财富”,可以应用于不同的问题领域。 一般来说,设计模式是指多次出现的设计结构或解决方案。 如果系统地对它们进行分类,它们就可以被重复使用,并且可以形成不同设计之间进行交流的基础。 OOD技术其实比OOA技术出现得更早。 目前,很难在 OOA 和 OOD 之间划清界限。 因此,以下描述给出了一些常用的 OOA/OOD 技术的(联合)概述。 迈耶使用语言作为表达设计的工具。 (1988) Booch 的 OOD 技术扩展了他之前在 Ada 上的工作。
他采用“往返格式塔”的方法,包括以下过程:识别对象,识别对象的语义,识别对象之间的关系,实施,并包括一系列的迭代。 Booch 是第一个使用类图、类分类图、类模板和对象图来描述 OOD 的人 (1991)。 Wrifs-Brock 的 OOD 技术由责任代理人驱动。 类职责卡用于记录负责特定功能的类。 确定类及其职责后,进行更详细的子系统关系分析和实现。 (1990) Rumbaugh 使用三种模型来描述一个系统: 1 对象模型,它描述了系统中对象的静态结构; 2 动态模型,它描述了系统随时间的状态; 3 功能模型,它描述了系统中每个数据值的转换。 分别用对象图、状态转换图和数据流图来描述这三种模型。 (1991) Coad 和 Yourdon 使用以下 OOA 步骤定义了一个多级 OO 模型(5 级):识别类和对象、识别结构和关系、识别主题、定义属性和定义服务。 这五个步骤对应于模型的五个层次,即类和对象层、主题层、结构层、属性层和服务层。 他们的 OOD 方法是多层次和多组件的。
层次结构与 OOA 相同。 方面包括:问题域、人与人的交互、任务管理和数据管理。 Ivar Jacobson 提出了 Objectory 方法(或 Jacobson 的方法),这是他在瑞典的 Objective 系统中开发的一种面向对象的软件工程方法。 雅各布森的方法特别强调“用例”的使用。 Use Case成为分析模型的基础,通过Interaction Diagram进一步描述后形成设计模型。 用例还推动了测试阶段的测试工作。 迄今为止,雅各布森法是最完整的工业方法。 (1992) 上述方法有很多变体,不可能一一列举。 近年来,随着各种方法的发展测试驱动的面向对象软件开发 pdf,它们也相互融合。 1995年,Booch、Rumbaugh和Jacobson共同提出了第一版UML(Unified Modeling Language),一种集成建模语言。 (目前它已经成为面向对象建模语言的事实标准) 7 管理问题 当组织转向面向对象的开发技术时,支持软件开发的管理活动也必须改变。 致力于 OO 技术意味着改变开发过程、资源和组织结构。 (Goldberg 1995)OO 开发的迭代、原型设计和无缝性质消除了传统开发模型不同阶段之间的界限。
必须重新定义新的边界。 同时,一些软件测量方法不再适用。 “代码行”LOC(Lines of Code)肯定已经过时了。 重用的类的数量、继承层次的深度、类之间的关系的数量、对象之间的耦合程度、类的数量和大小更有意义。 面向对象的软件度量工作是相当新的,但已经有一些参考资料。 (Lorenz 1993) 资源分配和人员配备都需要重新考虑。 开发团队的规模逐渐缩小,善于复用的高手开始吃香。 重点应该放在重用而不是 LOC 上。 重用的真正实现需要一套全新的规则。 在执行软件合同的同时,还必须建立库和应用程序框架。 长期投资策略以及维护这些可重复利用财富的承诺和流程变得更加重要。 至于软件质量保证,传统的测试活动仍然需要,但它们的时间和定义必须改变。 比如“走遍”某个功能,会涉及激活一个场景(scenario),一系列对象交互,发送消息,实现某个功能。 测试 OO 系统是另一个需要进一步研究的主题。 发布稳定的原型需要不同于传统控制产品结构化开发的配置管理。 另一个需要注意的管理方面是适当的工具支持。 面向对象的开发环境是必须的。 还需要:一个类库浏览器、一个增量编译器、一个支持类和对象语义的调试器、对设计和分析活动和引用检查的图形支持、配置管理和版本控制工具,以及一个类似于类库的数据库应用程序。
成本估算也是一个问题,除非面向对象的开发历史足以提供有关资源和消耗的数据。 当前和未来的再利用成本应纳入计算公式。 最后,管理层必须了解转向面向对象方法所涉及的风险。 比如消息传递,消息传递的爆炸式增长,动态内存分配和释放的成本。 还有一些初始风险,例如熟悉适当的工具、开发策略以及适当的培训、类库开发等。 8 向面向对象的过渡可能相当漫长。 培训是必须的。 一个实验向导项目也是必要的。 建议不要结合使用结构化和面向对象的方法。 越来越多的证据表明,成功需要一个完整的 OO 解决方案。9 未来 总的来说,面向对象技术是以前软件开发技术的自然演变,并且对许多应用领域的软件开发都有很大的前景。 借用 Maurice Wilkes 在图灵奖颁奖典礼上的演讲中的话:“对象是自 1970 年代以来软件世界中最激动人心的创新之一。” (1996) 然而,面向对象开发并不是包治百病的灵丹妙药,其发展还远未成熟。 但是,尽管 OO 技术的未来不明朗,但 1990 年代初期做出的一些预测已经成真。 (Winblad 1990) 类库和应用程序框架已经在市场上可用。 已经实现了应用程序和环境之间对信息的透明访问。 支持用户到应用程序通信和多媒体工具包的面向对象继承的环境正在出现。 随着经验的积累,OO的开发会越来越流行,OO技术也会越来越成熟。 当然,OO技术也可能被处理更高抽象层次的开发技术所取代或集成。 这些只是推测。 虽然谈论对象在不久的将来无疑会过时,但现在,有很多问题等待真正热情地解决。下载本文的示例代码
面向对象软件开发 面向对象软件开发 面向对象软件开发 面向对象软件开发 面向对象软件开发 面向对象软件开发 面向对象软件开发 面向对象软件开发 面向对象软件开发 面向对象软件开发 面向对象软件开发