在线有趣的Coding Dojo练习工具

今天用了一下Steven Mak推荐的网站:http://www.cyber-dojo.com/,实在是一个很有趣的在线Coding Dojo和Kata的练习工具。
Coding Dojo是一群开发人员聚在一起解决一个程序问题,是一个很好的团队学习过程。关于Coding Dojo活动的组织,Daniel Teng有一篇很好的介绍
Kata源自日语的招式,也是目前敏捷工程实践中比较热门的词汇,Code Kata是由Dave Thomas提出的。具体介绍可以猛击这里
Coding Dojo和Code Kata都是通过实际的编程练习来提升敏捷开发的技能。
cyber-dojo.com提供了一个在线的练习工具,使用起来很简单,首先创建一个自己的dojo名称,然后你可以让大家加入到这个dojo练习中。
目前它支持很多种开发语言的练习,包括c++/Java/Javascript等等,大家进入dojo以后可以选择自己的头像(主要是为了区分不同的人),选择练习题目(我选了一个LCD String),以及开发语言(我选了Java),就可以开始练习了。
cyber-dojo.com支持对开发语言和对应单元测试的编译和运行,并显示运行结果。
这里简单记录一下使用这个在线工作做一个“LCD String显示”的TDD Coding Dojo练习的过程,由于是一个人在测试,过程和团队一起做练习会存在不同,但主体上是一致的。

/*问题描述:
Your task is to create an LCD string representation of an integer
value using a 3x3 grid of space, underscore, and pipe characters
for each digit. Each digit is shown below (using a dot instead of
a space)

._.    ...    ._.    ._.    ...    ._.    ._.    ._.    ._.    ._.
|.|    ..|    ._|    ._|    |_|    |_.    |_.    ..|    |_|    |_|
|_|    ..|    |_.    ._|    ..|    ._|    |_|    ..|    |_|    ..|


Example: 910

._. ... ._.
|_| ..| |.|
..| ..| |_|
*/

第一步先写一个测试,我把系统默认添加的untitleTest.java改名为LCDStringTest.java, untitle.java改名为LCDString.java, 然后写下一个简单的测试:

import org.junit.*;
import static org.junit.Assert.*;
import java.util.List;

public class LCDStringTest 
{
    @Test
    public void testDisplay()
    {
        String[] str = {
            "._. ... ._.",
            "|_| ..| |.|",
            "..| ..| |_|"};
        LCDString lcdString = new LCDString();
        List strList = lcdString.display(910);
        for (int i = 0; i < 3; i++) {
            assertEquals(str[i], strList.get(i));
        }        
    }
}

运行,oh,当然由于没有实现LCDString.display,红灯报错。
现在开始编写功能代码:

import java.util.List;
import java.util.ArrayList;

public class LCDString
{

    public List display(int num)
    {
        List strList = new ArrayList();
        strList.add("._. ... ._.");
        strList.add("|_| ..| |.|");
        strList.add("..| ..| |_|");
        return strList;
    }
}

再运行,哈哈,绿灯通过。当然这个代码是硬编码,只要换个数字它就傻掉,
接下来就是重构了。

import java.util.List;
import java.util.ArrayList;

public class LCDString
{
    private String[][] lcdNums = {{"._.", "|.|", "|_|"},
				{"...", "..|", "..|"},
				{"._.", "._|", "|_."},
				{"._.", "._|", "._|"},
				{"...", "|_|", "..|"},
				{"._.", "|_.", "._|"},
		    		{"._.", "|_.", "|_|"},
				{"._.", "..|", "..|"},
				{"._.", "|_|", "|_|"},
				{"._.", "|_|", "..|"}};
   
    public List display(int num)
    {
        List strList = new ArrayList();
	char[] ca = String.valueOf(num).toCharArray();
	for (int line = 0; line < 3; line++) {
	    StringBuffer buf = new StringBuffer();
	    for (int i = 0;  i < ca.length; ) {
		int bit = ca[i] - '0';
		buf.append(lcdNums[bit][line]);
		if (++i < ca.length)
		    buf.append(' ');
	    }
	    strList.add(line, buf.toString());
	}
        return strList;
    }
}

再运行,oh yeah,顺利通过。
当然这个解决方案不是很优雅,可以更加高效的实现方式,也可以继续重构抽取for循环形成新的函数方法,还需要增加测试用例以检验在不同情况下LCDString的处理是否都能够正确。这里就不再一一赘述。

总的来说:cyber-dojo.com是一个有趣易用的在线Coding Dojo练习工具。

发表评论

电子邮件地址不会被公开。 必填项已用*标注