Bob Koss 与 Bob Martin展示结对编程。用TDD的开发模式做一个计算保龄球比赛得分程序。
首先,他们创建了一个测试验收用例。画了一个简单的UML图,便从写测试用例开始编程。
一开始的设计是这样的:
分为三个类:
- Game类
- Game类包含Frame类,1:10
- Frame类包含Throw类,1..3
然后,他们发现不需要Throw类,甚至也不需要Frame类。接着,不断的按功能增加单元测试,单元测试不通过则编写业务代码,通过后再重构,直到代码看上去没有坏味道为止。比如补中与全中的计分功能。整个开发过程是互相提出想法,用代码实践想法,提出修改意见,用代码实践修改意见。
最后代码:
Game:
1 public class Game 2 { 3 int currentFrame = 0; 4 bool isFirstThrow = true; 5 Scorer scorer = new Scorer(); 6 7 public int Score { get { return ScoreForFrame(currentFrame); } } 8 9 public void Add(int pins) 10 { 11 scorer.AddThrow(pins); 12 AdjustCurrentFrame(pins); 13 } 14 15 void AdjustCurrentFrame(int pins) 16 { 17 if (LastBallInFrame(pins)) AdvanceFrame(); 18 else isFirstThrow = false; 19 } 20 21 bool LastBallInFrame(int pins) 22 { 23 return Strike(pins) || !isFirstThrow; 24 } 25 26 bool Strike(int pins) 27 { 28 return isFirstThrow && pins == 10; 29 } 30 31 void AdvanceFrame() 32 { 33 currentFrame++; 34 if (currentFrame > 10) currentFrame = 10; 35 } 36 37 public int ScoreForFrame(int theFrame) 38 { 39 return scorer.ScoreForFrame(theFrame); 40 } 41 }