软件工程方法论
软件工程中的软件测试策略与方法论

软件工程中的软件测试策略与方法论软件测试是软件开发过程中不可或缺的一环,它的目标是发现和纠正潜在的软件缺陷,以确保软件的质量和稳定性。
然而,在软件工程中,如何选择合适的测试策略和方法论,以及如何有效地进行测试,都是非常重要的问题。
本文将介绍几种常见的软件测试策略和方法论,并分析它们的优缺点。
一、白盒测试白盒测试是一种基于代码内部结构的测试方法,它通过检查程序的内部逻辑和数据流来验证软件的功能和正确性。
白盒测试可以帮助测试人员深入了解软件的内部结构,并揭示隐藏的错误和缺陷。
其主要方法包括语句覆盖、分支覆盖、路径覆盖等。
白盒测试的优点是可以发现细粒度的错误,并提供代码覆盖率的度量,有助于提高软件的稳定性和可靠性。
然而,白盒测试需要测试人员具备良好的编程和调试能力,并且需要了解软件的内部实现细节。
此外,由于白盒测试主要关注程序代码的正确性,而忽略了系统整体的功能和用户需求,因此可能会遗漏一些潜在的缺陷。
二、黑盒测试黑盒测试是一种基于软件功能和用户需求的测试方法,它从外部对软件进行测试,而不需要了解其内部实现细节。
黑盒测试通过设计测试用例来检查软件的输入、输出和功能是否符合预期,以验证软件的正确性和健壮性。
黑盒测试的优点是可以覆盖广泛的功能和用户场景,从而更好地满足用户的需求。
同时,黑盒测试不需要了解软件的内部实现细节,因此对测试人员的技术要求相对较低。
然而,黑盒测试只能检验软件功能的正确性,而无法发现程序内部的错误和缺陷。
因此,在真实的软件开发过程中,通常需要将黑盒测试与其他测试方法相结合使用。
三、灰盒测试灰盒测试是白盒测试和黑盒测试的结合,它既关注软件内部的结构和逻辑,又考虑软件的功能和用户需求。
灰盒测试通过设计测试用例,结合对软件内部结构的了解,来验证软件的正确性和稳定性。
灰盒测试的优点是综合了白盒测试和黑盒测试的优势,既能发现细粒度的错误,又能满足用户的需求。
然而,灰盒测试需要测试人员具备一定的编程和调试能力,并且需要花费较多的时间和精力来设计和执行测试用例。
软件工程方法论

软件工程方法论软件工程是一种以工程化的方式来开发和维护软件系统的学科。
在软件工程领域,方法论是指按照特定的理论和实践原则,组织和管理软件开发过程的方法和技术。
在本文中,我们将探讨软件工程方法论的定义、重要性以及一些常见的软件工程方法。
一、软件工程方法论的定义软件工程方法论是指在软件开发过程中使用的一系列方法、技术和工具。
它们是根据软件工程领域的最佳实践和经验总结而得出的,可以帮助开发团队高效地进行软件开发、测试和维护。
软件工程方法论包括需求分析、设计、编码、测试、集成和发布等多个环节,以确保软件系统的质量和效率。
二、软件工程方法论的重要性软件工程方法论对于提高软件开发的效率和质量至关重要。
它可以帮助开发团队在整个开发生命周期中规范各个阶段的工作流程,减少错误和风险,并且提高软件系统的可维护性和可扩展性。
软件工程方法论还能够提供标准化的开发过程和文档,使开发团队能够更好地协作和沟通。
三、常见的软件工程方法1. 瀑布模型:瀑布模型是软件开发生命周期的经典方法之一。
它的特点是各个阶段依次进行,每个阶段的输出作为下一个阶段的输入。
瀑布模型适用于需求明确、稳定的项目,但对于需求变化频繁的项目可能不适用。
2. 敏捷开发:敏捷开发是一种迭代、增量的开发方法。
它强调团队的协作和快速响应客户的需求变化。
敏捷开发包括多种方法,如Scrum、XP等。
敏捷开发适合需求变化频繁或项目规模较小的项目。
3. 原型开发:原型开发是一种通过迅速构建初步的原型来验证系统需求、设计和功能的方法。
它可以帮助开发团队更好地理解用户需求,并及早发现和解决问题。
原型开发适用于需求不确定或创新性较强的项目。
4. DevOps:DevOps是一种将开发和运维紧密结合的开发方法,旨在实现快速、可靠的软件交付。
DevOps强调自动化测试、持续集成和持续交付,以快速响应需求变化和提高软件质量。
四、结语软件工程方法论对于软件开发项目的成功至关重要。
不同的项目可以选择适合自己的开发方法,以提高效率和质量。
软件工程方法论教案-章程

