多层If语句 和 表格驱动 的对比
网文提到表格驱动,总喜欢拿一层if做例子,然而这样未免也太简单.
下文是三层缩进的if和表驱动比较,大家可自行判断优劣.
业务是这样的,某景点分旺季票价和淡季票价,淡季票为旺季的一半,15岁以下孩子再减半,60岁以上老人再三三折,成人中有军官证的再打二五折,有士兵证的打两折.(假定非实际业务,勿对号入座)
代码:
package tabledriven;
/**
* 门票计价器
* 传统方式和表格驱动比较
*
*/
public class TicketCalculater {
// Price
private double price=144;
// discout array
private int[][][] arr= {
{
{2*4,2*5,2*1},
{2*2,2*2,2*2},
{2*3,2*3,2*3},
},
{
{1*4,1*5,1*1},
{1*2,1*2,1*2},
{1*3,1*3,1*3},
},
};
// Traditional
public double getPriceTraditional(int month,Person person) {
double discount=1;
if(6<month && month<11) {
discount*=1;
if(person.getAge()<15) {
discount*=0.5;
}else if(person.getAge()>60) {
discount*=0.33333333333333;
}else {
if(person.isOfficer()) {
discount*=0.25;
}else if(person.isSoldier()) {
discount*=0.20;
}
}
}else {
discount*=0.5;
if(person.getAge()<15) {
discount*=0.5;
}else if(person.getAge()>60) {
discount*=0.333333333333333;
}else {
if(person.isOfficer()) {
discount*=0.25;
}else if(person.isSoldier()) {
discount*=0.20;
}
}
}
return price*discount;
}
// Table driven
public double getPriceTableDriven(int month,Person person) {
double discount=1;
int index1,index2,index3;
if(6<month && month<11) {
index1=1;
}else {
index1=0;
}
if(person.getAge()<15) {
index2=1;
}else if(person.getAge()>60) {
index2=2;
}else {
index2=0;
}
if(person.isOfficer()) {
index3=0;
}else if(person.isSoldier()) {
index3=1;
}else {
index3=2;
}
discount=arr[index1][index2][index3];
return price/discount;
}
// Entry point
public static void main(String[] args) {
TicketCalculater tc=new TicketCalculater();
Person p1=new Person(30,false,false);
System.out.println("Ticket price="+round2DecimalPlaces(tc.getPriceTraditional(2, p1)));
System.out.println("Ticket price(Table)="+round2DecimalPlaces(tc.getPriceTableDriven(2, p1)));
Person p2=new Person(14,false,false);
System.out.println("Ticket price="+round2DecimalPlaces(tc.getPriceTraditional(5, p2)));
System.out.println("Ticket price(Table)="+round2DecimalPlaces(tc.getPriceTableDriven(5, p2)));
Person p3=new Person(44,true,false);
System.out.println("Ticket price="+round2DecimalPlaces(tc.getPriceTraditional(8, p3)));
System.out.println("Ticket price(Table)="+round2DecimalPlaces(tc.getPriceTableDriven(8, p3)));
Person p4=new Person(68,false,true);
System.out.println("Ticket price="+round2DecimalPlaces(tc.getPriceTraditional(11, p4)));
System.out.println("Ticket price(Table)="+round2DecimalPlaces(tc.getPriceTableDriven(11, p4)));
}
// round two decimal places of a double
public static String round2DecimalPlaces(double d){
java.text.DecimalFormat df =new java.text.DecimalFormat("#0.00");
return df.format(d);
}
}
Person类:
package tabledriven;
public class Person {
private int age;
private boolean isOfficer;
private boolean isSoldier;
public Person(int age,boolean isOfficer,boolean isSoldier) {
this.age=age;
this.isOfficer=isOfficer;
this.isSoldier=isSoldier;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isOfficer() {
return isOfficer;
}
public void setOfficer(boolean isOfficer) {
this.isOfficer = isOfficer;
}
public boolean isSoldier() {
return isSoldier;
}
public void setSoldier(boolean isSoldier) {
this.isSoldier = isSoldier;
}
}
运行结果:
Ticket price=72.00 Ticket price(Table)=72.00 Ticket price=36.00 Ticket price(Table)=36.00 Ticket price=36.00 Ticket price(Table)=36.00 Ticket price=24.00 Ticket price(Table)=24.00
--END-- 2019-12-11 14:01
多层If语句 和 表格驱动 的对比的更多相关文章
- Linux与Windows的设备驱动模型对比
Linux与Windows的设备驱动模型对比 名词缩写: API 应用程序接口(Application Program Interface ) ABI 应用系统二进制接口(Application Bi ...
- JS010. 三元运算符扩展运用(多层判断语句 / 多条表达式)
MDN - 三元运算符 语法 Condition ? exprIfTrue : exprIfFalse 用例: function getFee(isMember) { return(isMember ...
- 任务驱动,对比式学习.NET开发系列之开篇------开源2个小框架(一个Winform框架,一个Web框架)
一 源码位置 1. Winform框架 2. web框架 二 高效学习编程的办法 1 任务驱动方式学习软件开发 大部分人学习软件开发技术是通过看书,看视频,听老师上课的方式.这些方式有一个共同点即按知 ...
- 4 - SQL Server 2008 之 使用SQL语句删除表格
使用删除表格的SQL命令与删除数据的命令一样,只是删除的是表格这个对象, 语法如下:DROP TABLE 表名 一般在删除表格之前,需判断这个表格存不存在,存在则删除,不存在则不进行执行任何代码. 代 ...
- golang的表格驱动测试
一.leetcode的算法题 package main import ( "fmt" "strings" ) func lengthOfNonRepeating ...
- [转帖]Docker五种存储驱动原理及应用场景和性能测试对比
Docker五种存储驱动原理及应用场景和性能测试对比 来源:http://dockone.io/article/1513 作者: 陈爱珍 布道师@七牛云 Docker最开始采用AUFS作为文件系统 ...
- python init 方法 与 sql语句当前时间对比
def init(self,cr): tools.sql.drop_view_if_exists(cr, 'custrom_product_infomation_report') cr.execute ...
- Docker存储驱动之OverlayFS简介
简介 OverlayFS是一种和AUFS很类似的文件系统,与AUFS相比,OverlayFS有以下特性: 1) 更简单地设计: 2) 从3.18开始,就进入了Linux内核主线: 3) 可能更快一些. ...
- python中if语句和循环语句
//2019.12.05 python循环控制结构(一)控制循环结构 1-1 程序的判断语句与组合1.对于python的控制结构主要有以下三大类:(1)分支结构(2)循环结构(3)异常处理 2.pyt ...
随机推荐
- Java 十大排序算法
目录: 1.冒泡排序(Bubble Sort) 2.选择排序(Selection Sort) 3.插入排序(Insertion Sort) 4.希尔排序(Shell Sort) 5.归并排序(Merg ...
- Redis锁机制的几种实现方式
1. redis加锁分类 redis能用的的加锁命令分表是INCR.SETNX.SET 2. 第一种锁命令INCR 这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执 ...
- Jmeter4.0 _Beanshell解析并获取json响应数据数组长度
我们在做jmeter接口测试的时候,有时候碰到开发没返回数据total,只返回了一条条记录,可是呢,我们又需要知道到底返回了多少条数据时,咋办呢?咋办呢?咋办呢? 不要急,接下来,让我们见证奇迹是如何 ...
- 什么是好的产品——Diet Rams的十大设计原则
博朗(BRAUN)的首席设计师Diet Rams的十大设计原则 第一条,好的产品是有创意的,它必须是一个创新的东西: 第二条,好的产品是有用的,一定要对人有用: 第三条,好的产品是优美的,它必须有美感 ...
- Dubbo源码分析(1):Spring集成Dubbo
spring与dubbo事件 类图
- C++类中构造函数调用构造函数问题
环境:xp+vs2010问题:在初始化类参数的过程中,可能需要多个重载的构造函数,但是有很多变量初始化代码又是一样的.肯定需要写一次,等待其他构造函数来调用即可.经过调试发现,在classA(int ...
- Flume源码更改
1.源码更改场景:如果使用 0.8 版本 Kafka 并配套 1.6 版本 Flume,由于 Flume 1.6 版本没有Taildir Source 组件,因此,需要将 Flume 1.7 中的 T ...
- elasticsearch7.x集群安装(含head、bigdesk、kibana插件)
网址:https://www.elastic.co 192.168.14.239 es-node1192.168.14.240 es-node2192.168.14.241 es-node3 ==== ...
- C++中unique函数的用法总结
个人感觉,unique是STL中很实用的函数之一,需要#include,下面来简单介绍一下它的作用. unique的作用是"去掉"容器中相邻元素的重复元素,这里去掉要加一个引号,为 ...
- 【CPLEX教程01】Cplex介绍,下载和安装Cplex
前言 最近学习列生成算法,需要用到优化求解器.所以打算学习一下cplex这个商业求解器. 当然也有其他更多的选择,这里暂时以比较容易上手和性能比较好的cplex开始吧.其实,小编也早就想学习使用这个c ...