String strText = "910"; String strTextResult = "._.|_|..|.....|..|._.|.||_|";String strOutput = digitalSegment.DisplaySegmentDigital(strText);assertEquals(strOutput , strTextResult);
public String DisplaySegmentDigital(String strText) {return "._.|_|..|.....|..|._.|.||_|";}
String strText = "3456"; String strTextResult = "????????";git
问题接着出来了:这串问号该填什么?这样测试真的有意义么?几乎全部的人都直以为发现这里有问题。简短的讨论后,结论是应该测试每一个数字的显示,而非一个字符串。因而,测试变为:算法
String strText = "9"; String strTextResult = "._.|_|..|"; 框架
String strOutput = digitalSegment.DisplaySegmentDigital(strText); 函数
assertEquals(strOutput , strTextResult);单元测试
实现变为:学习
public String DisplaySegmentDigital(String strText) {测试
if(strText == "9")spa
return "._.|_|..|";设计
else开发
return null;
}
实现后,接着测试:
strText = "1"; strTextResult = ".....|..|";
strOutput = digitalSegment.DisplaySegmentDigital(strText);
assertEquals(strOutput , strTextResult);
实现也变为:
public String DisplaySegmentDigital(String strText) {
String[] strResult=new String[10];
strResult[0]="._.|.||_|";
strResult[1]=".....|..|";
strResult[9]="._.|_|..|";
return strResult[Integer.parseInt(strText)];
}
至此,很显然咱们的算法也就天然而然的诞生了。可能与不少人本身开始的算法设计不太同样,但也不该该差到哪里:)。这就是TDD演进式设计。
但有个问题,._.|_|..|是什么东东?我怎么知道最终输出是正确的。所以,咱们稍微改变了一下写法:
String strText = "9"; String strTextResult = "._." +
"|_|" +
"..|";String strOutput = digitalSegment.DisplaySegmentDigital(strText);
assertEquals(strOutput , strTextResult);
strText = "1";
strTextResult = "..." +
"..|" +
"..|";
strOutput = digitalSegment.DisplaySegmentDigital(strText);
assertEquals(strOutput , strTextResult);
实现变为:
public String DisplaySegmentDigital(String strText) {
String[] strResult=new String[10];
strResult[0]="._." +
"|.|" +
"|_|";
strResult[1]="..." +
"..|" +
"..|";
strResult[9]="._." +
"|_|" +
"..|";
return strResult[Integer.parseInt(strText)];
}
如今直观多了。
为何必定要变得直观,其目的不单纯是为了程序的易读性,更重要的是:测试不该该抄实现的代码,实现也不要抄测试的代码,不然后果很严重。写测试代码时,必须是含着测试的心态,含着使用者的心态去写测试代码,而非一门心思去想实现。若是这样,TDD就失败了。这也是为何TDD要求先写测试代码,再写实现代码的缘由。由于咱们一旦先想到了实现,那么接下来的测试,必然会跟着实现的逻辑走,从而违背“测试独立性”的原则。实现发生错误,测试也没法发现。
接下来须要整理一下代码,显然DisplaySegmentDigital这个函数名不是那么准确,后来议论了一番,得出的名字是:GetDigitalDisplayContent。结束后,我想GetDigitalFont可能更好。
好了,有关第一次道场就写到这里,留一个小小的问题:到目前为止咱们尚未设计显示的算法。为了便于输出,目前的设计如何改进?