–细化初始用例
–编写正规的用例
5.3补充用例的UML模型
–开发活动图
–泳道图
归
纳
总
结
通过本次课的学习,掌握需求分析的概念,掌握基于场景建模的方法,掌握流程图和泳道图的画法。
第六次课程教学方案
周次
6
课时数
2
教学章节
第5章需求建模:场景、信息与类分析
5.4数据建模的概念
5.5基于类的建模
目标要求
□ CAI课件 □ IP课件 □ 其他资源:
课后作业
P109 5.5,5.8
板
书
设
计
教学课件《第5章需求建模:场景、信息与类分析》
第六次教学活动设计
教学
环节
内容设计与手段
导
入
新
课
1.回顾上一次课内容
2.导入第五章基于类建模的课程内容
讲
授
内
容
5.4数据建模的概念
•检查数据对象的独立处理
•注意力集中在数据域
–CRC模型实际上是表示类的标准索引卡的集合。这些卡片分为三部分,顶部写类名,卡片主体左侧部分列出类的职责,右侧部分列出类的协作者。
归
纳
总
结
通过本次课的学习,掌握数据建模的概念,掌握基于类的建模的方法,掌握CRC卡的方法。
一组使用场景(用例)
一个原型
确认——一种审查机制,即找出:
内容或解释上的错误
可能需要进一步解释澄清的地方
丢失的信息
不一致性(这是建造大型产品或系统时遇到的主要问题)
冲突的需求或不可实现的(不能达到的)需求
需求管理
4.2建立根基
确认利益相关者(stakeholders)
软件工程的开发方法论与实践技巧

软件工程的开发方法论与实践技巧简介随着信息技术的飞速发展,软件已经成为现代社会发展的重要支柱,因此软件开发的成功与否将直接关系到企业的生存与发展。
软件工程的开发方法论和实践技巧是软件开发的核心,本文旨在介绍软件工程的开发方法论和实践技巧,以便开发人员能够快速掌握软件开发的要点,提高软件质量和效率。
一、软件开发流程模型软件开发流程模型是软件工程的开发方法论中最重要的内容之一,它指导着软件开发流程的整个过程。
常见的软件开发流程模型包括瀑布模型、迭代模型、敏捷模型等。
1、瀑布模型瀑布模型是最早应用于软件开发中的开发模型,其开发流程包括需求分析、设计、编码、测试和维护等阶段。
该模型适用于需求比较明确的开发项目,但对于需求不明确、变化较快的开发项目不适用。
2、迭代模型迭代模型是在瀑布模型基础上进一步发展,该模型在每个阶段后增加了迭代环节,能够更好地适应需求变化较大的开发项目。
3、敏捷模型敏捷模型是一种应对需求不明确的开发模型,其特点是注重人员互动和响应变化,通过快速开发迭代的方式来掌握需求,减少风险。
该模型适用于小团队开发、需求变化较大的项目。
二、开发工具和技术1、版本管理工具版本管理是软件开发过程中最常见的问题之一,版本管理工具可以帮助开发人员实现版本控制和开发过程的监控和管理。
常见的版本管理工具包括Git、SVN等。
2、自动化工具自动化工具可以提高软件开发的效率和质量,比如持续集成工具Jenkins、自动化测试工具Selenium等。
3、UMLUML是一种面向对象的建模语言,在软件开发中起着重要的作用。
通过UML可以描述软件的结构、行为和交互等,以便开发人员更好地理解和设计软件系统。
三、编码规范和测试方法1、编码规范编码规范是软件开发过程中的重要环节之一,它包括程序风格、注释、命名规则、异常处理等规范,能够提高代码的可读性、可维护性和质量。
常见的编码规范包括Google Code Style、Sun Code Style等。
软件工程方法论

