ThoughtWorks 2018校招作业
ThoughtWorks 2018校园招聘作业题目——出租车
本文描述家庭作业中部分模块的功能,以及项目正确性判断
家庭作业部分
模块划分
- Main主函数,负责输入输出,以及程序顺序调节
- vo包,提供Car对象的封装,Car对象封装了汽车相关信息,以及提供相关属性的构造器
- Check包,提供Car的检查,并且生成报表
- Processor包,提供汽车处理函数,能够采用链式表达式方式进行处理
- Result包,提供结果输出功能
- Utils包,工具类,主要是时间的处理方法
详细功能
主函数采取用户输入方式获得汽车信息,并将汽车信息封装为Car对象后交由Processor对象处理,下面是处理函数
while(true) {try {Car.setSubmitDate(df.parse(submit));break;} catch (ParseException e) {System.out.println("input error,the submit date has wrong format.");submit = sc.nextLine().substring(submitPrefix.length());}
}
CarProcessor carProcessor = new CarProcessor();
while(sc.hasNextLine()){Car car = new Car();String line = sc.nextLine();if(line.equals("EOF"))break;String[] carInfo = line.split("\\|");car.setBrand(carInfo[2]);car.setPlateNumber(carInfo[0]);car.setOverhauled(carInfo[4].trim().equals("T"));try {car.setMiles(Integer.parseInt(carInfo[3]));car.setPurchaseDate(df.parse(carInfo[1]));}catch (NumberFormatException e){System.out.println("input car miles format wrong");}catch (ParseException e){System.out.println("input car purchase date wrong");}carProcessor.setCar(car);
}
Checker包主要提供三个方法
第一个方法:
List<Car> getRemainCars();
此方法能够获得经过该checker处理后的car列表,如果没有设置checker的属性remove为NOT_REMOVE,那么该方法将会返回当初set的值,如果设置remove为REMOVE,那么将会返回处理结束的剩余Car列表
第二个方法
IResultHandler getResult();
此方法能够获得经过该Checker处理后,得到的Result
第三个方法:
void setCars(List cars);
设置汽车list,方便处理
processor包提供流程处理
private List<Car> cars;private IChecker checker;private List<IResultHandler> resultHandler = new ArrayList<>();
其中保存了流程中的checker以及car的列表
在主函数中通过如下形式进行顺序处理,此种方式方便进行顺序的修改,通过不同的顺序来达到不同的生成结果
/*** 进行处理*/carProcessor.writeOffCheck().distanceMaintenCheck().timeMaintenCheck().generateReport();
Result包中主要提供生成报告的方法
/*** this function will generate a result report according to the car list set in*/void generateResult();/*** car need to generate report* @param cars*/void setCars(List<Car> cars);/*** 获取排序优先级* @return*/int getSort();
DateUtils提供对于日期的处理
public class DateUtils {public static int getYears(Car car){Calendar purchase = getPurchaseCalendar(car);Calendar submit = getSubmitCalendar();return submit.get(Calendar.YEAR) - purchase.get(Calendar.YEAR);}public static int getMonth(Car car){int years = getYears(car);Calendar purchase = getPurchaseCalendar(car);Calendar submit = getSubmitCalendar();return years * 12 + submit.get(Calendar.MONTH) - purchase.get(Calendar.MONTH);}public static Calendar getPurchaseCalendar(Car car){Calendar.Builder cb = new Calendar.Builder();cb.setInstant(car.getPurchaseDate());return cb.build();}public static Calendar getSubmitCalendar(){Calendar.Builder cb = new Calendar.Builder();cb.setInstant(Car.getSubmitDate());return cb.build();}}
程序测试
处理程序输入,测试用例以EOF作为最后的输入结束标志:
测试用例1:
输入:
SubmitDate: 2050/05/01
CAR0001|2044/05/01|Volkswagen|65535|F
CAR0002|2044/05/03|BMW|100001|F
CAR0003|2047/05/02|Mercedes-Benz|37789|T
CAR0004|2047/05/03|Honda|59908|T
CAR0005|2049/12/10|Peugeot|49999|F
CAR0006|2046/11/15|Jeep|2000|F
CAR0007|2046/11/16|Jeep|5000|F
EOF
输出结果:
Reminder
==================* Time-related maintenance coming soon...
Audi: 1 (CAR0006)
Porsche: 1 (CAR0002)* Distance-related maintenance coming soon...
BYD: 1 (CAR0005)
Ford: 1 (CAR0007)
Porsche: 1 (CAR0001)* Write-off coming soon...
BYD: 1 (CAR0004)
Ford: 1 (CAR0009)
测试与预期完全一致
本次测试覆盖率:
Checker:
Result:
结论:
- Checker中覆盖率,checker工厂方法完全覆盖,除了部分getter与setter以及默认构造器,因此认为工厂方法测试通过。
Checker中报废checker完全通过,距离checker完全覆盖,时间保养checker覆盖率较低,未覆盖代码:
也就是车辆保养日期恰好位于保修日期相同月份尚未测试Result覆盖率100%通过,因此测试通过
测试用例2:
输入:
SubmitDate: 2050/05/01
CAR0001|2044/05/01|Volkswagen|65535|F
CAR0002|2044/05/03|BMW|100001|F
CAR0003|2047/05/02|Mercedes-Benz|37789|T
CAR0004|2047/05/03|Honda|59908|T
CAR0005|2049/12/10|Peugeot|49999|F
CAR0006|2046/11/15|Jeep|2000|F
CAR0007|2046/11/16|Jeep|5000|F
EOF
输出:
Reminder
==================* Time-related maintenance coming soon...
Jeep: 2 (CAR0007,CAR0006)* Distance-related maintenance coming soon...
Peugeot: 1 (CAR0005)* Write-off coming soon...
BMW: 1 (CAR0002)
Honda: 1 (CAR0004)
与预期结果完全一致
本次测试覆盖率:
Checker
Result
结论:
- 本次测试,覆盖了测试用例1中未经过测试的代码,所有代码覆盖率达到100%,同时输出结果与预期完全一致,判断作业正确
ThoughtWorks 2018校招作业相关推荐
- 2018校招笔试真题汇总(javaC++)
科大讯飞: 2018秋招笔试科大讯飞java笔试试题 https://www.nowcoder.com/discuss/67684?type=2&order=3&pos=13& ...
- 2018校招笔试真题汇总(java/C++)
科大讯飞: 2018秋招笔试科大讯飞java笔试试题 https://www.nowcoder.com/discuss/67684?type=2&order=3&pos=13& ...
- c语言 抽奖算法,腾讯2018校招笔试!抽奖算法思路c++实现!进入鹅厂真的简单!...
进腾讯一般有3次面试:第一面看基本素质,第二面看专业技能,第三面是boss决策,说在前面的话:牛人都是爱学习的,越是成功的人学习越是频繁.在那次商业写作课上,我遇到了那位腾讯资深面试官. 背景 小伙伴 ...
- 哔哩哔哩2018校招前端笔试
前言 前几日,哔哩哔哩在电子科大清水河校区举行了校招宣讲会.B站不用多说,中国最大的同性交友网站,不去工作也能去看看. 当晚便进行了部分笔试,下面是我参加的前端笔试试题和我自己的解答,分享给大家. 博 ...
- C++构造函数与类型转换explicit(大疆2018校招软件组考点之一)
类的构造函数是用于类成员变量的初始化,由编译器隐式调用. 1.默认构造函数 假设我们定义一个类的名字叫Student,成员变量有int age和char* name. 1.1.定义默认构造函数 注意: ...
- 【牛客】网易2018校招数据分析师笔试解析
[牛客]网易2018校招数据分析师笔试解析 * 选择题根据牛客网下方讨论整理,三道大题均为自己答案,欢迎大家讨论并给予指正. (https://www.nowcoder.com/test/107788 ...
- 数据分析真题日刷 | 网易2018校招数据分析师笔试卷
今日真题 网易2018校招数据分析师笔试卷(来源:牛客网) 题型 客观题:单选20道 主观题:问答1道,编程2道 完成时间 120分钟 牛客网评估难度系数 3颗星 ❤️ 「更多数据分析真题」 < ...
- 今日头条2018校招测试开发方向(第一、二、三、四批)编程题汇总 - 题解
对于今日头条这家公司来说,测试的题和后端开发的题几乎是一样的,但是由于第一批的后端开发的题没有在牛客网上放出来,因此,猜测后端开发第一批的题应该和后端开发第一批的题一样,同时也想做一个测试方向编程题的 ...
- 魔法币 java_网易2018校招笔试编程题-魔法币 java实现
魔法币 原题 小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币. 魔法机器1:如果投 ...
- 牛客网 2018校招真题 美团点评 K的倍数
Description 牛客网 2018校招真题 K的倍数 Solving Ideas sum[i + 1]: 表示序列p[0]...p[i]的和 从长度最大的子串开始判断,当剩余需要判断子串长度不可 ...
最新文章
- 整合大数据价值最大化的三个关键因素
- maven setting.xml配置说明
- UWP使用AppService向另一个UWP客户端应用程序提供服务
- 32行代码AC——L1-027 出租 (20分)(~解题报告~)
- pytorch 之 imagefloder的用法
- Genomic characterization of metastatic breast cancers 转移性乳腺癌的基因组特征
- 用友U9 SOA Ready
- 虚拟机使用主机摄像头 ” usb chicony lenovo easycamera 连接失败,驱动错误“
- 人人都知“双十一”,几人仍记“光棍节”
- [ffmpeg][vaapi][goav][golang] ffmpeg使用vaapi示例代码(基于goav-incr)
- SQL中is not null和!=“ “的区别
- Android Dialog设置宽度显示不正常的问题(自定义设置Dialog的宽高)
- 哪些语句在python中非法_下列语句中,在Python中是非法的
- 速写在网站建设中的重要地位
- css和html的用法,HTML与CSS之CSS的基本使用
- 详解C语言中的switch语句
- Luogu 3371【模板】单源最短路径
- 由七芒星引出来的——关于142857
- 用HALL 库配置GPIO以及相关寄存器
- 【最新】Xcode 8 打包教程