zoukankan      html  css  js  c++  java
  • Code Retreat总结

                                                Code Retreat总结

    概述:上一个周六,参加了一个由大连华信公司组织的Code Retreat活动,抱着去见识一下真实企业的想法,就报名参加了,活动很好,组织者很nice,总之收获了很多,算是我人生中第一次参加这样的程序员社区活动,现在就活动收获作如下总结。

    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
  • 相关阅读:
    Half Nice Years Gym
    LCM from 1 to n
    Educational Codeforces Round 70 (Rated for Div. 2)
    Rating(概率DP) HDU
    Josephina and RPG(概率DP) ZOJ
    数据结构实验之串二:字符串匹配(字符串哈希)
    点分治——入门学习笔记
    使用ASP.NET Core 3.x 构建 RESTful API P15 处理故障
    使用ASP.NET Core 3.x 构建 RESTful API P13 P14 获取父子关系的资源
    使用ASP.NET Core 3.x 构建 RESTful API P11 P12 ActionResult of T 以及 AutoMapper
  • 原文地址:https://www.cnblogs.com/Spground/p/8536163.html
Copyright © 2011-2022 走看看