软件工程方法论随着科技的发展和普及,软件在我们的日常生活中扮演着越来越重要的角色。
无论是手机应用、电子商务平台还是智能设备,我们都离不开软件的支持。
然而,软件开发的过程却并不简单,为了确保开发出高质量的软件,软件工程方法论应运而生。
软件工程方法论是一套规范化的软件开发方法,旨在提高软件开发过程的效率和质量。
它包含了一系列的实践和原则,涵盖需求分析、设计、开发、测试和维护等阶段。
首先,需求分析是软件开发的重要环节。
在这个阶段,开发团队与客户密切合作,明确客户的需求和期望。
通过与客户的交流和沟通,开发团队可以准确捕捉到软件的功能需求,并将其转化为开发所需的规范和文档。
接下来是设计阶段。
在这个阶段,开发团队将需求转化为软件的架构和设计。
他们定义系统的操作流程、数据结构和模块化组件等。
设计的目标是保持软件的简洁性、可维护性和可扩展性,以确保软件的稳定性和性能。
开发阶段是将设计的理念转化为具体的代码实现。
开发团队利用各类开发工具和编程语言,按照规范进行编码。
在开发过程中,团队成员之间需要进行良好的协作和沟通,以确保代码的质量和一致性。
测试阶段是确保软件质量的关键环节。
测试团队负责验证软件的功能是否符合需求,并进行性能、安全性、稳定性等方面的测试。
他们使用各类技术手段和工具,如单元测试、集成测试和系统测试,以发现和修复软件中的潜在问题。
最后是软件的维护阶段。
在软件交付给客户后,需要定期进行维护工作,确保软件的正常运行。
这包括修复报告的缺陷和错误,更新软件的功能和性能,处理用户的反馈和需求变更等。
维护阶段的目标是保证软件的稳定性和可靠性,提升用户体验。
除了以上几个阶段,软件工程方法论还注重于项目管理和质量控制。
项目管理涉及资源的分配、进度的控制和团队的协调等,以保证项目的顺利进行。
质量控制则着重于规范和标准的制定,以确保软件的质量和符合相关标准。
总的来说,软件工程方法论是一套能够帮助开发团队高效开发高质量软件的方法和实践。
软件工程方法论教案-章程

(二)细化阶段
(三)构建阶段
(四)转换阶段
(五)生产阶段
归
纳
总
结
通过本章的学习,掌握通用过程模型,掌握惯用的过程模型。
第三次课程教学方案
周次
3
课时数
2
教学章节,阐述软件工程中敏捷理念的四个关键问题:自我组织团队对所开展工作具有控制力的重要性;团队成员之间以及开发参与者与客户之间的交流与合作;对“变更代表机遇”的认识;强调快速软件交付以让客户满意。并对最广泛应用的敏捷过程极限编程(XP)做出讲解。掌握用敏捷开发的方法以适应现代软件工程的需求。
□ CAI课件 □ IP课件 □ 其他资源:
课后作业
P15:1.5、1.8
板
书
设
计
教学课件《第1章软件和软件工程》
第一次教学活动设计
教学
环节
内容设计与手段
导
入
新
课
1.全面地介绍《软件工程方法论》的课程内容、课程目的和课程要求
2.提问:软件和软件工程的区别和联系;什么是方法论?
3.导入第一章的课程内容
确定一套解决需求问题的初步方案
4.4开发用例
一组用户场景,描述系统的线程使用
从“参与者”的点-视角来描述每一个场景——人或设备以某种方式与软件交互
4.5构建需求模型
分析模型的元素
基于场景的元素
功能说明——处理软件功能的描述
用例——描述“参与者”和系统之间的交互作用
基于类的元素
由场景暗示
行为元素
状态图
讲
授
内
容
5.1需求分析
–确定软件的操作特性
–指明软件和其他系统元素的接口
软件工程的基本理论与方法

