极限编程简介.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

极限编程简介原著其它极限编程相关著作《敏捷软件开发:原则、模式和实践》RobertC.Martin《重构-改善既有代码的设计》MartinFowler《测试驱动开发》KentBeck《设计模式》GoF目录极限编程重构+设计的原则+浮现式设计自动测试+测试驱动开发领域模型+领域驱动设计(非极限编程内容)修改代码的四个原因+总的图示极限编程的价值观和原则问题:什么是敏捷开发?回答:90年代开始流行的一种开发方法体系,现已成为欧美主流开发方法主要特点:迭代增量式开发主要体系:极限编程,scrum等敏捷宣言(2001):个体和交互胜过过程和工具可以工作的软件胜过面面俱到的文档客户合作胜过合同谈判响应变化胜过遵循计划(虽然右项也具有价值,但左项具有更大的价值)补充:敏捷在各国的发展问题:为什么欧美热衷于研究方法论?回答:软件公司多,竞争激烈咨询公司的出现为了提高开发效率,降低成本工程中的例子:吸纳员工vs请顾问结对编程,团队成员人数及角色的稳定,但分工是会变的总之:敏捷开发不解决技术问题,不能帮助团队做出原来做不出的产品,但可以帮助团队降低开发成本(提高开发效率),提高产品质量(降低缺陷率)问题:敏捷迭代流程与瀑布流程的区别?回答:瀑布开发流程敏捷开发流程补充:一般采用原型迭代的模式来开发问题:什么是极限编程?回答:极限编程是一种轻量级软件开发方法论(eXtremeProgrammin,简称xp)其特点是简单、快速、低缺陷率、适应需求变化。是敏捷开发中最著名的方法由kentbeck1996年开发C3项目时提出补充:方法论不是“知识”,不需要死记硬背,它是“方法和原则”,需要理解,然后运用到“实践”中去问题:极限编程与敏捷开发的关系?回答:极限编程不研究管理,也没有严格的项目进度管理(就是白板+贴纸来),scrum涉及一点项目管理,与敏捷开发相对应的有“精益管理”开发方法管理方法敏捷开发极限编程精益管理问题:什么是方法?为什么要使用方法?生活中的例子:做菜有做菜的方法,下棋有下棋的方法使用方法与不使用方法的区别在哪?回答:什么是方法?——方法就是做事的手段、方式、流程。为什么要使用方法?——使用方法可以提高做事的成功率什么是方法论?——方法论即一组方法的集合,也就是一组用于确保成功的规则的集合。为什么要使用方法论?——使用方法论可以最大限度地提升做事的成功率。问题:极限编程的价值观、原则、实践各有哪些?回答:价值观:沟通反馈简单勇气尊重原则:流式开发小步快跑反省冗余(等)主要实践:坐在一起、现场客户、结对编程重构、浮现式设计、测试驱动开发用户故事与周循环、持续集成(等)补充:实践间的关系:自动测试-重构-浮现式设计与测试驱动开发,即自动测试是最基本的实践;另,程序员为什么不喜欢写测试?价值观原则实践问题:极限编程的开发流程是怎样的?回答:(iteration迭代,acceptancetest验收测试)简单的讲,即分七个迭代周期:秒级迭代:结对编程分钟级迭代:自动测试小时级迭代:结对讨论每日迭代:每日站会数日迭代:验收测试一周迭代:迭代计划季度迭代:发布计划补充:即xp不做过多长远规划,只要保证每一天、每分每秒都在做最重要、最有价值的事情就可以了,至于项目是否继续做是由客户或管理层决定的事情问题:为什么要使用极限编程?瀑布流程存在的问题是什么?项目中常见的问题有哪些?回答:Xp主要解决:不能适应需求变化——周/日迭代软件缺陷多——结对编程、测试驱动开发代码质量低——重构设计不良——浮现式设计项目中浪费大——现场客户、弹性计划开发效率低——以上所有、团队协作、“拉”模式补充:Xp认为程序写出来应该是没有bug的,产品代码与测试代码是同步写的,另外代码、设计也是通过不断重构来不断改进的问题:什么是重构?回答:定义:重构是在不改变软件外部行为的前提下改善其内部结构本质上说:重构就是在代码写好后改进它的设计简单来说:就是一种整理代码的方法,以提高代码的质量注:不是所有整理代码都是重构,重构有一个前提:自动测试,一个目标:设计原则另外还有两个原则:小步快跑和两顶帽子问题:为什么要重构?生活中的例子:整理房间,一个月不整理会怎样?回答:重构vs不重构(代码质量主要有正确性,可读性,可维护性,可扩展性、稳定性等)代码质量时间无重构持续重构补充:代码质量最重要的是“可读性”,同见《HW编程规范》问题:如何重构?回答:一次重构的步骤:①发现“代码坏味”(即代码中不符合设计原则的部分)②使用重构手法消除代码坏味③自动测试,保证重构没有改变代码外部行为然后不断重复以上三步,改进代码的设计模块重构的步骤函数级整理、对象级整理、业务逻辑的整理注:c语言中可将一个.c当做一个类/对象问题:代码坏味有哪些?回答:四大类:不可读(13项)词不达意——函数改名超长函数——抽取函数过长参数列——用函数取代参数抽象层级不一致——抽取函数不简洁(8项)重复代码——合并代码重复逻辑——合并逻辑过度设计——移除间隔层不面向对象(7项)过程代码——生成对象不单一职责(4项)发散式变化——切分代码散弹式修改——重组代码代码耦合——添加间隔层or依赖注入层间耦合——领域层与界面层分离or软件与硬件分离问题:为什么要“增加函数减少参数”?具体如何操作?回答:(1)提高代码可读性(2)减少代码间的耦合(3)降低代码复杂度(圈复杂度),易于维护Set_type(A/B)-set_type_A()与set_type_B()问题:什么是抽象层级不一致?回答:即底层函数包含细节,然后一层层封装,屏蔽细节高层函数应读起来像“英语文章”,不要涉及底层细节总之即,底层——抽象层级低,细节多,粒度小高层——抽象层级高,细节少,粒度大抽象层级的基本划分:分层、分模块、分对象、分函数(但注意对象之间、函数之间同样有抽象层级的关系)生活中的例子:语言也是一种抽象;“早餐、中餐、晚餐、鸡蛋””外壳引擎底盘螺丝钉“哪一个词抽象层级不符?;24楼与1楼看到的景色有什么不一样?工程中的例子:vif-逻辑端口-物理端口,交换驱动不应做vif转换;bcm函数的分层,bcm_xxx-bcm_esw_xxx问题:如何将过程代码改为面向对象的代码?数据1数据2数据4数据3数据6数据5函数1函数2对象数据函数对象1对象2对象3回答:步骤如下:(1)找到数据结构以及相关操作函数(2)将它们一起放入一个.c中(3)将数据设为static(私有),并提供get、set函数供外部调用另:至于.c内部是否用get/set访问,可随意,但建议也使用get/set,以使代码清晰、便于修改另:消息队列也可以封装到对象中,提供send、recv问题:如何避免代码耦合?回答:使用接口隔离变化添加间隔层依赖注入工程中的例子:线路模板,如何避免主控变化影响线卡?减少重复,不要定义两次,将设定用参数传入问题:什么时候重构?回答:任何修改代码的时候都需要重构如添加新功能之前、解bug之后都需要重构也可以抽专门的时间来重构问题:重构的前提与重构的目标是什么?回答:重构的前提:自动测试重构的目标:设计原则问题:设计的原则有哪些?回答:简洁为美隔离变化不重复独一份不过度设计单一职责面向接口编程函数封装抽象面向对象软硬分离依赖倒置.c当类多态抽象数据结构领域驱动设计领域模型领域映射接口裁剪使用模式问题:是否该为“未来”编码(设计)?例如:一个以后可能会用到的功能,是否应该现在实现?回答:Xp坚持“简洁为美”即认为当前用不到的功能就不要做未来是未知的,预先的设计编码都是浪费设计应尽量简单,避免过度设计问题:程序的完美结构是怎样的?生活中的例子:如何整理衣柜,是混杂的放到一起还是分门别类?笔记本电脑和台式机哪个更好修理?回答:一个“单元”只随一个方面的变化而变化(单一职责原则)同时“单元”间通过接口相连(面向接口编程)只要接口保持稳定,“单元”间的变化就可以互不影响发生了什么变化就改对应单元即可“单元”指“层/模块/类/函数”,即大的单元包含小的单元不好的设计:发散式变化,散弹式修改接口单元(层/模块/类/函数)变化问题:为什么要面向对象?回答:将数据与操作数据的函数封装到一起提高封装性,使代码更易维护和测试问题:C语言可以面向对象吗?回答:将.c文件当作类(单实例)即将数据与操作它们的函数放到一起同时将内部数据和私有函数声明为static抽象数据结构(多实例)对外提供结构体指针的定义,但不提供具体结构体的定义即使用对外的接口来定义数据结构的用法多态可用函数指针重新赋值来实现问题:什么是浮现式设计?生活中的例子:迪斯尼乐园的道路设计回答:即先实现再设计通过不断重构使好的设计自己浮现出来持续改进设计问题:测试的目的是什么?测试的本质是什么?回答:测试的目的是“为了发现错误,而执行程序的过程”即测试不是为了“验证程序正确”,而是为了“证明它有错”也就是说,测试不能只执行正常路径,而要能覆盖代码所有的非法路径以提高代码的稳定性测试的本质:“测试就是代码的冗余”也就是说测试是将代码的逻辑又重复了一次即通过增加冗余来提高代码质量就像以太网二层帧中加上冗余的CRC校验来提高通信质量一样问题:什么是自动测试?回答:自动测试就是自己写代码、脚本来测试分为“单元测试”和“验收测试”两类“单元测试”是指“对软件中的最小可测单元进行检查和验证”。“验收测试”是指对系统的黑盒测试,测试用户的功能需求是否完成xp中要求“验收测试”的测试用例应由用户来写(或由用户来确认)问题:为什么要自动单元测试?回答:(1)速度快,节省时间(2)可以频繁测试防止bug产生(3)减少调试工作量,提高开发效率(4)防止代码行为的倒退(5)测试用例是最好的文档(6)利于“重构”(7)利于“测试驱动开发”问题:为什么要自动验收测试?回答:(1)速度快,节省时间(2)可以经常执行防止集成产生的问题(3)验收测试的测试用例就是最好的需求文档(4)方便持续集成问题:如何自动单元测试?回答:半自动的方法:①写测试函数,调用被测函数,传参数,即“预置输入”②实现调试打印,将被测函数的输出打印出来(如可以打印出所处理的结构体)③人工检查调试打印的正确性,将“正确打印”保存下来④以后每次测试,可以将“当前打印”与“正确打印”比较即可全自动的方法:xUnit测试框架(c语言版的unity)补充:线路模版的自动测试,单元测试验收测试最好分开问题:如何自动验收测试?回答:半自动方法:最简单的方法如下:①将要输入的命令写到一个txt中,然后粘贴到串口运行②打开调试打印,人工检查调试打印的正确性,将“正确打印”保存下来③以后每次测试,可以将“当前打印”与“正确打印”比较即可全自动方法:可以写一个串口的测试工具,按xUnit的四个步骤来实施一个测试用例①夹具建立,也就是通过串口发送命令,来建立测试的环境②执行被测系统,即通过发送串口命令来使用要测的功能③结果验证,即通过串口返回的信息来做验证,主要还是验证传给驱动的参数,做字符串比对即可④夹具拆卸,即通过发送串口命令来清除测试预置的状态问题:如何写出没有bug的程序?什么是测试驱动开发?回答:即先写测试用例,再写代码典型步骤是:红灯-绿灯-重构“红灯”代表写一个新的测试用例使测试失败“绿灯”代表写代码使测试通过问题:什么是领域模型?生活中的例子:建筑图软件中的例子:判定素数的程序项目中的例子:线路模版回答:领域模型即领域知识综合而成的模型它反映了问题领域内的原理、关联和约束任何实现相关的知识都不属于领域模型比如写一个判断素数的程序那么素数的定义“除了1和自身外,没法被其他数整除的自然数”就是此程序的领域模型。至于使用什么算法,使用什么语言,用数组还是链表存储,都是“实现”而不是领域模型。而对Olt而言大致就是“芯片原理”加上“业务逻辑”问题:什么是bug?什么不是bu

1 / 98
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功