版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件构造
SOFTWARECONSTRUCTION新的学期,新的起跑线,让我们一起开始新的征程。秋天,收获的季节。祝愿同学们在这个秋季学期里收获丰硕的果实。2016秋数据科学与软件工程学院2课程背景课程内容课程教材及参考资料课程目标教学方式方法教学进度计划学习方法学期考核2016秋数据科学与软件工程学院3课程背景小型软件开发的重要性凸显;传统计算机学科的课程传授方式理论化、知识碎片化;软件工程课程基本前提是要求学生具备软件构造能力;现代软件开发方法包括极限编程、测试驱动开发等敏捷方法,突出特点是每个程序员都具有高超的软件开发功力。2016秋数据科学与软件工程学院4课程内容以一个案例演变,模拟不断变化的用户需求,按照增量迭代的开发模式,将碎片化的功能开发、用户交互、数据处理等知识,以及软件设计、软件测试和敏捷开发的最佳实践,与软件开发的原理、技术和工具融合到设计、编码、调试及测试的构造过程。2016秋数据科学与软件工程学院5课程内容课程具体内容包括软件构造的一般原理(如模块化、增量迭代)、常用技巧(如表驱动编程、测试驱动开发)、软件设计(契约式设计、设计模式)、软件知识(如软件测试、软件复用)及软件构造的工作要素(如编码规范、构造工具)和活动(如设计、编码、测试、交付)。2016秋数据科学与软件工程学院6课程教材及参考资料课程教材李劲华等.基于案例的软件构造教程.北京:电子工业出版社,2016.6参考资料S.McConnel.金戈,等译.代码大全(第二版).北京:电子工业出版社,2011.RobertC.Martin.邓辉,译.敏捷软件开发:原则、模式与实践.北京:清华大学出版社,2003.CapersJones.吴舜贤,等译.软件工程最佳实践.北京:机械工业出版社,2014.……2016秋数据科学与软件工程学院7课程目标本课程旨在以案例为引导,通过集成化解决软件知识的碎片化,提升个人的软件构造能力,加快从程序编写到软件开发的转变,在孤立的基础课程与软件工程课程之间搭建桥梁。目标是把学生培养成能独立地综合运用技术、开发可用产品的高级程序员,再通过后续课程(如软件工程、综合课程设计和实习实训)培养成软件工程师。2016秋数据科学与软件工程学院8教学方式方法以案例需求演变为主线;理论方法讲解;案例分析实践;将软件构造的原理、原则、方法、技术、流程和技能整合到一起,通过案例的展开由浅及深地学习。2016秋数据科学与软件工程学院9教学进度计划参考教材中“教学方案”2016秋数据科学与软件工程学院10学习方法一边思考案例问题;一边学习;一边动手实践。2016秋数据科学与软件工程学院11第1章
软件开发概述第1章软件开发概述从不同方面深入理解程序及其开发。首先,认识程序和软件的区别,了解不同的软件分类。其次,理解小程序的编写与大型软件的开发。最后,深入理解软件构造,从编辑-编译-运行的程序编写,到设计-实现-调试-测试的软件构造。2016秋数据科学与软件工程学院13第1章软件开发概述1.1程序与软件1.2软件生存周期1.3软件开发过程1.4敏捷开发1.5软件构造1.6为什么不直接编写软件1.7案例导读1.8思考与练习题2016秋数据科学与软件工程学院141.1程序与软件1.1.1从程序到软件1.1.2软件类型1.1.3程序设计与软件开发2016秋数据科学与软件工程学院151.1.1从程序到软件计算机程序(简称程序)是为了解决某个特定问题而用程序设计语言描述的适合计算机处理的语句序列。软件是能够完成预定功能和性能的可执行的程序和使程序正常执行所需要的数据,加上描述软件开发过程及其管理、程序的操作和使用的有关文档,即“软件=程序+数据+文档”。2016秋数据科学与软件工程学院161.1.1从程序到软件教学管理软件,它通过一组独立而又交互的程序提供各种教与学的服务功能。该教学管理软件数据有相对稳定的学生、教师、课程、教室等信息;有变动性强的授课信息;以及不断变化的授课教师发布的授课/参考材料、作业及批改、试题及分数、学生提交的作业、师生的答疑等。该软件还需要各种文档,如安装说明书、操作说明书和技术说明书等。所有这些程序、数据和文档,共同构成了这个教学管理软件。2016秋数据科学与软件工程学院171.1.2软件类型功能系统软件、支撑软件和应用软件。工作方式实时处理软件、分时软件、交互式软件和批处理软件。服务对象的范围项目软件(定制开发)和产品软件(或通用软件)。其他商业软件、开源软件、共享软件。2016秋数据科学与软件工程学院181.1.2软件类型软件规模2016秋数据科学与软件工程学院191.1.2软件类型随着软件变得越来越大、越来越复杂,软件开发的关注点也发生了变化。相对于小规模的程序设计(ProgrammingintheSmall),提出了大规模的程序设计(ProgrammingintheLarge),即软件开发。2016秋数据科学与软件工程学院201.1.3程序设计与软件开发程序设计是解决特定问题而编写程序的过程,是软件生产活动中的重要组成部分。程序设计以某种程序设计语言为工具,编写源程序,然后由编译系统完成可执行代码的转换。程序设计的活动包括分析、设计、编码、测试、排错等不同阶段。2016秋数据科学与软件工程学院211.1.3程序设计与软件开发图灵奖获得者沃斯(NiclausWirth)提出的“程序=算法+数据结构”是程序设计的精辟观点。数据结构指的是程序处理或应用的数据与数据之间的逻辑关系。算法指的是解决特定问题的步骤和方法。程序设计的核心就是选择和设计适合特定问题的数据结构与算法,用编程语言编制为程序。2016秋数据科学与软件工程学院221.1.3程序设计与软件开发在计算机技术发展的早期,软件开发的主要活动就是程序设计。随着程序向软件的演变,软件开发不再只是纯粹的程序的功能设计,还包括数据库设计、用户界面设计、软件接口设计、通信协议设计和复杂的系统配置。软件变得越来越大、越来越复杂。2016秋数据科学与软件工程学院231.1.3程序设计与软件开发软件变得越来越大、越来越复杂。图1.1示意了Linux操作系统的内核在10年里从240万行扩大到接近1600万行。2016秋数据科学与软件工程学院241.1.3程序设计与软件开发程序设计活动走向软件工程。软件工程把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以系统性的、规范化的、可定量的过程化方法去开发和维护软件。软件工程是应用计算机科学、数学、逻辑学及管理科学等原理,开发软件的工程学科和活动。2016秋数据科学与软件工程学院251.2软件生存周期一个软件产品或软件系统也要经历孕育、诞生、成长、成熟、衰亡等阶段,一般称为软件生存周期(软件生命周期)。软件的生产者和使用者对软件生存周期的阶段和活动具有不同的理解和划分。1.2.1使用角度的软件生存周期1.2.2开发角度的软件生存周期2016秋数据科学与软件工程学院261.2.1使用角度的软件生存周期提出需求。用户根据需要,提出要解决的问题和需要的软件。获取软件。主要是对获取软件的最佳途径做出决策并选择最佳的供应商。购买软件定制或开发软件租赁软件或租赁服务使用软件。一旦获得软件之后,用户将操作软件使之为其服务。2016秋数据科学与软件工程学院271.2.2开发角度的软件生存周期从软件开发者的角度,一般把软件生存周期分为定义软件、开发软件和维护软件三个阶段。2016秋数据科学与软件工程学院281.3软件开发过程把软件开发工作分成若干都有特定结果的步骤或活动,按照一定的方式开展软件活动,从而形成了软件过程。简单而言,软件开发过程是用来生产软件产品的流程及一系列工具、方法和实践的集合。软件过程模型是从一个特殊的视角对软件开发过程的简化描述。2016秋数据科学与软件工程学院291.3软件开发过程2016秋数据科学与软件工程学院301.3软件开发过程1.3.1瀑布式开发过程1.3.2增量开发模型1.3.3个体软件过程2016秋数据科学与软件工程学院311.3.1瀑布式开发过程瀑布式开发过程,也叫软件生存期模型。按照软件生命周期,开发分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等6个基本活动。各项活动严格按照线性方式进行,自上而下、相互衔接。每项活动的结果需要验证通过后,才能继续进行下一项活动。2016秋数据科学与软件工程学院321.3.1瀑布式开发过程核心思想是按工序将问题化简,将功能的实现与设计分开,即采用结构化的分析与设计方法将逻辑实现与物理实现分开。2016秋数据科学与软件工程学院331.3.1瀑布式开发过程主要问题在于:阶段划分僵硬,每个阶段不能缺省,而且产生大量文档,增加了工作量;开发是线性的,只有等到整个过程的末期才能见到开发成果——可运行软件,不利于快速响应变化的需求;早期的错误要等到开发后期的测试阶段才能发现,可能带来严重的后果,增加了开发的风险。2016秋数据科学与软件工程学院341.3.2增量开发模型把软件分成一系列增量,完成一部分就交付一部分。本质上是迭代开发的,即不是一次性执行软件开发的全部活动,而是有计划地反复执行“分析-设计-编码-测试”的过程。2016秋数据科学与软件工程学院351.3.2增量开发模型增量开发模型的特点是引进了增量包的概念,无须等到所有需求,只要某个需求明确了,就可进行开发。增量的类型及其开发不止一种。可行的方式是首先实现那些明确的、核心的需求;也可以对需求按优先级排序,或者按照用户的要求实现增量。2016秋数据科学与软件工程学院361.3.2增量开发模型增量开发模型的基本思想是让开发者能够从早期的开发、系统的增量、交付的版本中学到经验。过程中的关键是从系统需求的简单子集实现开始,通过迭代增强和进化后续的版本,直到系统被实现。每次迭代中,对设计进行修改,并增加新的功能要求。2016秋数据科学与软件工程学院371.3.2增量开发模型增量开发模型的优点如下:在短时间内向用户提交一个可运行软件,能够提供解决用户急用的一些功能。由于每次只提交部分功能,用户有较充分的时间学习和适应新的产品。在开发过程中,需求的变化是不可避免的。增量开发模型的灵活性可以使软件适应需求变化。有利于系统维护,因为整个系统是由一个个增量(部件)集成在一起的,当需求变更时,只变更部分部件,而不必影响整个系统。2016秋数据科学与软件工程学院381.3.2增量开发模型增量模型存在以下风险:由于各个部件是逐渐并入已有软件的,必须确保每次增加的部件不破坏已构造好的系统,这需要软件具备开放式的体系结构,否则系统将失去稳定的结构。逐步增加部件的方式,很容易退化为边做边改模型,从而使软件过程的控制失去整体性。在一个软件开发中如何一致地定义“增量”?如何界定它的工作量、需求范围、功能或特性?2016秋数据科学与软件工程学院391.3.2增量开发模型实践中,增量开发模型往往要求在分析了软件需求以后,在软件设计开发时进行增量。增量开发最好是在架构设计完成后再开始进行增量,这样可以更好地保证系统的健壮性和可扩展性。每次迭代过程仍然要遵循“分析→设计→实现”的微型瀑布过程。迭代周期的长度跟软件的开发周期和规模有关系。2016秋数据科学与软件工程学院401.3.3个体软件过程美国卡内基梅隆大学软件工程研究院的汉弗莱(Humphrey)主持开发了个体软件过程(PersonalSoftwareProcess,PSP)和团队软件过程(TeamSoftwareProcess,TSP)。TSP是为开发软件产品的开发团队提供的指导,在于帮助开发团队改善其质量和生产率,更好地满足成本及进度的目标。2016秋数据科学与软件工程学院411.3.3个体软件过程PSP是一种可用于控制、管理和改进个人工作方式的自我持续改进过程。它是一个包括软件开发表格、指南和规程的结构化框架。PSP与具体的技术(程序设计语言、工具或设计方法)相对独立,其原则能够应用到任何软件工程任务之中。PSP能够说明个体软件过程的原则;帮助软件工程师做出准确的计划;确定软件工程师为改善产品质量要采取的步骤;建立度量个体软件过程改善的基准;确定过程的改变对软件工程师能力的影响。2016秋数据科学与软件工程学院421.3.3个体软件过程PSP为个体的能力也提供了一个阶梯式的进化框架,每一级别都包含了更低一级别中的所有元素,并增加了新的元素。借助这个框架,个体可以循序渐进地改进开发过程。它赋予软件人员度量和分析工具,使其清楚地认识到自己的表现和潜力,从而可以提高自己的技能和水平。2016秋数据科学与软件工程学院431.3.3个体软件过程PSP0的目的是建立个体过程基线,学会使用PSP的各种表格采集过程的有关数据,执行的软件过程包括计划、设计、编码、编译和测试。按照选定的缺陷类型标准、度量引入的缺陷个数和排除的缺陷个数等,用在测量PSP过程的改进。PSP0.1增加了编码标准、程序规模度量和过程改善建议三个关键过程域。2016秋数据科学与软件工程学院441.3.3个体软件过程PSP1的重点是个体计划,用自己的历史数据来预测新程序的大小和需要的开发时间,并使用线性回归方法计算估计参数,确定置信区间以评价预测的可信程度。PSP1.1增加了对任务和进度的规划。在PSP1阶段应该学会编制项目开发计划,这不仅对承担大型软件的开发十分重要,即使是开发小型软件,也必不可少。2016秋数据科学与软件工程学院451.3.3个体软件过程PSP2的重点是个体质量管理,根据程序的缺陷建立检测表,按照检测表进行设计复查和代码复查(也称“代码走查”),以便及早发现缺陷,使修复缺陷的代价最小。PSP2.1则论述设计过程和设计模板,但并不强调选用什么设计方法,而强调设计完备性准则和设计验证技术。2016秋数据科学与软件工程学院461.3.3个体软件过程PSP3的目标是把个体开发小程序所能达到的生产效率和生产质量延伸到大型程序;其方法是采用迭代增量式开发方法,首先把大型程序分解成小的模块,然后对每个模块按照PSP2.1所描述的过程进行开发,最后把这些模块逐步集成为完整的软件产品。在新一轮开发循环中,可以采用回归测试。2016秋数据科学与软件工程学院471.4敏捷开发敏捷开发是从20世纪90年代开始逐渐引起广泛关注的一组新型的软件开发方法,更强调程序员团队与业务专家之间的紧密协作、面对面的沟通、频繁交付新的软件版本、紧凑而自我组织型的团队、能够很好地适应需求变化的代码编写和团队组织方法,更注重软件开发中人的作用。1.4.1概述1.4.2Scrum方法2016秋数据科学与软件工程学院481.4.1概述敏捷开发是应对快速变化的需求的一种软件开发能力。以用户需求进化为核心,采用迭代、循序渐进的方法进行软件开发。敏捷开发采用了更加人性化、个性化的沟通表达方式,特别是使用隐喻而非常规术语或形式化技术。例如,表示和处理需求的用户故事(UserStory)。再如,sprint指增量开发的迭代周期,长度通常是一至六周。一个用户故事的大小和复杂度应该以能在一个sprint中完成。2016秋数据科学与软件工程学院491.4.1概述敏捷开发通过宣言表示了它的4个核心价值观。(1)个体和互动胜过流程和工具。(2)工作的软件胜过详尽的文档。(3)客户合作胜过合同谈判。(4)响应变化胜过遵循计划。2016秋数据科学与软件工程学院501.4.1概述所有敏捷开发方法都遵循下面12条原则。(1)最优先要做的是通过尽早地、持续地交付有价值的软件满足客户需要。(2)即使在开发后期也欢迎需求的变化,敏捷过程利用变化为客户创造竞争优势。(3)经常交付可以工作的软件,从几星期到几个月,时间越短越好。(4)业务人员和开发人员应该在整个项目过程中始终朝夕在一起工作。(5)要善于激励项目人员,给他们以所需要的环境和支持,并相信他们能够完成任务。(6)在开发小组中最有效率、也最有效果的信息传达方式是面对面的交谈。(7)工作的软件是进度的主要度量标准。(8)责任人、开发者和用户应该维持长期、恒等的开发节奏。(9)对卓越技术与良好设计的不断追求将有助于提高敏捷性。(10)简单——尽可能减少工作量的艺术——至关重要。(11)最好的架构、需求和设计都源于自组织的团队。(12)每隔一定时间,团队都要总结、反省工作效率,然后相应地调整自己的行为。2016秋数据科学与软件工程学院511.4.1概述基本技术敏捷方法可以视为一些最佳实践的集合,包括经典的软件开发技术和管理,也包括敏捷开发首创的技术和方法。敏捷开发遵循软件开发的基本原则,同时也总结出了11条面向对象设计的原则,如单一职责原则(模块内聚的体现)、(采纳的)Liskov替换原则等。2016秋数据科学与软件工程学院521.4.1概述基本技术敏捷开发主要采用了面向对象的开发技术,使用CRC卡(Class-Responsibility-Collaborator,类-责任-协作)、用户用例、设计模式及UML(UnifiedModellingLanguage,统一建模语言)。但是,敏捷开发使用UML的符号主要是类图和时序图,因为这两种符号有助于直接编写出代码。2016秋数据科学与软件工程学院531.4.1概述意图导向编程意图导向编程指的是,先假设当前这个对象中已经有了一个理想方法,它可以准确无误地完成想做的事情,而不是直接盯着每一点要求来编写代码。在这个实例中,需要创建一个服务程序,它接收一个业务交易,然后提交。先简单创建一个对象,它只包含一个公共方法来完成这件事。2016秋数据科学与软件工程学院541.4.1概述具体需求如下交易信息开始于一串标准ASCII字符串。信息字符串必须转换成一个字符串的数组,其值是此次交易用到的领域语言中所包含的词汇元素(token)。每个词汇元素必须标准化:第一个字母大写,其余字母小写,空格和非字母数字的符号都要删掉。超过150个词汇元素的交易应该采用与小型交易不同的方式(不同的算法)来提交,以提高效率。如果提交成功,返回true;否则返回false。2016秋数据科学与软件工程学院551.4.1概述2016秋数据科学与软件工程学院561.4.1概述采用“意图导向编程”的编码方式,在编程开始时,假设这些“辅助方法”都已经存在,只需先考虑这些“辅助方法”要实现的功能和它们的输入和输出,然后按程序要求写出程序的主框架。最后才是“辅助方法”的编程。这样的编码方式使得程序员在整个编程中思路清晰,可以把精力集中在如何分解最终目标,以及那些全局性的问题上。实现的代码功能单一,易读易理解。2016秋数据科学与软件工程学院571.4.1概述敏捷技术敏捷开发也创造了一些新的技术或实践。如测试驱动开发、结对编程、代码重构和持续集成。2016秋数据科学与软件工程学院581.4.1概述测试驱动开发在一个微循环开发中,首先确认并自动化进行一个失败的测试,然后编写足够的代码通过测试,在下一轮前以必要的方式清理代码。2016秋数据科学与软件工程学院591.4.1概述结对编程两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。两个程序员经常互换角色。代码重构指的是改变程序结构而不改变其行为,以便提高代码的可读性、易修改性等。例如,给变量重新命名,把一段代码提升为函数,把公共的属性和行为抽象成基类。2016秋数据科学与软件工程学院601.4.1概述持续集成微软等公司的软件开发方法包括每日构造产品,持续集成比它更进一步,只要可能,就把新代码或变更的代码合并到应用程序,然后测试,确保一切都正常。2016秋数据科学与软件工程学院611.4.1概述敏捷开发是一个统称,很多软件开发方法都认为自己是敏捷的。典型的敏捷开发方法包括极限编程(ExtremeProgramming,XP)、Scrum、水晶方法(Crystal)、特性驱动开发(FeatureDrivenDevelopment,FDD)、动态系统开发方法(DynamicSystemsDevelopmentMethod,DSDM)。2016秋数据科学与软件工程学院621.4.2Scrum方法Scrum是一个用于开发和维持复杂软件产品的框架,是一个增量的、迭代的开发过程。整个开发过程由若干短的迭代周期(冲刺Sprint)组成。Scrum使用产品积压工作(ProductBacklog)来管理产品需求,它是一个按照商业价值排序的需求列表,列表条目的体现形式为用户故事。Scrum团队总是先开发对客户具有较高价值的需求。在冲刺中,团队从产品积压工作中挑选最高优先级的需求进行开发。挑选的需求在冲刺计划会议上经过讨论、分析和估算得到相应的任务列表,称为冲刺清单(SprintBacklog)。每个迭代结束时,团队将递交潜在可交付的产品增量。2016秋数据科学与软件工程学院631.4.2Scrum方法Scrum框架可以简化成3个角色、3个工件、5个活动和5个价值。Scrum框架的3个角色是:产品负责人、产品经理(ScrumMaster)及团队。3个工件是产品积压工作、冲刺清单和燃尽图(Burn-downChart)。5个活动包括:冲刺计划会议、每日站会、冲刺评审会议、冲刺回顾会议和产品积压工作梳理会议。2016秋数据科学与软件工程学院641.4.2Scrum方法Scrum的5个价值是:①承诺:愿意对目标做出承诺;②专注:把心思和能力都用到承诺的工作上去;③开放:Scrum把项目中的一切开放给每个人看;④尊重:每个人都有其独特的背景和经验;⑤勇气:有勇气做出承诺、履行承诺、接受别人的尊重。2016秋数据科学与软件工程学院651.4.2Scrum方法Scrum的工作流程2016秋数据科学与软件工程学院661.5软件构造1.5.1有关概念1.5.2构造与开发过程1.5.3主要内容1.5.4软件构造的重要性2016秋数据科学与软件工程学院671.5.1有关概念IEEE计算机学会于2013年正式发布了最新的软件工程知识体系(SWEBOK3.0)指南,提出了构成软件工程学科的11个实践知识域,每个知识域分解为子域,子域含若干主题。这11个软件工程实践知识域是:软件需求、软件设计、软件构造、软件测试、软件维护、软件配置管理、软件工程管理、软件工程过程、软件工程模型与方法、软件质量、软件工程专业实践。2016秋数据科学与软件工程学院681.5.1有关概念“软件构造”指的是通过编码、验证、单元测试、集成测试和调试的组合,详细地创建可工作的、有意义的软件。2016秋数据科学与软件工程学院691.5.2构造与开发过程构造在不同软件开发流程或模型中的地位也不一样。有些流程更加重视构造。从构造角度看,有些模型侧重于线性化过程——比如瀑布模型、阶段交付的生命周期模型。线性化开发方式更加重视构造之前的活动(需求和设计),并且在这些活动之间建立明确的任务划分。在这些模型中,构造工作主要就是编码。2016秋数据科学与软件工程学院701.5.2构造与开发过程有些模型是迭代的——如Scrum、极限编程、进化式原型法。这些方式倾向于把构造视为与其他软件开发(包括需求、设计和计划)同时发生或重叠的活动。这些方式混合设计、编码和测试活动,把构造当成这些活动的集合体。所以,如何考虑构造,在某种程度上依赖于采用的生存周期模型。一般地说,软件构造最主要是编码和调试,但也可以包含工作计划、详细设计、单元测试、集成测试,以及其他活动。2016秋数据科学与软件工程学院711.5.3主要内容软件构造的知识域分为5个子域,每个子域包含了数量不等的主题。软件构造基础。管理构造。实际考虑。构造技术。软件构造工具。2016秋数据科学与软件工程学院721.5.3主要内容本书使用的“软件构造”指的是运用软件最佳实践,通过设计、编码和测试的迭代过程,增量地建造出可运行软件。本书涵盖了指南中5个知识子域的大部分主题。通过增量迭代地构造一个可运行软件,用具体的技术实践讲解了软件构造域的知识主题。此外,本书讨论了软件模块的构造、用户交互的构造及数据处理的构造。有关软件测试、敏捷开发的技术、设计模式包含了比指南更多的内容。在开发阶段方面,增加了软件交付。2016秋数据科学与软件工程学院731.5.3主要内容本书没有涵盖指南的部分主题:管理构造子域中的构造计划和构造度量;构造技术子域中的可执行模型、并发原语、性能分析与调优,也没有特别处理实时、分布式和异构软件;软件构造工具子域中的性能优化、分析、切片工具。2016秋数据科学与软件工程学院741.5.3主要内容总体而言,本书面向个体,涉及团队少;以技术、方法和工具的最佳实践为主,通过代码实现学习抽象的原则和技术方法,不涉及管理;采用增量迭代的构造方式,不采用任何明确定义的流程或模型;涉及少量的需求和分析,不包含交付之后的活动。2016秋数据科学与软件工程学院751.5.4软件构造的重要性构造占据了软件开发的大部分工作。研究表明,构造占软件开发30%~80%的工作时间。而任何占据项目大量时间的工作一定会深刻地影响项目的成功。构造是软件开发的中心活动。把重心放在构造,能显著提升个体程序员的生产率。构造的产品——源程序代码,常常是唯一准确的软件描述。构造是确保唯一要完成的活动。2016秋数据科学与软件工程学院761.6为什么不直接编写软件相对于编程,软件具有了工程特征。软件开发是要跨越分析、设计、实现、安装和维护活动的一个可以反复遵循的、复杂的过程(工作流程);软件需要依靠一个团队的分工合作,需要过程的组织和管理(人员组织与管理);软件开发还要运用各种技术和工具生产出来的产品(工具和自动化)。2016秋数据科学与软件工程学院771.6为什么不直接编写软件1.6.1软件开发语言1.6.2编程工具与集成化开发环境1.6.3软件运行环境1.6.4软件开发的最佳实践1.6.5开发过程与管理2016秋数据科学与软件工程学院781.6.1软件开发语言计算机软件的编程语言基本被划分成机器语言/汇编语言的低级语言和与计算机的硬件结构及指令系统无关的高级(程序)语言。面向对象语言是目前使用最多的一种语言。2016秋数据科学与软件工程学院791.6.1软件开发语言按计算模型的划分声明式:告诉计算机做什么。函数式语言逻辑式语言数据流语言命令式:告诉计算机应该如何做。冯·诺依曼式语言脚本语言面向对象语言2016秋数据科学与软件工程学院801.6.1软件开发语言高级程序语言的一个发展趋势是融合各种类型语言的特性。大多数面向对象语言都具有冯·诺依曼式语言的结构,有些也融合了函数式编程范式的思想,如Java和C#引入了λ算子等。2016秋数据科学与软件工程学院811.6.1软件开发语言例题1.1:使用欧几里得算法,编写计算两个整数a和b的最大公因数的程序gcd。2016秋数据科学与软件工程学院821.6.1软件开发语言按执行模式的划分高级语言程序不能直接在计算机上运行,必须转换成低级语言的指令后才能运行。按照语言的转换和执行方式,高级语言分为编译型语言和解释型语言。2016秋数据科学与软件工程学院831.6.2编程工具与集成化开发环境使用任何语言编程都需要基本的编程工具——软件开发工具包(SoftwareDevelopmentKit,SDK),它通常包括编译程序或解释程序、调试程序、连接程序等,如Java的JDK、Android的ADK。编写程序的工具是普通的文本编辑器,它可以是传统的正文行编辑器,也可以是面向全屏的图形编辑器。2016秋数据科学与软件工程学院841.6.2编程工具与集成化开发环境编写程序的工具是普通的文本编辑器,它可以是传统的正文行编辑器,也可以是面向全屏的图形编辑器。编辑器可以是通用的、与程序语言无关,也可以是具备源程序语言知识的语法制导编辑器或结构化编辑器(如emacs、notepad++)。语法制导编辑工具运用程序语言的语法知识,在用户编写程序时按照词法和语法分析的信息提供若干智能化帮助,包括自动地提供关键字及其匹配的关键字、左右括号的配对、对象的属性和操作,等等。2016秋数据科学与软件工程学院851.6.2编程工具与集成化开发环境软件开发还需要管理各种代码文件、检查程序质量、测试工具、管理bugs、软件打包工具等。这些基础开发工具通常是行式命令,直接在操作系统中输入相应的命令,如编译Java程序的编译命令javac,解释执行Java程序的命令java。也有一些语言直接提供可视化开发工具。2016秋数据科学与软件工程学院861.6.2编程工具与集成化开发环境可视化集成开发环境IDE,用图形用户界面(GraphicalUserInterface,GUI)集成了代码编写、静态分析、编译、调试、连接、打包等功能的一体化软件开发套件。如Delphi、VisualStudio、Eclipse和Netbeans,它们以GUI形式提供支持多种语言进行编程,还提供代码管理、代码分析、软件维护、软件测试及软件部署和交付等工具,同时支持多种形态应用软件(通用应用程序、Web应用、数据库应用、移动应用)的开发。2016秋数据科学与软件工程学院871.6.3软件运行环境软件运行环境,广义上说,是一个软件运行所要求的各种条件,包括软件环境和硬件环境。许多应用软件不仅仅要求特定的硬件条件,还对软件提出明确的支撑条件。操作系统将计算机的硬件细节屏蔽,将计算机抽象成虚拟资源。通常把计算机硬件和操作系统称为平台。2016秋数据科学与软件工程学院881.6.3软件运行环境为了能够使同一种编程语言的程序独立于操作系统,实现程序运行的独立性,即“一次编写程序、到处运行”,在操作系统层面提出并出现了语言虚拟机或运行容器。它为程序的运行提供所需的运行时资源,包括把程序翻译成计算机指令、分配内存、通过操作系统调用计算资源等。例如,Java虚拟机(JavaVirtualMachine,JVM)可以理解成一台运行Java程序的抽象的计算机。2016秋数据科学与软件工程学院891.6.3软件运行环境除了计算机硬件和操作系统构成的运行平台,运行软件还需要支撑环境,包括使用的数据库管理系统(如Oracle、MySQL、SQLServer)、Web服务器(如Apache服务器、微软的Internet信息服务器)、应用框架(如.NETFramework、Java程序的SSH框架、Web应用框架RubyonRails)及使用的第三方库函数、类库、APIs等。2016秋数据科学与软件工程学院901.6.4软件开发的最佳实践合适的技术和方法能提高软件开发的效率和产品质量。软件开发一直缺乏坚实的理论基础。软件行业借用了管理学的最佳实践(BestPractice)的概念来概括到达用户满意的、可以反复使用的软件开发的一切手段。最佳实践认为存在某种技术、方法、过程、活动或机制,可以使生产或管理实践的结果达到最优,并减少出错的可能性。2016秋数据科学与软件工程学院911.6.4软件开发的最佳实践原则是一个已经接受或专业化的指导行动的最高准则或标准。人们总结、使用了软件开发的基本原则、面向对象原则等。原则必须通过某种途径体现出来,才具有指导作用。机制指的是有机体的构造、功能及其相互关系、工作原理,如可视化编程的事件响应机制、类型的多态机制。2016秋数据科学与软件工程学院921.6.4软件开发的最佳实践技术是科学原理的应用,是具有技能特点的特殊的步骤或途径。软件开发技术是运用了计算机科学、数学、系统科学、管理科学的基本原理,进行软件开发的方式方法。2016秋数据科学与软件工程学院931.6.4软件开发的最佳实践方法是获得一个客体(对象)的步骤或过程。作为一个系统的步骤、技术活动被特定的专业或艺术采纳,是技能或技术的全部。研究方法及其知识的活动称为方法学,如面向对象方法学、软件方法学。2016秋数据科学与软件工程学院941.6.4软件开发的最佳实践工具指的是执行操作的器具,引申为为达到、完成或促进某一事物的手段。我们使用更加广泛的含义,软件工具指的是从编辑器、编译器、自动化测试框架到IDE的实用程序。2016秋数据科学与软件工程学院951.6.4软件开发的最佳实践软件开发的技术实践十分丰富,按照开发活动划分有用户需求、软件设计、软件构造、软件测试、软件交付技术和方法。每个方面又可以细分,如软件设计技术包括软件架构设计、构件设计、算法设计、数据结构设计或功能设计、用户交互设计、数据库设计。这些技术方法只适合某一个开发阶段或某个软件组成,也有一些成套的包含技术、方法和工具,主要是公司内部研制和使用(如微软开发方法与最佳实践MSF)。2016秋数据科学与软件工程学院961.6.4软件开发的最佳实践按照软件开发范式有结构化开发、面向对象开发和新兴的面向服务开发等,侧重在软件工程活动的前期、以软件分析和设计或软件建模为主。结构化开发方法是用系统工程的思想和工程化的方法,按用户至上的原则,结构化、模块化、自顶向下地对系统进行分析和设计的方法。2016秋数据科学与软件工程学院971.6.4软件开发的最佳实践面向对象方法是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,是目前的主流开发方法。著名的方法体系有对象建模技术OMT、面向对象软件工程OOSE、Booch面向对象分析与设计。2016秋数据科学与软件工程学院981.6.4软件开发的最佳实践软件开发最佳实践包括一些普遍适用的软件开发基本原则(抽象、模块化),针对某个方法的设计原则(开闭原则、最少知识原则),提供软件质量和生产率的复用技术、设计模式,支持工具如自动化测试、版本控制、缺陷追踪。敏捷开发提出了独特的技术实践,如代码重构、测试先行开发。2016秋数据科学与软件工程学院991.6.4软件开发的最佳实践2016秋数据科学与软件工程学院1001.6.4软件开发的最佳实践2016秋数据科学与软件工程学院1011.6.5开发过程与管理首先,软件开发是做出决策、权衡和选择的过程。抉择的内容除了上述技术方面,还包括工作步骤、工作方式、开发人员及其组织、结构等。其次,具有工程和产品生产特点的软件开发,需要良好的人员组织和管理、开发结果的管理及开发过程的管理。2016秋数据科学与软件工程学院1021.6.5开发过程与管理对于人员的组织管理,首先要识别出参与软件开发、与软件开发相关、受软件影响的人员,并分析每个相关人员对软件的诉求、期望、影响和作用。其次,把开发人员组织成目标一致、分工合作的团队,包括确定职责、分配任务、明确规则等。然后,团队负责人要运用领导力和权利,指导开发人员各行其责,确保各类人员之间能顺利地沟通和协调,同时要给予必要的培训、奖惩、激励,确保高度的团队和个人的开发效率。2016秋数据科学与软件工程学院1031.6.5开发过程与管理软件开发作为项目,要评估成本、开发时间、质量、人员等因素,预先做出项目计划。首先要识别软件开发的所有活动、所有结果(如代码、测试、文档、数据、设计、配置文件),确定项目范围。然后,将开发活动分解成可管控的工程活动,如问题分析、程序设计、编码实现等,结合人员、预算、时间等资源条件,制定开发进度和交付物,明确监控、检查和评估的时间点和内容。2016秋数据科学与软件工程学院1041.6.5开发过程与管理同时,要考虑软件开发的风险——不确定的、对软件开发有危害的潜在因素,制定风险防范与应对计划。对于软件质量,要考虑采取的质量保障方法、质量评估流程和标准,制定质量管理计划。在软件开发的过程,就是按照计划调配资源、执行各项开发任务,确保开发按照要求和计划展开。必要时对计划做出适当的调整和变更,直至交付软件产品、开发任务结束。2016秋数据科学与软件工程学院1051.7案例导读案例描述50道100以内的加减法口算习题。2016秋数据科学与软件工程学院1061.7案例导读开发过程以个体为中心,主要采取敏捷和增量迭代的开发策略。敏捷开发:以需求进化为核心,采用迭代、循序渐进的方式进行软件开发;不要求全面、完备的需求,也不规定设计的方法和表达。增量迭代:针对用户提出的需求,每次都执行“分析-设计-编码-测试”的软件构造活动;循环的次数、每个增量的大小及每次构造活动的重点可以不一致,有些构造的重点在设计,有些构造的重点在测试。2016秋数据科学与软件工程学院1071.7案例导读问题和解空间2016秋数据科学与软件工程学院108第2章
模块化软件构造第2章模块化软件构造讨论函数级的软件构造技术。学习如何运用模块化技术进行分解和细化,设计由函数组成的、具有一定结构的程序来分离不同的专注点,管理和控制程序的复杂性,使其便于维护、更新和扩展。如何针对实际问题设计和选择数据结构;初步学习如何编程实现软件测试、如何调试程序;理解好程序不仅仅是正确的,还有易维护、健壮等其他性质,学习良好的编程风格。2016秋数据科学与软件工程学院110第2章模块化软件构造故事一50道100以内的加减法口算习题。循环50次,每次产生一个运算题:随机地产生两个100以内的整数,随机地从两个运算符“加法”和“减法”中挑选一个,就可以生成一道口算题;然后打印输出一套练习题。2016秋数据科学与软件工程学院111第2章模块化软件构造2016秋数据科学与软件工程学院112第2章模块化软件构造程序没有明确清晰的“算式”、“习题”的含义,没有使用相应的变量、数据结构等程序设计的方式表达。若干独立的功能集中在一个函数中不利于发现和修改程序中的错误,也不便扩充程序的功能。程序修改后,每次都要重新设计一些检验的数据,运行程序、观察结果,判断修改过的程序是否正确。我们希望能保留下检测数据、运行结果及其判断,无须改变地反复使用。编程缺乏规范。2016秋数据科学与软件工程学院113第2章模块化软件构造2.1分解与模块化2.2数据结构与算法2.3模块化设计理论初步2.4测试程序2.5调试程序2.6案例分析与实践2.7讨论与提高2.8思考与练习题2016秋数据科学与软件工程学院1142.1分解与模块化2.1.1分解的含义2.1.2模块化与结构化2016秋数据科学与软件工程学院1152.1.1分解的含义分而治之的策略:①把问题分成两个或多个更小的问题;②分别解决每个小问题;③然后把各个小问题的解答聚合起来,即可得到原问题的解答。例如,软件开发分解为若干方面,包括软件过程、项目管理、软件开发技术等。软件开发活动细化为需求分析、系统设计、软件构造、软件交付等活动。又如,对于一个要编程解决的问题,可以把程序分解为若干函数或若干类。2016秋数据科学与软件工程学院1162.1.1分解的含义分解的核心是将多个问题、难点或关注点分离。关注点分离是对只与“特定概念、目标”(关注点)相关联的软件组成部分进行“标识、封装和操纵”的能力,即标识、封装和操纵关注点的能力,是处理复杂性的一个原则。关注点分离是面向方面的程序设计的核心概念。2016秋数据科学与软件工程学院1172.1.1分解的含义案例代码2.1的程序可以分解4个部分。(1)增加一个程序头打印函数voidprintHeader(),简单说明本程序的作用和使用。(2)函数voidgenerateEquations(),产生加法或减法算式的符号串并存入一个数组。(3)输出习题的函数voidprintExercise(),它接收generateEquations的输出,按照要求打印输出所有的算式。(4)输出习题中每个算式的计算结果voidprintCalculations()。2016秋数据科学与软件工程学院1182.1.1分解的含义2016秋数据科学与软件工程学院1192.1.2模块化与结构化模块化是把问题分解成容易理解、便于控制、便于实现的子问题的一个重要手段,是实现控制复杂性的方式。模块化通过把一个程序分解成简单独立、互相作用的模块,对不同的模块设定不同的功能,来实现大型、复杂的程序。模块是可组合、可更换的程序单元。良好设计的模块只完成一个特定的或一组相关的子功能。所有模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功能。2016秋数据科学与软件工程学院1202.1.2模块化与结构化软件模块是指具有相对独立性的、由数据说明、执行语句等程序对象构成的代码集合。每个模块都需要单独命名,如:函数、子程序、过程、方法等。通过名字访问指定模块。一个模块具有输入/输出(接口)、功能、内部数据和程序代码4个组成部分。模块具有三大特征:独立性、互换性和通用性。2016秋数据科学与软件工程学院1212.1.2模块化与结构化模块化设计,简单地说,就是将产品的某些要素组合在一起,构成一个具有特定功能的、相对独立的子系统,将这个子系统作为通用模块与其他产品要素进行多种组合,产生多种不同功能或相同功能、不同性能的系列产品。函数(或方法、过程)是实现软件模块化的一个基本手段。2016秋数据科学与软件工程学院1222.1.2模块化与结构化在模块设计中,最基本的是算法和数据结构的设计。代码2.1中只有一个数据结构——算式表示成基本类型符号串,代码2.2增加了一个存储算式的数组作为习题。2016秋数据科学与软件工程学院1232.1.2模块化与结构化如何定义两个算式相等?如果把算式表示成符号串,计算机语言判定符号串“□2+3=”、“2□+3=”、“2+□3=”和“2+3□=”(其中□表示一个空格)互不相等,“2+3”和“2+3=”不相等。但它们是相同的算式。预处理算式——消除算式符号串中的所有空格。但预处理会占用计算资源。2016秋数据科学与软件工程学院1242.1.2模块化与结构化图灵奖获得者Wirth提出的“结构化程序设计”(StructuredProgramming)的方法,可以简化为“算法+数据结构=程序”。这种结构化程序设计方法又称为“自顶向下”或“逐步求精”法。增量迭代方法汲取了这些方法的精华,但有着不同的特点:“增量”是少量可执行程序的功能及每次具体实现增量的过程,而不是从抽象到代码,可视为“需求分析、概念设计、编码实现”的微构造过程。2016秋数据科学与软件工程学院1252.2数据结构与算法2.2.1数据结构与算法的关系2.2.2选择与设计数据结构2.2.3选择与设计算法2016秋数据科学与软件工程学院1262.2.1数据结构与算法的关系数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。为数据集提供独立于计算机内存的数据组织,并提供被视为一种抽象的工具来访问。常见的数据结构,如数组、集合、栈、队列、堆、树、图、散列表等。2016秋数据科学与软件工程学院1272.2.1数据结构与算法的关系算法以一步一步的方式来详细描述计算机如何将输入转化为所要求的输出的过程。描述算法的方式可以采用自然语言、程序设计语言,也可以两种语言混合使用。用计算机程序语言实现并在计算机上运行的算法就是程序,它是一个解决实际问题方法的程序语言的指令序列。基本的算法(类型)包括查找、排序、二叉树的遍历、图的遍历、最短路径算法。2016秋数据科学与软件工程学院1282.2.1数据结构与算法的关系计算机算法与数据结构密切相关,算法依赖于具体的数据结构,数据结构直接关系到算法的选择和效率。(1)一种数据结构、一种算法:通常是针对一种特殊的数据结构设计的特殊算法。如,计算树的高度、树节点的层级。(2)一种数据结构、多种算法:如,数组,支持的算法如排序、查找、图类、矩阵类等等。(3)多种数据结构、一种算法:如,折半查找使用数组和二叉树,也可以使用链表。(4)多种数据结构、多种算法:如,数组和二叉树,基本的算法有遍历类、查找类、求最大值等。2016秋数据科学与软件工程学院1292.2.1数据结构与算法的关系在程序设计和软件开发的实践和理论中,存在过以数据为中心和以操作为中心的开发方法。更多时候,软件开发者在数据与算法之间寻找均衡的设计方法,同时兼顾数据结构与算法。面向对象的程序设计语言和面向对象开发方法就是综合了数据与操作,将其封装成一个软件实体——对象,完成用户需求分析、软件建模与软件构造。2016秋数据科学与软件工程学院1302.2.2选择与设计数据结构算式与习题的基本数据结构设计1:把算式理解成具有一定组成元素的结构——两个运算数、一个加或减法的运算符,以及结果。程序设计风格操作数的命名独立变量和非独立变量2016秋数据科学与软件工程学院1312.2.2选择与设计数据结构一个结构类型是否包含非独立变量,应该考虑下列因素。①获取非独立变量值的难易程度。②使用非独立变量的频繁程度。2016秋数据科学与软件工程学院1322.2.2选择与设计数据结构对于包含算式的习题,自然地选择数组。数组是有限个同类型元素的有序集合。绝大多数高级程序设计语言都有内置数组。习题Exercise可以定义成以结构体的算式为元素的数组:2016秋数据科学与软件工程学院1332.2.2选择与设计数据结构设计2:使用一个包含三个成员的数组[operand,operand2,operator]表示算式Equation。语言要求数组成员属于同一类型,故将算式中的运算符operator定义成整数类型。可以用不同的数值对应不同的运算符,如0表示“加”,1表示“减”。习题Exercise仍然使用数组,可视为一个[50,3]的二维数组。2016秋数据科学与软件工程学院1342.2.2选择与设计数据结构比较首先,数据结构的设计是否满足实际问题的需要?是否直接反映了问题本身?第二,数据结构的设计是否容易编程实现?第三,对解决问题的操作是否给予支持?即是否方便算法的设计与实现。第四,设计的质量如何?包括可读性、易修改性、可扩展性、易维护性等。2016秋数据科学与软件工程学院1352.2.2选择与设计数据结构2016秋数据科学与软件工程学院1362.2.2选择与设计数据结构符号串直接显示了人易读的形式;节省存储空间。符号没有语义(数据类型),需要解析;结构体表示出算式组成的数据类型;节省存储空间。要用转换函数才能显示并输出一个算式。数组任意表示复杂的算式;容易扩展到两个、甚至数十个运算符;节省存储空间。算式成分与数组的位置需要映射;要用转换函数才能显示并输出一个算式。2016秋数据科学与软件工程学院1372.2.2选择与设计数据结构小结:(1)算式的三种数据结构都能满足需求。(2)如程序要求扩展或改善,则会要求代码易读、结构稳定,才容易理解、修改和扩充。如,检查算式是否重复,或在习题中查找算式,设计1和2比代码2.1有明显优势。再如,增加乘、除法运算,三种数据结构都不变,代码2.1的算式输出不变,但要增加解析操作,从符号串分解出乘和除;设计1和2需要增加乘、除法运算符的显示方式,而设计2要增加两个映射(比如3对应乘法)。结论:总体考虑,把算式成分明确表示出来的结构体是目前算式的最佳数据结构。2016秋数据科学与软件工程学院1382.2.2选择与设计数据结构算法分析与其他数据结构案例隐含要求:不允许出现重复的算式。对于数组,要实现算式比较算法。产生50个算式的习题总共需要的比较次数是:0+1+2+…+49=(0+49)×50/2=1225。产生有正整数n个不同算式的习题,算法的复杂性是O(n2)。“集合”。语言实现了集合的基本操作,包括插入、判定一个元素是否在集合中。而且,集合中元素数量可以动态变化。如此构造一个习题的算法就是线性的。2016秋数据科学与软件工程学院1392.2.3选择与设计算法1.习题与算式的分离算式与习题是两个完全不同的数据。算式是具有满足一定约束条件的组成元素和结构的数据,不是简单的符号串。习题包含了数目确定的不同的算式,它像一个容器把算式存储起来。它们的产生方式不同,操作和使用也不相同。2016秋数据科学与软件工程学院1402.2.3选择与设计算法1.习题与算式的分离把习题和算式明确地从代码中抽出,并分别用合适的数据结构表示,有助于各自的设计与实现,也能实现不同的算式和习题的任意组合。假设算式有三种数据结构:结构体、一维数组和字符串;习题有4种选择:一维数组、集合、队列及不需数据结构(如代码2.1),则案例程序可以有12种数据结构的组合方式。2016秋数据科学与软件工程学院1412.2.3选择与设计算法1.习题与算式的分离而且,不仅一个程序的数据结构具有不同的组合方式。如果把数据结构连同对它们的操作也都封装到一个模块——最简单的就是函数,那么,包含了数据与操作的这些函数可以作为程序的模块使用。可以提高程序的结构性和可维护性,如可以替换相同功能、不同实现的模块,而不影响程序的功能。2016秋数据科学与软件工程学院1422.2.3选择与设计算法2.算式产生与其约束条件的分离考虑到程序的可扩展性、可修改性,例如,允许不止一个加法或减法运算,或者将算式数值范围扩大到500、1000等。分别定义运算数生成函数与约束条件检测函数,对满足一定条件的运算数才生成算式。“满足100以内整数”的条件不仅适合两个运算数,也适用于其结果。2016秋数据科学与软件工程学院1432.2.3选择与设计算法3.加减法算式的分离为了能够产生全加、全减和混合三种类型的习题,应当分别编写加法算式和减法算式函数,然后随机地选择这两种算式,就能生成混合运算的习题。2016秋数据科学与软件工程学院1442.2.3选择与设计算法2016秋数据科学与软件工程学院1452.3模块化设计理论初步2.3.1模块化原则2.3.2模块的内聚性2.3.3模块间的耦合性2016秋数据科学与软件工程学院1462.3.1模块化原则Meyer提出了5条标准来评价一种设计方法是否定义了有效的模块系统的能力。(1)模块可分解性。(2)模块可组装性。(3)模块可理解性。(4)模块连续性。(5)模块保护性。2016秋数据科学与软件工程学院1472.3.1模块化原则模块的独立程度可以由两个定性标准来度量——内聚和耦合。内聚衡量一个模块内部各个元素之间相互结合的紧密程度;耦合衡量不同模块彼此间互相依赖(连接)的紧密程度。2016秋数据科学与软件工程学院1482.3.2模块的内聚性内聚性是对一个模块内部各个组成元素之间相互结合的紧密程度的度量指标。模块中组成元素结合得越紧密,模块的内聚性就越高,模块的独立性也就越高。理想的内聚性要求模块的功能应明确、单一,即一个模块只做一件事情。2016秋数据科学与软件工程学院1492.3.2模块的内聚性内聚有如下7种,由弱到强排列如下。(1)偶然内聚(2)逻辑内聚(3)时间内聚(4)过程内聚(5)通信内聚(6)顺序内聚(7)功能内聚2016秋数据科学与软件工程学院1502.3.3模块间的耦合性耦合性是一个模块与系统内其他模块及与外部世界的关联程度的度量。耦合的强弱取决于模块间接口的复杂性、调用模块的方式及通过界面传送数据的多少。在软件开发中,应该追求尽可能松散耦合的系统。2016秋数据科学与软件工程学院1512.3.3模块间的耦合性耦合度从低到高可分为7级。非直接耦合数据耦合标记耦合控制耦合外部耦合公共耦合内容耦合2016秋数据科学与软件工程学院1522.3.3模块间的耦合性耦合是影响软件复杂程度的一个重要因素。一般而言,应该采取下述设计原则:应尽量使用数据耦合,减少控制耦合,限制外部环境耦合和公共耦合,杜绝内容耦合,降低接口的复杂度。2016秋数据科学与软件工程学院1532.3.3模块间的耦合性模块的内聚性和耦合性是两个相互对立且又密切相关的概念。软件概要设计的目标是力求增加模块的内聚,尽量减少模块间的耦合。在程序结构中,各模块的内聚程度越高,模块间的耦合程度就越低。虽然这种关联不是绝对的,但是,增加内聚比减少耦合更重要,软件开发者应当把更多的注意力集中到提高模块的内聚程度。2016秋数据科学与软件工程学院1542.4测试程序IEEE软件工程标准术语:软件测试使用人工或自动手段来运行或测定某个系统的过程,目的在于检测它是否满足规定的需求或者是否弄清预期结果与实际结果之间的差别。测试是对程序或系统能否完成特定任务建立信心的过程。软件测试是说明程序是否正确的最基本的一种技术手段。2016秋数据科学与软件工程学院1552.4测试程序执行程序测试时,要考虑下列因素。首先,如何判定程序的运行结果是否满足了需求?上面列出的需求是否可以判定对错?其次,如何执行程序测试?是否需要记录?如何记录?软件测试应该尽量详细、完整地记录下来。测试执行与记录可以手工完成,也可以借助软件工具或框架完成,还可以通过编写测试代码完成。第三,需要运行程序多少次才能说明程序正确了?或者说,选择什么样的输入数据、涵盖了哪些程序范围就可以说明了程序的正确性?2016秋数据科学与软件工程学院1562.4测试程序2.4.1测试需求2.4.2测试设计与测试用例2016秋数据科学与软件工程学院1572.4.1测试需求由于对用户需求理解的偏差,要执行软件测试,实现测试目的,首要任务是要仔细地分析用户需求和设计,梳理含糊不清、模棱两可、相互矛盾的需求,明确、细化和罗列出需求,并且将每个需求表示成可以检测的测试需求。例如,要求运算数的数值范围是0~100。[0,100]、(0,100)、(0,100]、[0,100)。2016秋数据科学与软件工程学院1582.4.1测试需求有时用户难以精确地表示需求,需要在使用之后“感觉”到没有问题了。这就要求程序员具有一定的经验,与用户沟通交流、对问题深入理解、良好的软件设计等能力及对编程语言的掌握程度等,才能开发出满足用户要求的软件。针对软件开发中用户需求的不确定性、经常变化等问题,出现了用户联合开发方法(JointApplicationDevelopment,JAD)。特别地,敏捷开发方法要求客户参与软件开发。2016秋数据科学与软件工程学院1592.4.1测试需求其次,测试需求要求程序的预期结果和实际运行结果都要明确、合理、可观察并可比较。案例要求50道算式的需求非常明确。2016秋数据科学与软件工程学院1602.4.1测试需求为了测试程序是否包含某个算式,一定要运行整个程序吗?如同采用分解和模块化技术,分而治之地解决一个较大问题的软件开发,分解也同样适用于软件测试。为了方便、快速地检测一个用户需求或者特定功能是否得到满足,可以针对性地设计测试,或者测试程序的一部分。一种策略是分析用户需求,把它细化成一个个具体的、独立的、功能单一的测试需求。2016秋数据科学与软件工程学院1612.4.1测试需求将代码2.1的测试需求分解如下:(1)程序是否能正确地产生满足条件的加法算式?(确定的程序)(2)程序是否能正确地产生满足条件的减法算式?(确定的程序)(3)程序是否能正确地产生满足条件的加法或减法算式?(随机性)(4)进一步,还可以继续分解成如下的测试需求:程序是否产生了[0..100]范围的值,或者[1,100]范围的值,或者(0,100)范围的值?2016秋数据科学与软件工程学院1622.4.2测试设计与测试用例测试设计不同于测试用例设计。测试设计的内容包含设计测试用例,此外还包括决定是否实施所有层次的测试、是否采用测试工具或自动化测试框架、哪些测试采用哪些工具、如何组织人员进行测试等。IEEE,测试用例是一组输入、运行条件和通过/失败准则。简单地说,测试用例是一组测试数据和预期结果。2016秋数据科学与软件工程学院1632.4.2测试设计与测试用例程序的运行结果分为三类:产生的值。如局部观察的输出(数值、文字、图片、声音等)或者操作、存储的输出。状态变化。如程序的状态变化、数据库的状态变化。必须一起解释为输出才有效的一个序列或一组值。测试用例设计的核心就是设计测试输入,即测试数据。2016秋数据科学与软件工程学院1642.4.2测试设计与测试用例【例2.1】一个生成整数减法的程序,输入是两个整数,要求输出它们的差,结果不能为负数。2016秋数据科学与软件工程学院1652.4.2测试设计与测试用例对每个测试用例,将程序运行结果与预期结果比较。若相等,表示待测程序“通过”了测试数据;若不相等,表示待测程序未通过测试数据,即测试“失败”。可能出现其他情况,没有执行所有的测试用例,比如因某个测试数据导致待测程序没能运行完而退出,或者程序异常退出,或者用户中断程序运行等。2016秋数据科学与软件工程学院1662.4.2测试设计与测试用例测试结果的判定可能会存在误判和漏判。由于测试数据或预期结果的错误而导致显示待测程序可能有误,称为测试误判。如果待测程序有错,而测试没有发现错误,称为测试漏判。如何减少漏判,即如何通过测试发现程序中存在错误,实际上就是如何设计测试和测试数据,使得待测程序不能通过一些测试用例。理论上,测试不能证明程序没有错误,而是通过测试发现
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024版钢筋工程合同风险管理合同3篇
- 全国赛课一等奖人教版数学六年级上册《分数除法一个数除以分数》课件
- 八年级数学家长会课件
- 体育赛事承办合同协议书范本
- 2024版汽车零部件采购与销售合同2篇
- 资金监管的合同范本2024版
- 2024年度建筑工程渣土绿色运输合同3篇
- 基于2024年度的广告投放合同具体描述3篇
- 河北省劳动合同
- 实习合同范本
- 最新四川省教师资格认定体检表.docx
- 永磁电动机使用说明书胜利顺天
- 球形网架结构的吊顶施工做法
- 孟母三迁(课堂PPT)
- 人教版八年级数学上册14.3.2《公式法》第2课时 教 案
- 股东会同意借款决议范本专业版
- 《南州六月荔枝丹》学习要点
- 软件工程实验报告_学生成绩管理系统
- 九年义务教育全日制小学音乐教学器材配备目录
- MSDS(10-100048)聚脂烤漆
- 船舶风险辩识、评估及管控须知
评论
0/150
提交评论