软件工程的基本理论与方法软件工程是一门涉及计算机科学、数学和工程学的跨学科领域,它主要研究的是软件的开发、维护和管理。
随着计算机技术的快速发展,软件工程也在不断地发展和完善。
本文将着重从基本理论和方法两个方面介绍软件工程的发展情况。
一、软件工程的基本理论1、软件开发生命周期软件开发生命周期是软件工程中最基本的理论之一,它是描述软件开发过程中各个阶段的生命周期。
软件开发生命周期通常被分为五个阶段:计划阶段、需求分析阶段、设计阶段、编码阶段和测试阶段。
这五个阶段彼此关联和依赖,每一个阶段完成后都需要进行验证和确认,以确保软件质量的稳定和良好。
2、软件质量软件质量是衡量软件是否具有可靠性、耐用性、可维护性、可用性等方面的能力的基本量化指标。
准确地衡量软件质量通常需要根据一系列的因素来考虑,比如软件的性能、稳定性、界面友好性等。
3、代码风格代码风格是指程序代码的书写规范,它主要包括代码的缩进、变量命名规范、代码注释等多个方面。
好的代码风格不仅能够提高代码的可读性和可维护性,而且还能够提高代码开发的效率和精确度。
4、面向对象编程面向对象编程是程序设计中的一种方法论,它将现实世界中的事物看作是对象。
这种编程方式能够提高代码的复用性、可扩展性和可维护性,因此受到了广泛的认可和应用。
二、软件工程方法1、面向对象方法面向对象方法主要是以对象为中心,将数据和方法组织成为一个整体。
在这种方法中,数据和方法是紧密相连的,对象内的方法(也称类方法)可以访问其他对象的数据,从而解决了程序设计中的许多问题。
2、正式方法正式方法是软件工程中的一种强制性的方法,它主要是一种数学化的方法,用于分析、设计和验证软件。
这种方法虽然复杂,但是能够提供高质量、高可靠性的软件。
3、自底向上方法自底向上方法通常用于软件模块的编写和开发。
这种方法是先定义好子程序,然后在将子程序组合成更大的程序。
这种方法适合于比较大型的项目,因为它可以将一个复杂的问题分解为独立的、易于管理的子问题。
基于ISO 29110 轻型软件工程方法论的软件开发质量保障研究

