软件工程方法论
- 格式:doc
- 大小:34.00 KB
- 文档页数:5
软件工程中的软件测试策略与方法论软件测试是软件开发过程中不可或缺的一环,它的目标是发现和纠正潜在的软件缺陷,以确保软件的质量和稳定性。
然而,在软件工程中,如何选择合适的测试策略和方法论,以及如何有效地进行测试,都是非常重要的问题。
本文将介绍几种常见的软件测试策略和方法论,并分析它们的优缺点。
一、白盒测试白盒测试是一种基于代码内部结构的测试方法,它通过检查程序的内部逻辑和数据流来验证软件的功能和正确性。
白盒测试可以帮助测试人员深入了解软件的内部结构,并揭示隐藏的错误和缺陷。
其主要方法包括语句覆盖、分支覆盖、路径覆盖等。
白盒测试的优点是可以发现细粒度的错误,并提供代码覆盖率的度量,有助于提高软件的稳定性和可靠性。
然而,白盒测试需要测试人员具备良好的编程和调试能力,并且需要了解软件的内部实现细节。
此外,由于白盒测试主要关注程序代码的正确性,而忽略了系统整体的功能和用户需求,因此可能会遗漏一些潜在的缺陷。
二、黑盒测试黑盒测试是一种基于软件功能和用户需求的测试方法,它从外部对软件进行测试,而不需要了解其内部实现细节。
黑盒测试通过设计测试用例来检查软件的输入、输出和功能是否符合预期,以验证软件的正确性和健壮性。
黑盒测试的优点是可以覆盖广泛的功能和用户场景,从而更好地满足用户的需求。
同时,黑盒测试不需要了解软件的内部实现细节,因此对测试人员的技术要求相对较低。
然而,黑盒测试只能检验软件功能的正确性,而无法发现程序内部的错误和缺陷。
因此,在真实的软件开发过程中,通常需要将黑盒测试与其他测试方法相结合使用。
三、灰盒测试灰盒测试是白盒测试和黑盒测试的结合,它既关注软件内部的结构和逻辑,又考虑软件的功能和用户需求。
灰盒测试通过设计测试用例,结合对软件内部结构的了解,来验证软件的正确性和稳定性。
灰盒测试的优点是综合了白盒测试和黑盒测试的优势,既能发现细粒度的错误,又能满足用户的需求。
然而,灰盒测试需要测试人员具备一定的编程和调试能力,并且需要花费较多的时间和精力来设计和执行测试用例。
软件工程方法论软件工程是一种以工程化的方式来开发和维护软件系统的学科。
在软件工程领域,方法论是指按照特定的理论和实践原则,组织和管理软件开发过程的方法和技术。
在本文中,我们将探讨软件工程方法论的定义、重要性以及一些常见的软件工程方法。
一、软件工程方法论的定义软件工程方法论是指在软件开发过程中使用的一系列方法、技术和工具。
它们是根据软件工程领域的最佳实践和经验总结而得出的,可以帮助开发团队高效地进行软件开发、测试和维护。
软件工程方法论包括需求分析、设计、编码、测试、集成和发布等多个环节,以确保软件系统的质量和效率。
二、软件工程方法论的重要性软件工程方法论对于提高软件开发的效率和质量至关重要。
它可以帮助开发团队在整个开发生命周期中规范各个阶段的工作流程,减少错误和风险,并且提高软件系统的可维护性和可扩展性。
软件工程方法论还能够提供标准化的开发过程和文档,使开发团队能够更好地协作和沟通。
三、常见的软件工程方法1. 瀑布模型:瀑布模型是软件开发生命周期的经典方法之一。
它的特点是各个阶段依次进行,每个阶段的输出作为下一个阶段的输入。
瀑布模型适用于需求明确、稳定的项目,但对于需求变化频繁的项目可能不适用。
2. 敏捷开发:敏捷开发是一种迭代、增量的开发方法。
它强调团队的协作和快速响应客户的需求变化。
敏捷开发包括多种方法,如Scrum、XP等。
敏捷开发适合需求变化频繁或项目规模较小的项目。
3. 原型开发:原型开发是一种通过迅速构建初步的原型来验证系统需求、设计和功能的方法。
它可以帮助开发团队更好地理解用户需求,并及早发现和解决问题。
原型开发适用于需求不确定或创新性较强的项目。
4. DevOps:DevOps是一种将开发和运维紧密结合的开发方法,旨在实现快速、可靠的软件交付。
DevOps强调自动化测试、持续集成和持续交付,以快速响应需求变化和提高软件质量。
四、结语软件工程方法论对于软件开发项目的成功至关重要。
不同的项目可以选择适合自己的开发方法,以提高效率和质量。
软件工程的开发方法论与实践技巧简介随着信息技术的飞速发展,软件已经成为现代社会发展的重要支柱,因此软件开发的成功与否将直接关系到企业的生存与发展。
软件工程的开发方法论和实践技巧是软件开发的核心,本文旨在介绍软件工程的开发方法论和实践技巧,以便开发人员能够快速掌握软件开发的要点,提高软件质量和效率。
一、软件开发流程模型软件开发流程模型是软件工程的开发方法论中最重要的内容之一,它指导着软件开发流程的整个过程。
常见的软件开发流程模型包括瀑布模型、迭代模型、敏捷模型等。
1、瀑布模型瀑布模型是最早应用于软件开发中的开发模型,其开发流程包括需求分析、设计、编码、测试和维护等阶段。
该模型适用于需求比较明确的开发项目,但对于需求不明确、变化较快的开发项目不适用。
2、迭代模型迭代模型是在瀑布模型基础上进一步发展,该模型在每个阶段后增加了迭代环节,能够更好地适应需求变化较大的开发项目。
3、敏捷模型敏捷模型是一种应对需求不明确的开发模型,其特点是注重人员互动和响应变化,通过快速开发迭代的方式来掌握需求,减少风险。
该模型适用于小团队开发、需求变化较大的项目。
二、开发工具和技术1、版本管理工具版本管理是软件开发过程中最常见的问题之一,版本管理工具可以帮助开发人员实现版本控制和开发过程的监控和管理。
常见的版本管理工具包括Git、SVN等。
2、自动化工具自动化工具可以提高软件开发的效率和质量,比如持续集成工具Jenkins、自动化测试工具Selenium等。
3、UMLUML是一种面向对象的建模语言,在软件开发中起着重要的作用。
通过UML可以描述软件的结构、行为和交互等,以便开发人员更好地理解和设计软件系统。
三、编码规范和测试方法1、编码规范编码规范是软件开发过程中的重要环节之一,它包括程序风格、注释、命名规则、异常处理等规范,能够提高代码的可读性、可维护性和质量。
常见的编码规范包括Google Code Style、Sun Code Style等。
软件工程方法论随着科技的发展和普及,软件在我们的日常生活中扮演着越来越重要的角色。
无论是手机应用、电子商务平台还是智能设备,我们都离不开软件的支持。
然而,软件开发的过程却并不简单,为了确保开发出高质量的软件,软件工程方法论应运而生。
软件工程方法论是一套规范化的软件开发方法,旨在提高软件开发过程的效率和质量。
它包含了一系列的实践和原则,涵盖需求分析、设计、开发、测试和维护等阶段。
首先,需求分析是软件开发的重要环节。
在这个阶段,开发团队与客户密切合作,明确客户的需求和期望。
通过与客户的交流和沟通,开发团队可以准确捕捉到软件的功能需求,并将其转化为开发所需的规范和文档。
接下来是设计阶段。
在这个阶段,开发团队将需求转化为软件的架构和设计。
他们定义系统的操作流程、数据结构和模块化组件等。
设计的目标是保持软件的简洁性、可维护性和可扩展性,以确保软件的稳定性和性能。
开发阶段是将设计的理念转化为具体的代码实现。
开发团队利用各类开发工具和编程语言,按照规范进行编码。
在开发过程中,团队成员之间需要进行良好的协作和沟通,以确保代码的质量和一致性。
测试阶段是确保软件质量的关键环节。
测试团队负责验证软件的功能是否符合需求,并进行性能、安全性、稳定性等方面的测试。
他们使用各类技术手段和工具,如单元测试、集成测试和系统测试,以发现和修复软件中的潜在问题。
最后是软件的维护阶段。
在软件交付给客户后,需要定期进行维护工作,确保软件的正常运行。
这包括修复报告的缺陷和错误,更新软件的功能和性能,处理用户的反馈和需求变更等。
维护阶段的目标是保证软件的稳定性和可靠性,提升用户体验。
除了以上几个阶段,软件工程方法论还注重于项目管理和质量控制。
项目管理涉及资源的分配、进度的控制和团队的协调等,以保证项目的顺利进行。
质量控制则着重于规范和标准的制定,以确保软件的质量和符合相关标准。
总的来说,软件工程方法论是一套能够帮助开发团队高效开发高质量软件的方法和实践。
软件工程的基本理论与方法软件工程是一门涉及计算机科学、数学和工程学的跨学科领域,它主要研究的是软件的开发、维护和管理。
随着计算机技术的快速发展,软件工程也在不断地发展和完善。
本文将着重从基本理论和方法两个方面介绍软件工程的发展情况。
一、软件工程的基本理论1、软件开发生命周期软件开发生命周期是软件工程中最基本的理论之一,它是描述软件开发过程中各个阶段的生命周期。
软件开发生命周期通常被分为五个阶段:计划阶段、需求分析阶段、设计阶段、编码阶段和测试阶段。
这五个阶段彼此关联和依赖,每一个阶段完成后都需要进行验证和确认,以确保软件质量的稳定和良好。
2、软件质量软件质量是衡量软件是否具有可靠性、耐用性、可维护性、可用性等方面的能力的基本量化指标。
准确地衡量软件质量通常需要根据一系列的因素来考虑,比如软件的性能、稳定性、界面友好性等。
3、代码风格代码风格是指程序代码的书写规范,它主要包括代码的缩进、变量命名规范、代码注释等多个方面。
好的代码风格不仅能够提高代码的可读性和可维护性,而且还能够提高代码开发的效率和精确度。
4、面向对象编程面向对象编程是程序设计中的一种方法论,它将现实世界中的事物看作是对象。
这种编程方式能够提高代码的复用性、可扩展性和可维护性,因此受到了广泛的认可和应用。
二、软件工程方法1、面向对象方法面向对象方法主要是以对象为中心,将数据和方法组织成为一个整体。
在这种方法中,数据和方法是紧密相连的,对象内的方法(也称类方法)可以访问其他对象的数据,从而解决了程序设计中的许多问题。
2、正式方法正式方法是软件工程中的一种强制性的方法,它主要是一种数学化的方法,用于分析、设计和验证软件。
这种方法虽然复杂,但是能够提供高质量、高可靠性的软件。
3、自底向上方法自底向上方法通常用于软件模块的编写和开发。
这种方法是先定义好子程序,然后在将子程序组合成更大的程序。
这种方法适合于比较大型的项目,因为它可以将一个复杂的问题分解为独立的、易于管理的子问题。
基于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方法论在软件开发中有着广泛的应用,它通过规范化的软件开发流程,确保了软件的质量,同时也提高了软件开发的效率。
软件工程方法论的最佳实践软件工程是一项涉及到大量复杂技术和方法的任务,而软件工程方法论则是其中至关重要的一环。
软件工程方法论研究如何在软件开发过程中制定最佳实践,以保证软件项目的成功。
在这个时代,软件开发已经成为人类社会不可或缺的一部分,而要保证软件项目的成功,合理的软件工程方法论是非常必要的。
以下是一些可以作为软件工程最佳实践的方法和技术:一、敏捷开发方法敏捷开发是一种较为先进的软件开发方法,它强调在开发过程中的灵活性和快速响应能力。
使用敏捷开发方法能够更有效的满足客户需求,缩短开发周期,降低项目失误率。
二、模块化程序设计模块化程序设计是基于模块概念的程序设计,解决了程序体积庞大、难以维护的问题。
模块化设计可让程序员更关注于程序的核心代码开发,帮助快速开发软件,提升代码的可读性、可维护性和代码重用率。
三、自动化测试自动化测试是一种测试软件的方法,完全或大部分可以由计算机程序自动完成。
相比于手动测试,自动化测试可以有效地减少测试成本和时间,并且更容易识别出软件缺陷,提高软件质量。
四、版本控制版本控制是一种非常有用的软件开发工具,它随时记录着软件项目的变化。
版本控制可以确保开发人员以同步的方式进行软件开发,并可以在团队合作中解决冲突问题。
五、代码审查代码审查是软件质量保证的重要一环。
代码审查通过对程序代码的检查,提高代码的质量,发现代码中存在的问题。
通过持续的代码审查,可以有效地减少代码缺陷,提高代码的可读性和可维护性。
六、项目管理工具有效的项目管理工具是软件工程方法论最佳实践的一个重要组成部分。
这些工具可以让开发团队更有效地协作,提高项目的进展速度。
常见的项目管理工具有JIRA、Trello等。
七、用户体验设计用户体验设计是设计人员保证软件顺利落地的关键。
好的用户体验设计可以大大提高软件使用体验,增加用户与软件之间的黏性,这在现今互联网应用蓬勃发展的崭新领域尤为重要。
总之,软件工程方法论的最佳实践应该是一项结合实践和理论的工程,目的是为了保证软件项目的成功。
什么是软件工程介绍一下常见的软件开发方法论软件工程是关于软件开发与维护的学科领域,旨在通过系统化的方法和工具,提高软件开发的效率和质量。
常见的软件开发方法论有瀑布模型、迭代模型、敏捷开发和DevOps等。
下面将逐一介绍这些方法论的特点和适用场景。
1. 瀑布模型瀑布模型是一种经典的软件开发方法,其开发过程按照线性顺序依次进行,包括需求分析、系统设计、编码、测试和运维等阶段。
每个阶段的工作只会在上一个阶段完成后开始,形成了一条“瀑布式”的流程。
这种方法特点是工作逐一进行,各个阶段之间有清晰的界限,适用于需求变动较少、项目规模较大、稳定性要求高的项目。
2. 迭代模型迭代模型是在瀑布模型的基础上加入了反复迭代的思想。
项目首先会被分解为多个小周期,并在每个周期内进行需求分析、设计、编码、测试等工作。
每个小周期都会产生一个可运行的软件版本,通过用户的反馈来不断修正和完善。
这种方法特点是适应需求变动频繁、项目周期较长的情况。
3. 敏捷开发敏捷开发是一种以迭代和快速响应变化为核心的开发方法。
敏捷开发时会将项目划分为多个短周期,每个周期内团队会优先完成最有价值的任务,并与客户保持紧密的合作和沟通。
敏捷开发方法注重团队的协作和自组织能力,能够适应快速变化的需求和市场环境,特别适用于创新型项目和需要快速上线的产品。
4. DevOpsDevOps是软件开发和运维的一种工作方法和文化。
DevOps强调开发团队和运维团队之间的紧密合作和沟通,通过自动化工具和流程的建立来达到持续交付和持续部署的目标。
DevOps的核心思想是提高软件开发和运维的效率和质量,使软件能够快速、自动地交付和部署到生产环境中。
综上所述,瀑布模型适用于需求稳定、规模较大的项目;迭代模型适用于需求变动频繁、项目周期较长的情况;敏捷开发适用于创新型项目和需要快速上线的产品;DevOps注重开发和运维的协作与自动化,旨在提高交付和部署的效率。
在实际软件开发中,可以根据项目的特点和需求选择合适的方法论,或者结合多种方法论的特点来灵活应用。
软件工程方法论不同的人在谈面向对象编程(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万行代码规模的软件,会有点让人觉得人的智力是多么有限。