资源描述
目标在案例研究的语境中介绍这两种重要的开发实践。overview简介极限编程(XP)所提倡的重要测试实践是:首先编写测试。它还提倡不断地重构代码以改进质量,包括降低冗余、提高清晰度等。现代工具都支持这两种实践,并且有许多OO开发者信赖这些实践的价值。测试驱动开发(测试优先开发)测试驱动开发(TDD)迭代和敏捷XP方法提倡的优秀实践。在TDD风格的OO单元测试中,要在测试类之前编写测试代码,并且开发者要为几乎所有的产品代码编写单元测试。TDD的基本规律是编写一小段测试代码,然后再编写一小段产品代码,保证其通过测试,然后再编写更多的测试代码,依此类推。先写测试代码,此时不妨想象被测代码已经写出来了。测试驱动开发的优点能够保证编写测试人们往往会忽略单元测试。使程序员获得满足感从而更始终如一地坚持编写测试(我能够编写通过这一测试的代码吗?)有助于澄清接口和行为的细节可证明、可再现、自动的验证改变事物的信心示例遵循以下模式完成每个测试方法:1)创建测试固件。2)对其完成某些操作(你所希望测试的某些操作)3)评估结果是否为期望值。我们没有先编写所有的单元测试,而是只编写了一个测试方法,在类中实现该方法并确保通过测试,然后再反复这一过程。重构重构是重写或重新构建已有代码的结构化和规律性方法,但不会改变已有代码的外在行为,而是采用一系列少量转换的步骤,并且每一步都结合了重新执行的测试。不断地重构代码也是XP的一个实践,该实践也适用于所有的迭代方法(包括UP)。重构重构的本质是:一次实行一小步保留行为的转换(每次转换都称为“重构”)。每次转换后,要重新执行单元测试,以保证重构不会导致错误。重构和TDD具有关系所有的单元测试要支持重构过程。重构每次重构是:少量的但是一系列的改变。每次重构都伴随着重新执行的单元测试。会对代码和设计产生主体性的重新构造,同时所有的重构都要保证代码的行为与过去一致。重构的命名提炼方法提炼方法(Extract MethodExtract Method)将较长的方法转换为短小的方法,将较长的方法转换为短小的方法,其中将原有方法,其中将原有方法其中将原有方法,其中将原有方法中的部分内容分解为私有的帮助者中的部分内容分解为私有的帮助者方法(方法(helper methodhelper method)提炼常量提炼常量(Extract ConstantExtract Constant)使用常量变量使用常量变量(constant variableconstant variable)替换)替换字面常量字面常量引入解释变量引入解释变量(提炼局部变量(提炼局部变量的特化)的特化)将表达式的部分或完整结果置入临将表达式的部分或完整结果置入临时变量,该变量的名字应该能够说时变量,该变量的名字应该能够说明其目的明其目的使用工厂方法替代构造器使用工厂方法替代构造器调用调用例如例如JavaJava中,调用创建对象的帮助者中,调用创建对象的帮助者方法(方法(helper methodhelper method)来代替对新操)来代替对新操作和构造器的调用作和构造器的调用(隐藏细节隐藏细节)Fig.21.1Fig.21.2public class Playerprivate Piece piece;private Board board;private Die dice;/public void takeTurn()/roll diceint rollTotal=0;for(int i=0;i dice.length;i+)dicei.roll();rollTotal+=dicei.getFaceValue();Square newLoc=board.getSquare(piece.getLocation(),rollTotal);piece.setLocation(newLoc);/end of classFig.21.3public class Playerprivate Piece piece;private Board board;private Die dice;/public void takeTurn()/the refactored helper methodint rollTotal=rollDice();Square newLoc=board.getSquare(piece.getLocation(),rollTotal);piece.setLocation(newLoc);private int rollDice()int rollTotal=0;for(int i=0;i dice.length;i+)dicei.roll();rollTotal+=dicei.getFaceValue();return rollTotal;/end of classFig.21.4/good method name,but the logic of the body is not clearboolean isLeapYear(int year)return(year%400)=0)|(year%4)=0)&(year%100)!=0);Fig.21.5/thats better!boolean isLeapYear(int year)boolean isFourthYear=(year%4)=0);boolean isHundrethYear=(year%100)=0);boolean is4HundrethYear=(year%400)=0);return(is4HundrethYear|(isFourthYear&!isHundrethYear);Fig.21.6Fig.21.7
展开阅读全文