资源描述
暨南大学计算机科学系黄战 在案例研究的语境中介绍这两种重要的开发实践。 极限编程(XP)所提倡的重要测试实践是:首先编写测试。它还提倡不断地重构代码以改进质量,包括降低冗余、提高清晰度等。现代工具都支持这两种实践,并且有许多OO开发者信赖这些实践的价值。 测试驱动开发(TDD)迭代和敏捷XP方法提倡的优秀实践。在TDD风格的OO单元测试中,要在测试类之前编写测试代码,并且开发者要为几乎所有的产品代码编写单元测试。 TDD的基本规律是编写一小段测试代码,然后再编写一小段产品代码,保证其通过测试,然后再编写更多的测试代码,依此类推。先写测试代码,此时不妨想象被测代码已经写出来了。 能够保证编写测试人们往往会忽略单元测试。使程序员获得满足感从而更始终如一地坚持编写测试(我能够编写通过这一测试的代码吗?)有助于澄清接口和行为的细节可证明、可再现、自动的验证改变事物的信心 遵循以下模式完成每个测试方法:1)创建测试固件。2) 对其完成某些操作(你所希望测试的某些操作)3) 评估结果是否为期望值。我们没有先编写所有的单元测试,而是只编写了一个测试方法,在类中实现该方法并确保通过测试,然后再反复这一过程。 重构是重写或重新构建已有代码的结构化和规律性方法,但不会改变已有代码的外在行为,而是采用一系列少量转换的步骤,并且每一步都结合了重新执行的测试。不断地重构代码也是XP的一个实践,该实践也适用于所有的迭代方法(包括UP)。 重构的本质是:一次实行一小步保留行为的转换(每次转换都称为“重构”)。每次转换后,要重新执行单元测试,以保证重构不会导致错误。重构和TDD具有关系所有的单元测试要支持重构过程。 每次重构是:少量的但是一系列的改变。每次重构都伴随着重新执行的单元测试。会对代码和设计产生主体性的重新构造,同时所有的重构都要保证代码的行为与过去一致。 public 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 class public 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 class / good method name, but the logic of the body is not clearboolean isLeapYear( int year )return( ( ( year % 400 ) = 0 ) | ( ( ( year % 4 ) = 0 ) / thats better!boolean isLeapYear( int year )boolean isFourthYear = ( ( year % 4 ) = 0 );boolean isHundrethYear = ( ( year % 100 ) = 0);boolean is4HundrethYear = ( ( year % 400 ) = 0);return ( is4HundrethYear| ( isFourthYear
展开阅读全文