Code Retreat总结
1.接触到测试的概念
JUnit测试工具, 的确很有意思,在敲完一些东西后, 自己写几个Test Case测试下自己的代码后, 再继续向前敲, 这给人一种比较踏实的感觉。
2.TDD(Test Drive Development)测试驱动开发
指导老师着重介绍了这种编程方式, 这个方式就是:在没有完成实际的代码开发的时候,先将问题的大致框架(本质的那几个步骤)想明白,然后写出对应的测试方法和测试用例,然后再由这些测试方法,去驱动开发完善对应的实际的代码,当完成一个实际代码并且通过测试以后,再继续完成后续的实际的代码。这种思想和以前的思想是截然相反的。
个人理解是,当采用这种方式编程去解决一个特定问题的时候,先写出测试方法和测试用例,会让你不会纠结于细节,是站着一个较高、较抽象的层面上去看这个问题(当然你需要是深入理解这个问题后,确定一些无论如何都绕不开的方法或者步骤,这些方法就该是你测试方法)。当你写完测试方法以后,那么此时你就需要对于每一个实际的方法,去纠结它的细节了,是用什么样的算法,什么样的数据结构等等,总之你最后能够完成这个实际方法并且通过测试即可,在完成这个实际方法的时候,你不用去考虑其他的方法是细节了,因为你知道其他的方法的代码肯定是正确的的,因为他们是严格测试过并且符合你的大体框架。
3.生命游戏 Game of Life
这是活动中的题目,这个是英国数学家康威提出来的,具体介绍有维基百科。https://en.wikipedia.org/wiki/Conway's_Game_of_Life
以下是LifeGame类的代码,这个问题就是按照TDD的编程方式一步一步写出来的,先写出了两个测试方法,然后对应的去实现细节。
public class LifeGame { private static int[][] life; public LifeGame(int[][] originLife){ this.life = originLife; Log.v("===TAG life===", life.toString()); } public int[][] getNextGenLife(int[][] oldGenLife){ this.life = oldGenLife; int[][] nextGen = new int[this.life.length][this.life[0].length]; for(int i = 0; i < life.length; i++) for(int j = 0; j < life[i].length; j++ ) nextGen[i][j] = getNextGenStatus(i + 1, j + 1); return nextGen; } /** * * @param x cell's row index (range 1 to r) * @param y cell's clomun index (range 1 to c) * @return the next status of the cell */ private final int getNextGenStatus(int x, int y){ //no life living off the edge if((y == 1) || (y == life[0].length) || (x == 1 || x == life.length )) return 0; int neighborNums = getLivingNeighborNums(x, y); //rule if(neighborNums < 2 || neighborNums > 3 ) return 0; if(neighborNums == 3) return 1; return life[x - 1][y - 1]; } /** * get the number of living neighbor by giving x, y * @param x :the row index * @param y : the column index * @return the number of living neighbor */ private final int getLivingNeighborNums(int x, int y){ int cnt = 0; int[][] dir = {{-1,-1}, {-1,0}, {-1,1}, {1,-1}, {1,0}, {1,1},{0,-1}, {0,1}}; for(int i = 0; i < 8; i++){ int xx = dir[i][0] + x - 1; int yy = dir[i][1] + y - 1; cnt += life[xx][yy]; } return cnt; } }
这里是关于这个问题的一个 Android Demo https://github.com/Spground/GameOfLife