wiki:codekata/harrypoter2

Version 3 (modified by chenyang, 13 years ago) (diff)

--

2013年8月16日代码道场活动纪实

代码道场的参与者:秦鸿源,陈阳,王安宁,丁健勇,李炳岳,黄志强,李剑文,张艺辉,江毅超, 李峰

地点:4G会议室
小组成员丁健勇,贡献了上次代码道场活动的总结:

好的: 成功在一次活动中各个组员都获得了写代码的时间,大家团结一致,也顺利完成了单元测试,再去编写代码,并最终完成了题目的需求
坏的: 导航员很多时候还是没有起到导航的作用。其他组员很多时候也没有用提问的方式,而是直接说出自己的思路和想法,有时候会影响了些代码的组员

这次代码道场活动,我们延续上次的活动,我们来实现扩展功能,

	扩展:
	单集购买5本,优惠7元。
	支持买6送1活动。
	支持购买100元送10活动。

我们定义了结帐接口

package cn.pconline.harrypotter;

import java.util.List;

public interface PriceCalculator {

	public int calculate(List<Book> list);
}


单集购买5本,优惠7元。方案2
测试代码

package cn.pconline.harrypotter;

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

import junit.framework.Assert;

import org.junit.Test;

/**
 * 测试"单集购买5本,优惠7元" 计价优惠方式
 * @author pc
 *
 */
public class DiscountCashierTest {

	
	DiscountCashier dc = new DiscountCashier();
	
	@Test
	public void testCalculate() {
		
		//单集不够5本,总数够5本
		List<Book> list = new ArrayList<Book>();
		Book book1 = new Book(BookType.one);
		Book book2 = new Book(BookType.two);
		Book book3 = new Book(BookType.three);
		Book book4 = new Book(BookType.four);
		Book book5 = new Book(BookType.five);
		
		list.add(book1);
		list.add(book2);
		list.add(book3);
		list.add(book4);
		list.add(book5);
		
		int price = dc.calculate(list);
		
		Assert.assertEquals(5 * 800, price);
		
		list = new ArrayList<Book>();
		
		//单集够5本,第一集够5本
		list.add(book1);
		list.add(book1);
		list.add(book1);
		list.add(book1);
		
		list.add(book1);
		list.add(book2);
		price = dc.calculate(list);
		
		Assert.assertEquals(6 * 800 - 700, price);
		
		//多集够5本,第二集够5本
		list.add(book2);
		list.add(book2);
		list.add(book2);
		list.add(book2);
		
		price = dc.calculate(list);
		
		Assert.assertEquals((10 * 800) - (2 * 700),
				price);
		
		// 第一集有10本,第二集5本
		list.add(book1);
		list.add(book1);
		list.add(book1);
		list.add(book1);
		list.add(book1);
		
		price = dc.calculate(list);
		
		Assert.assertEquals((15 * 800) - (3 * 700),
				price);
	}
}
	

实现代码

package cn.pconline.harrypotter;

import java.util.List;

public class DiscountCashier implements PriceCalculator {

	@Override
	public int calculate(List<Book> list) {
		//满足优惠的次数
		int count = 0;
		if(list == null){
			return 0;
		}else{
			if(list.size() >= 5){
				for(BookType type : BookType.values()){
					int num = 
							BookStore.getBookNumByType(type, list);
					if( num >= 5){
						count += num / 5;
					};
				}
				return (800 * list.size()) - (count * 700);
			}else{
				return 800 * list.size();
			}
		}
	}
}

送书活动,买7本送一本
测试代码

package cn.pconline.harrypotter;

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

import junit.framework.Assert;

import org.junit.Test;

public class SendBookActivityTest {
	SendBookActivity dc = new SendBookActivity();
	@Test
	public void testCalulate() throws Exception {
		//少于7本的情况
		List<Book> list = new ArrayList<Book>();
		Book book1 = new Book(BookType.one);
		Book book2 = new Book(BookType.two);
		list.add(book1);
		list.add(book1);
		list.add(book1);
		list.add(book1);
		list.add(book1);
		list.add(book2);
		
		int price = dc.calculate(list);
		Assert.assertEquals(6 * 800, price);
		
		//等于7本的情况
		list.add(book2);
		price = dc.calculate(list);
		Assert.assertEquals((7-1) * 800, price);
		
		//等于14本
		for(int i = 0 ; i < 7; i ++){
			list.add(book1);
		}
		
		price = dc.calculate(list);
		
		Assert.assertEquals((14 - 2) * 800,price);
		
	}
}
	

实现代码

package cn.pconline.harrypotter;

import java.util.List;

/**
 * 送书活动,买7本送一本
 * @author pc
 *
 */
public class SendBookActivity implements PriceCalculator{
	public int calculate(List<Book> list){
		
		int saveTimes = 0; //优惠的次数
		
		if(list == null ){
			return 0;
		}
		saveTimes += list.size()/7;
		return (list.size()-saveTimes) * 800; 
	}
}

买100减10(即90)
测试代码

package cn.pconline.harrypotter;

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

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

public class SendMoneyActivityTest {

	@Test
	public void testCalculate() {
		Book book = new Book(BookType.one);
		List<Book> books = new ArrayList<Book>();
		PriceCalculator pc = new SendMoneyActivity();
		// 不足100块
		books.add(book);
		books.add(book);
		int price =  pc.calculate(books);
		Assert.assertEquals( 800 * 2 , price);
		
		// 大于100块
		for(int i = 0 ;i < 11 ;i++){
			books.add(book);
		}
		price = pc.calculate(books);
		Assert.assertEquals( 800 * 13 - 1000 , price);
		
		// 200块以上
		for(int j = 0; j < 13; j++){
			books.add(book);
		}
		price = pc.calculate(books);
		Assert.assertEquals((800 * 26) - (20 * 100), price);
	}
}

实现代码

package cn.pconline.harrypotter;

import java.util.List;

/**
 * @author pc
 *	买100减10(即90)
 */
public class SendMoneyActivity implements PriceCalculator {

	@Override
	public int calculate(List<Book> list) {
		int price = 0;
		//List为空(没有书)
		if(list == null || list.isEmpty()){
			return price;
		}
		
		//List不为空(有书)
		int sumOfPrice = list.size() * 800; 
		price = sumOfPrice - (sumOfPrice / 10000) * 1000; 
		return price;
	}
}