基于ISO 29110 轻型软件工程方法论的软件开发质量保障研究随着社会不断发展和科技的不断进步,软件开发这一行业也越来越受到重视。
在软件开发过程中,如何保障软件质量成为一大难题。
ISO 29110轻型软件工程方法论,是一种非常实用的软件开发方法,它在保证软件质量的同时,也尽可能地降低了软件开发过程中的成本和风险。
一、ISO 29110方法论概述ISO(国际标准化组织)是一家全球性的、非政府间的国际标准化组织,其定位是制定国际标准。
ISO 29110是ISO/IEC软件工程标准的一个子集,它主要针对小型企业和小型团队,为他们提供了一套完整的软件开发流程,并指导他们如何执行和管理软件开发过程。
ISO 29110方法论最早是针对开发人员、开发团队和小型企业和团队设计的,现在已经向更广泛的范畴推广,成为了一种标准的软件开发流程和方法论。
二、轻型软件工程方法论的特点轻型软件工程方法论是一种使用最少的流程和文档来完成软件开发的方法,其特点主要体现在以下几个方面:1、轻重适度轻型软件工程方法论(LSEM)是一种适度、有针对性的方法。
他们的旨在帮助开发人员,而不是给他们增加负担。
LSEM假定开发者本身已经具有技术知识,因此LSEM只是提供指导,而不是要求开发者像人形机器一样去执行。
2、注重实现的效率轻型软件工程方法论的代表 ISO/IEC 29110对软件过程和管理提供了支持,实现高质量、高效益和高度可控的软件开发。
ISO/IEC 29110的敏捷、简洁和模块化的特点与小型企业的管理理念相适应,只要熟悉该方法,就可以对软件开发过程执行和管理进行规范。
3、集成化轻型软件工程方法论采用模块化设计,将管理过程、产品定义和产品开发分开进行,并且它们之间互相联系,这种集成化的设计可以减少沟通的成本,使开发过程变得更加简单、准确和高效。
三、ISO 29110方法论在软件开发中的实践ISO 29110方法论在软件开发中有着广泛的应用,它通过规范化的软件开发流程,确保了软件的质量,同时也提高了软件开发的效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件工程方法论不同的人在谈面向对象编程(OOP)时所指的含义并不相同。
有人认为任何采用图形界面的应用程序都是面向对象的。
有人把它作为术语来描述一种特别的进程间通信机制。
还有人使用这个词汇是另有深义的,他们其实是想说:“来啊,买我的产品吧!”我一般不提OOP,但只要提到,我的意思是指使用继承和动态绑定的编程方式。
--《C++沉思录》《C++沉思录》说的是十几年前的事了,现在大家对面向对象的回答已经是众口一词:封装、继承和多态。
大家都知道,在面向对象中,一辆汽车是一个对象,汽车这个概念是一个类。
汽车有漂亮的外观,把各种内部原理都隐藏起来了,司机不必知道它的内部工作原理仍然能开车,即使汽车随技术的进步不断升级,对司机也没有什么影响,这就是封装的好处。
汽车是交通工具的一种,汽车是一个类,交通工具也是一个类,而交通工具类包括了汽车类,从而具有更广泛的意义。
这种从抽象到具体的关系就是继承关系,我们可以说汽车类继承了交通工具类,汽车类是交通工具类的子类,交通工具类是汽车类的父类。
作为交通工具,它肯定可以运动(move),从甲地运动到乙地,就起到了交通的作用。
轮船是一种交通工具,所以轮船类也是交通工具类的子类。
同样是运动,轮船的运动和汽车的运动方式肯定有所不同,这样以不同的方式完成同样的功能就叫多态。
关于对象:对象就是某一具体的事物,比如一个苹果, 一台电脑都是一个对象。
每个对象都是唯一的,两个苹果,无论它们的外观有多么相像,内部成分有多么相似,两个苹果毕竟是两个苹果,它们是两个不同的对象。
对象可以是一个实物,也可能是一个概念,比如某个苹果对象是实物,而一项政策可能就是一个概念性的对象了。
关于类:对象可能是一个无穷的集合,用枚举的方式来表示对象集合不太现实。
抽象出对象的特征和功能,按此标准将对象分类,这就引入类的概念。
类就是一类事物的统称,类实际上就是一个分类的标准,符合这个分类标准的对象都属于这个类。
当然,为了方便起见,通常只需要抽取那些,对当前应用来说是有用的特征和功能。
关于抽象类:类是对对象的抽象,比如,苹果是对所有具体的苹果的抽象。
如果我们对苹果这个类进行一步抽象,可以得到一个水果类。
这种对类本身进行抽象而得到的类,就是抽象类。
抽象类不像普通类,它是没有对象与之对应的。
像苹果类,你总是可以拿到一个叫苹果的东西,而对于水果类,根本没一个真正叫水果的东西。
你可以说一个苹果是一个水果,从逻辑上讲没有错,但没有什么意义。
一般在程序中,抽象类是不能实例化的。
关于面向对象:面向对象就是以对象为中心。
为什么不说是面对类,而说是面向对象呢?类是对象的集合,考虑类实际上也是在考虑对象,有时甚至并不严格的区分它们。
所以说面向对象一词比面向类更确切。
既然以对象为中心,面向对象所考虑的内容自然是对象、对象间的协作、对象的分类、类之间的关系等等,由此引申了出几个重要的概念。
1. 封装what:对象也有隐私,对象的隐私就是对象内部的实现细节。
要想对象保持良好的形象就要保护好对象隐私,所谓的封装其实就是保护对象隐私。
当然,没有人能完全隐藏自己的隐私,比如你去转户口时,你不得不透露自己的家庭信息和健康状况。
另外,在不同的场合所透露隐私的数量也不一样,朋友和家人可能会知道你更多隐私,同事次之,其他人则知道得更少。
面向对象也考虑了这些实际的情况,所以像C++之类的语言有public/private/protected/friend等关键字,以适应于不同的情况。
why:封装可以隔离变化。
据以往的经验,我们知道内部实现是容易变化的,比如电脑在不断的升级,机箱还是方的,但里面装的CPU和内存已是今非昔比了。
变化是不可避免的,但变化所影响的范围是可以控制的,不管CPU怎么变,它不应该影响用户使用的方式。
封装是隔离变化的好办法,用机箱把CPU和内存等等封装起来,对外只提供一些标准的接口,如USB插口、网线插口和显示器插口等等,只要这些接口不变,内部怎么变,也不会影响用户的使用方式。
封装可以提高易用性。
封装后只暴露最少的信息给用户,对外接口清晰,使用更方便,更具用户友好性。
试想,如果普通用户都要知道机箱内部各种芯片和跳线,那是多么恐怖的事情,到现在为止我甚至还搞不清楚硬盘的跳线设置,幸好我没有必要知道。
how:在C语言中,可以用结构+函数来模拟类的实现,而用这种结构定义的变量就是对象。
封装有两层含义,其一是隐藏内部行为,即隐藏内部函数,调用者只能看到对外提供的公共函数。
其二是隐藏内部信息,即隐藏内部数据成员。
现在都建议不要对外公开任何数据成员,即使外部需要知道的数据成员,也只能通过函数获取。
在C语言中要隐藏内部函数很简单:不要它把放在头文件中,在C文件中定义时,前面加static关键字,每个类放在独立的文件中。
这样可以把函数的作用范围限于当前文件内,当前文件只有类本身的实现,即只有当前的类自己才能看到这些函数,这就达到了隐藏的目的。
在C语言中要隐藏数据成员较为麻烦,它没有提供像C++中所拥有的public/protected/friend/private类似的关键字。
只能通过一些特殊方法模拟部分效果,我常用的方法有两种。
其一是利用C的特殊语法,在头文件中提前声明结构,在C文件才真正定义它。
这样可以把结构的全部数据信息都隐藏起来。
因为外部不知道对象所占内存的大小,所以不能静态的创建该类的对象,只能调用类提供的创建函数才能创建。
这种方法的缺陷是不支持继承,因为子类中得不到任何关于父类的信息。
其二是把私有数据信息放在一个不透明的priv变量中。
只有类的实现代码才知道priv 的真正定义。
2. 继承what: 继承描述的是一种抽象到具体的关系。
具体的东西继承了抽象的东西的特性,比如说,水果这个概念比苹果这个概念更抽象,其意义更具有一般性,而苹果这个概念则更具体,其意义更狭窄一些,在面向对象里,我们可以说苹果类继承了水果类。
继承是指继承了父类的特性,继承本质是源于分类学,细的分类继承大分类的特性。
why: 继承描述了抽象到具体的关系,所以能够有效利用抽象这件武器来战胜软件的复杂性。
抽象在实现中无处不在,类就是对事物的抽象,提到苹果你就想到苹果这一类事物,无需要关心其大小、颜色和成分,苹果这两个字就足够了。
名不正则言不顺,言不顺则事不成,看来老夫子已经领悟到了抽象的威力。
继承不但利用了抽象的力量来降低系统的复杂性,它还提供了一种重用的方式。
假设我们承认下列面这个继承关系,苹果继承了水果,水果继承了食物,如果我们已经知道什么是食物,什么是水果,在描述苹果时,没有必要去重复讲解食物和水果的概念了,这就是重用,重用了对水果和食物两个概念的理解。
how: 在C语言中实现继承很简单,可以用结构来模拟。
这种实现基于一个明显的事实,结构在内存中的布局与结构的声明具有一致的顺序。
我们知道在程序描述事物的特征时,主要通过数据变量描述事物的属性特征,如颜色、重量和体积等,用函数来描述事物的行为特征,和运动、成长和搏斗等。
继承继承在现实世界中应用很广,在程序里也是一样,甚至可以说是过度使用了。
多年以前一些大师已经提出,优先使用组合而不是继承。
主要原因有三点,首先是多级继承和多重继承太复杂了,失去了抽象带来的简洁性。
其次是父类与子类之间共享太多信息,它们的耦合太紧密。
三是父类与子类之间的关系在编译时就静态绑定了,很难做到在运行时多态。
现在一般都提倡,只继承接口不继承实现,通过组合达到代码重用的目的。
在《设计模式》中是这样强调的,在MS的COM里也是这样做的。
所以我基本上只使用接口继承,很少遇到什么麻烦,建议大家也遵循这一准则。
3. 多态what: 尽管多态这个词本身就表明了它所代表的意义,但还是让初学者感到多少有些神秘。
多态就是完成相同功能的多种方式,比如拿动物的运动来说吧,鸟的运动通常是飞,鱼的运动通常是游,陆上动物的运动通常是跑,同是运动,但方式不一样,这就是多态。
不少人对多态的回答是,允许同名函数存在。
这种回答显然没有抓住多态的本质。
why: 关于动物运动这个例子,可能无法展示多态的好处。
我们来考虑另外一个多态的例子,U盘。
U盘的技术含量可能不是很高,有很多厂家都在设计和生产,就是说U盘有多种不同的实现,这就是U盘的多态。
U盘的多态性对消费者来说是有好处的,选择多了,你可以在价格、质量和外观等方式做出平衡,选择你中意的U盘。
多态的前提是接口的一致性,否则多态造成的麻烦远胜于它带来的好处。
不管U盘的体积、颜色和质量如何,它都必需遵循相应的USB标准,这些U盘在任何带USB接口的电脑上都可以使用。
how: 多态在C语言中通常用函数指针来实现,函数指针定义了函数的原型,即它的参数和返回值的描述,以及函数的意义,不同的函数可以有相同的函数原型,比如排序函数,无论是快速排序还是归并排序,它们的实现不一样,但函数原型可以一样。
在不同的情况下,让函数指针到不同的函数实现上,这就实现了多态。
类的三个层次:类这个概念比较微妙,即使在软件开发领域,不同的人提到这个概念所指的内容也不一样。
一些大师早就注意到了这一点,为了让这个概念在不同情况下,具有较准确的意义,他们建议从三个层次看待类这个概念:1. 概念层(Conceptual)这是一个较高的层次,通常在进行领域分析时,为了建立概念模型时使用。
这时使用的术语是现实世界中的术语,而不是软件开发中的术语。
在这个层次,类只是一个概念,加上一些不太严谨的特征说明,甚至只有一个名称。
尽管它往往与软件开发中的类一一对应,便这种映射并不一定是直接的。
2. 规格层(Specification)在这个层次,类已经是属于软件开发范畴了,但主要关注的是类的接口,而不是类的实现。
此时你可能想到它的一组接口函数,而不关心这些函数是如何实现的。
3. 实现层(Implementation)在这个层次,我们才真正关注类的实现,此时你可能会想到一些用某种语言写成的函数体,定义的成员变量等等。
面向对象的好处:面向对象已经征服了软件开发的绝大部分领域,近几年来出现的面向方面的编程(AOP)、产生式编程(GP)和面向组件的开发等等,都提出了一些新的思维,在某些方面大提高了开发效率,但它们并非是取代了面向对象,相反是对面向对象的补充和完善,面向对象始终稳坐第一把交椅。
面向对象到底有何德何能,它凭借什么取代面向对程呢?封装、继承和多态到底有何种魔力,吸引众多的高手去完善它,让布道者们不厌其烦的颂扬它呢?归根结底,面向对象会带来两个好处,这两个好处正是设计者们一直在追求的:1. 降低系统的复杂度。
众所周知,随着硬件的飞速发展,计算机的计算能力越来越强大,人们对软件期望也越来越高,而软件复杂度又与它的规模成指数倍数增长。
软件复杂度可以说是软件开发的第一大难题,我们可以轻而易举的写出5000行代码,而面对100万行代码规模的软件,会有点让人觉得人的智力是多么有限。