Coding道场:第一次

String strText = "910"; String strTextResult = "._.|_|..|.....|..|._.|.||_|";String strOutput = digitalSegment.DisplaySegmentDigital(strText);assertEquals(strOutput , strTextResult);
public String DisplaySegmentDigital(String strText) {return "._.|_|..|.....|..|._.|.||_|";}
String strText = "3456"; String strTextResult = "????????";
问题接着出来了:这串问号该填什么?这样测试真的有意义么?几乎所有的人都直觉得发现这里有问题。简短的讨论后,结论是应该测试每个数字的显示,而非一个字符串。于是,测试变为:
String strText = "9"; String strTextResult = "._.|_|..|";
String strOutput = digitalSegment.DisplaySegmentDigital(strText);
assertEquals(strOutput , strTextResult);
实现变为:
public String DisplaySegmentDigital(String strText) {
if(strText == "9")
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可能更好。
好了,有关第一次道场就写到这里,留一个小小的问题:到目前为止我们还没有设计显示的算法。为了便于输出,目前的设计如何改进?
Coding道场:第一次的更多相关文章
- Python全栈开发:冒泡排序
#!/usr/bin/env python # -*- coding;utf-8 -*- """ 第一次对比:找到最大值,放到最后 对比是两两对比,对比的两个数组合共有l ...
- 软件工程 Coding.net代码托管平台 Git初学者的使用总结 五步完成 程序,文件,文件夹的Git
一.前言 第一次用git相关的命令行,我使用的是Coding.net代码托管平台.Coding.net 自主打造的基于 Git 的代码托管平台,提供高性能的远端仓库,还有保护分支,历史版本分屏对比. ...
- Coding 及 git 的工程使用方法
在过去的两周,同学们除了在学习 C 语言之外,还在学习如何利用 git 将自己的代码上传到 coding 中.也有大量的同学,成功的上传了代码.但是,实际上大部分同学的用法都不合理.这里,以一 ...
- C 语言学习 第一次作业总结
第一次的作业是冯老师布置的练习题,需要在pta平台上完成.我这边看不到结果,但是透过冯老师给出的截图,同学们都还是认真的去做的.同时,我这边也布置了一个持续 3 周的作业:熟悉 git 的使用.因为后 ...
- Coding编译连接过程中遇到的问题及解决方法(iOS)
Coding 上下载地址:https://coding.net/u/coding/p/Coding-iOS/git Github源码下载地址:https://github.com/Coding/Cod ...
- Coding源码学习第三部分(EaseStartView.m)
首先接上篇的要做一个NSEnumerator 类的延展阅读. 枚举(NSEnumerator) (1)依附于集合类(NSArray,NSSet,NSDictionary),没有用来创建实例的接口. ( ...
- Coding源码学习第一部分(AppDelegate.m)
前言:在此首先感谢开源,感谢大神们的无私分享. Coding 的主页:https://coding.net/app#app-feature Coding 自己家的仓库:https://coding.n ...
- 使用VS2010在Coding.net上进行代码托管
网上有VS2010和Github结合使用办法,但是Github在国内使用太慢,本文使用相同的配置方法稍作改动让VS2010代码托管在coding.net平台上.由于只是稍做记录让自己不会遗忘,所以叙述 ...
- Coding Kata - 挑战你的“底线”
Coding Kata简介 如何进行Kata练习 亲身感受 Coding Kata简介 前段时间听到一个比较有意思的概念叫做Coding Kata,今天试了一下来说说一些想法和思考.Kata是一个日语 ...
随机推荐
- ASP.NET Web API 异常日志记录
如果在 ASP.NET MVC 应用程序中记录异常信息,我们只需要在 Global.asax 的 Application_Error 中添加代码就可以了,比如: public class MvcApp ...
- Lua 学习笔记(十)数据结构
在Lua中的table不是一种简单的数据结构,它可以作为其他数据结构的基础.其他语言提供的数据结构,如数组.记录.线性表.队列.集合等,在Lua中都可以通过table来表示.而且使用Lua实现这些数据 ...
- 重温JSP学习笔记--El表达式
el表达式是jsp内置的表达式语言,jsp从jsp2.0开始,就不再提倡使用java脚本,而是用el表达式和动态标签来替代,而el表达式主要替代的是jsp中的<%=....%>,也就是说e ...
- iOS_MJRefrash的详解以及使用
MJRefresh Github 效果动态图来这里看吧 该博客Demo下载地址 一. MJRefresh的类解释. 1.MJRefreshComponent 所有刷新控件的基 ...
- 求一个数组的最大子数组(C/C++实现)
最大子数组:要求相连,加起来的和最大的子数组就是一个数组的最大子数组.编译环境:VS2012,顺便说句其实我是C#程序员,我只是喜欢学C++. 其实这是个半成品,还有些BUG在里面,不过总体的思路是这 ...
- 实战 ASP.NET Web API
Web API 框架是一个面向 Http 协议的通信框架.相对于 WCF 而言,Web API 只面向于 Http 协议设计,而且没有 WCF 那么繁琐的配置.Web API 的开发类似于 ASP.N ...
- jQuery动画
一.显示和隐藏 hide().show() 1.show():显示被选的元素 2.hide():隐藏被选的元素 3.toggle():对被选元素进行隐藏和显示的切换 语法: $(selector).h ...
- CSS画猪
效果查看:http://hovertree.com/texiao/css3/6/ CSS3画猪头: http://hovertree.com/texiao/css3/6/1/ 代码如下: <!D ...
- 谈一谈SQL Server中的执行计划缓存(下)
简介 在上篇文章中我们谈到了查询优化器和执行计划缓存的关系,以及其二者之间的冲突.本篇文章中,我们会主要阐述执行计划缓存常见的问题以及一些解决办法. 将执行缓存考虑在内时的流程 上篇文章中提到了查询优 ...
- 编译可供C#调用的C/C++动态链接库dll文件
编译可供C#调用的C/C++动态链接库dll文件,C语言控制台应用程序,探索生成dll过程 由于项目需求,需要公司另一个团队提供相关算法支持,是用C语言编译好的dll库提供给我们进行调用. 但是拿到d ...