CodeKata
即编程练习,Dave Thomas已经创造了21个Kata,我们可以在他的博客上使用:
http://codekata.com/
Kata1 超市定价
超市中的商品,有些容易定价,比如:一罐豆子定价$0.65.但是其他商品可能更加复杂,比如:
- 三个一美元(如果买4,或5个呢?)
- $1.99每磅 (4盎司要花多少呢?)
- 买二赠一 (那么第三个商品有没有价格?)
我们需要考虑的问题:
- 1.小数位的价格是否存在?
- 2.取整的情况什么时候发生?
- 3.如何保持审计跟踪你的定价决策?(how do you keep an audit trail of pricing decisions (and do you need to)? )
- 4.花费 costs 和定价 prices 是一回事儿么?
- 5.如果货架上有100罐商品是买二送一的,如何定价这些商品?(if a shelf of 100 cans is priced using “buy two, get one free”, how do you value the stock?)
练习目的:
针对这个松散的实验模型进行练习。找到尽量多的解决方法。考虑每个问题的多种权衡方案。
一种答案:
定价模型具有商品类 和 订单类。
商品具有两个属性 价格 和 优惠策略。
优惠策略,满减,满赠等:
//优惠策略1
if totalPrice>=X //满X元减Y元
total_price -= Y;
//优惠策略2
if totalNumber>=n //满n个减Z元
{//购买商品数大于n,每n个商品优惠x元。如商品A定价34美分,三个商品A优惠价为1美元,也就是每三个A优惠2美分。
Z = x*floor(totalNumber/n);
total_price -= Z;
}
//优惠策略3
if totalNumber>=n //满n个赠m个
{//购买商品数大于n, 赠送m个
totalNumber+= m;
}
- 不存在小数位的价格。价格最小单位一般为美分,以美元为单位,小数点后两位。采用美分为计量单位,即可用整型变量表示价格,可避免计算机某些语言小数计算出现的问题。
- 没有取整的情况。如果某三个一美元(如果买4,或5个)的一种方案,定价为
C++
price = ceil(100/3);//34美分
优惠策略采用上文,策略2。 - 维护一个订单类,包括商品,购买数量和优惠策略。
- 商品花费和定价不同。定价是商品的属性,花费是价格应用优惠策略的产物。
- 100罐商品A应用买2赠1的优惠策略。那么商品A的定价规则为:
C++
//单个商品成本价
costPrice = X;
//最低价,当定价大于bottomPrice时,才能保证盈利。
bottomPrice =(costPrice*100)(99*2/3+1);