表驱动法实例

获得月的天数是典型的直接访问驱动表方式的实例,下面我们来展示一下:

MonthDaysTest.java

package com.study.test;

import org.junit.Assert;
import org.junit.Test;

import com.study.MonthDays;

public class MonthDaysTest {

	@Test
	public void test_when_given_month_number_return_month_days() {
		MonthDays monthDays = new MonthDays();
		Assert.assertEquals(31, monthDays.getTotalDayInMonth(1));
		Assert.assertEquals(28, monthDays.getTotalDayInMonth(2));
		Assert.assertEquals(31, monthDays.getTotalDayInMonth(3));
		Assert.assertEquals(30, monthDays.getTotalDayInMonth(4));
		Assert.assertEquals(31, monthDays.getTotalDayInMonth(5));
		Assert.assertEquals(30, monthDays.getTotalDayInMonth(6));
		Assert.assertEquals(31, monthDays.getTotalDayInMonth(7));
		Assert.assertEquals(31, monthDays.getTotalDayInMonth(8));
		Assert.assertEquals(30, monthDays.getTotalDayInMonth(9));
		Assert.assertEquals(31, monthDays.getTotalDayInMonth(10));
		Assert.assertEquals(30, monthDays.getTotalDayInMonth(11));
		Assert.assertEquals(31, monthDays.getTotalDayInMonth(12));
	}
	
	@Test
	public void test_when_given_month_number_return_month_days_by_table() {
		MonthDays monthDays = new MonthDays();
		Assert.assertEquals(31, monthDays.getTotalDayInMonthFromTable(1));
		Assert.assertEquals(28, monthDays.getTotalDayInMonthFromTable(2));
		Assert.assertEquals(31, monthDays.getTotalDayInMonthFromTable(3));
		Assert.assertEquals(30, monthDays.getTotalDayInMonthFromTable(4));
		Assert.assertEquals(31, monthDays.getTotalDayInMonthFromTable(5));
		Assert.assertEquals(30, monthDays.getTotalDayInMonthFromTable(6));
		Assert.assertEquals(31, monthDays.getTotalDayInMonthFromTable(7));
		Assert.assertEquals(31, monthDays.getTotalDayInMonthFromTable(8));
		Assert.assertEquals(30, monthDays.getTotalDayInMonthFromTable(9));
		Assert.assertEquals(31, monthDays.getTotalDayInMonthFromTable(10));
		Assert.assertEquals(30, monthDays.getTotalDayInMonthFromTable(11));
		Assert.assertEquals(31, monthDays.getTotalDayInMonthFromTable(12));
	}
}

MonthDays.java

package com.study;

public class MonthDays {

	/*
	 * if...else..
	 *  获得某一月中的总天数,monthIndex从 1 开始
	 */
	public int getTotalDayInMonth(int month) {
		int totalDay = 0;
		if (month == 2) {
			totalDay = 28;
		} else if (month == 4 || month == 6 || month == 9 || month == 11) {
			totalDay = 30;
		} else {
			totalDay = 31;
		}
		return totalDay;
	}
	
	private int[] totalDayTable = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

	/*
	 * 表驱动法
	 * 获得某一月中的总天数,monthIndex从 1 开始
	 */
	public int getTotalDayInMonthFromTable(int month) {
		return totalDayTable[month - 1];
	}
}

 

附采用表驱动法对实际代码进行重构实例:

package com.bijian.study;

import java.util.HashMap;
import java.util.Map;

public class TableMethod {

	public void process(String state) {
		String needState;
		String needChangeResult;
		
		//原来的写法
		if("COMPIETED".equals(state)) {
			needState = "COMPIETED";
			needChangeResult = "APPROVE_OK";
		}else if("REJECTED".equals(state)) {
			needState = "NEW";
			needChangeResult = "APPROVE_FAIL";
		}else if("ABANDON".equals(state)) {
			needState = "NEW";
			needChangeResult = "APPROVE_FAIL";
		}
		
		//表驱动法
		Map<String, String[]> stateTable = new HashMap();
		stateTable.put("COMPIETED", new String[]{"COMPIETED", "APPROVE_OK"});
		stateTable.put("REJECTED", new String[]{"NEW", "APPROVE_FAIL"});
		stateTable.put("ABANDON", new String[]{"NEW", "APPROVE_FAIL"});
		needState = stateTable.get(state)[0];
		needChangeResult = stateTable.get(state)[1];
	}
}

你可能感兴趣的:(java,表驱动法,TDD)