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校招作业相关推荐

  1. 2018校招笔试真题汇总(javaC++)

    科大讯飞: 2018秋招笔试科大讯飞java笔试试题 https://www.nowcoder.com/discuss/67684?type=2&order=3&pos=13& ...

  2. 2018校招笔试真题汇总(java/C++)

    科大讯飞: 2018秋招笔试科大讯飞java笔试试题 https://www.nowcoder.com/discuss/67684?type=2&order=3&pos=13& ...

  3. c语言 抽奖算法,腾讯2018校招笔试!抽奖算法思路c++实现!进入鹅厂真的简单!...

    进腾讯一般有3次面试:第一面看基本素质,第二面看专业技能,第三面是boss决策,说在前面的话:牛人都是爱学习的,越是成功的人学习越是频繁.在那次商业写作课上,我遇到了那位腾讯资深面试官. 背景 小伙伴 ...

  4. 哔哩哔哩2018校招前端笔试

    前言 前几日,哔哩哔哩在电子科大清水河校区举行了校招宣讲会.B站不用多说,中国最大的同性交友网站,不去工作也能去看看. 当晚便进行了部分笔试,下面是我参加的前端笔试试题和我自己的解答,分享给大家. 博 ...

  5. C++构造函数与类型转换explicit(大疆2018校招软件组考点之一)

    类的构造函数是用于类成员变量的初始化,由编译器隐式调用. 1.默认构造函数 假设我们定义一个类的名字叫Student,成员变量有int age和char* name. 1.1.定义默认构造函数 注意: ...

  6. 【牛客】网易2018校招数据分析师笔试解析

    [牛客]网易2018校招数据分析师笔试解析 * 选择题根据牛客网下方讨论整理,三道大题均为自己答案,欢迎大家讨论并给予指正. (https://www.nowcoder.com/test/107788 ...

  7. 数据分析真题日刷 | 网易2018校招数据分析师笔试卷

    今日真题 网易2018校招数据分析师笔试卷(来源:牛客网) 题型 客观题:单选20道 主观题:问答1道,编程2道 完成时间 120分钟 牛客网评估难度系数 3颗星 ❤️ 「更多数据分析真题」 < ...

  8. 今日头条2018校招测试开发方向(第一、二、三、四批)编程题汇总 - 题解

    对于今日头条这家公司来说,测试的题和后端开发的题几乎是一样的,但是由于第一批的后端开发的题没有在牛客网上放出来,因此,猜测后端开发第一批的题应该和后端开发第一批的题一样,同时也想做一个测试方向编程题的 ...

  9. 魔法币 java_网易2018校招笔试编程题-魔法币 java实现

    魔法币 原题 小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币. 魔法机器1:如果投 ...

  10. 牛客网 2018校招真题 美团点评 K的倍数

    Description 牛客网 2018校招真题 K的倍数 Solving Ideas sum[i + 1]: 表示序列p[0]...p[i]的和 从长度最大的子串开始判断,当剩余需要判断子串长度不可 ...

最新文章

  1. 整合大数据价值最大化的三个关键因素
  2. maven setting.xml配置说明
  3. UWP使用AppService向另一个UWP客户端应用程序提供服务
  4. 32行代码AC——L1-027 出租 (20分)(~解题报告~)
  5. pytorch 之 imagefloder的用法
  6. Genomic characterization of metastatic breast cancers 转移性乳腺癌的基因组特征
  7. 用友U9 SOA Ready
  8. 虚拟机使用主机摄像头 ” usb chicony lenovo easycamera 连接失败,驱动错误“
  9. 人人都知“双十一”,几人仍记“光棍节”
  10. [ffmpeg][vaapi][goav][golang] ffmpeg使用vaapi示例代码(基于goav-incr)
  11. SQL中is not null和!=“ “的区别
  12. Android Dialog设置宽度显示不正常的问题(自定义设置Dialog的宽高)
  13. 哪些语句在python中非法_下列语句中,在Python中是非法的
  14. 速写在网站建设中的重要地位
  15. css和html的用法,HTML与CSS之CSS的基本使用
  16. 详解C语言中的switch语句
  17. Luogu 3371【模板】单源最短路径
  18. 由七芒星引出来的——关于142857
  19. 用HALL 库配置GPIO以及相关寄存器
  20. 【最新】Xcode 8 打包教程

热门文章

  1. 科研笔记1:科研绘图
  2. 视频分配器的特点以及应用
  3. PLC调试这几步都不知道
  4. SVG_9_线性颜色渐变_竖排文字_动画
  5. Mac电脑没声音音量图标变灰色如何修复?
  6. Android系统启动过程-uBoot+Kernel+Android
  7. python求不规则图形面积_python计算不规则图形面积算法
  8. 一文详尽移动互联网广告监测与归因
  9. c语言毕业论文,关于c语言的毕业论文题目[word文档]
  10. mysql超键 候选键_菜鸟学数据库——超键、候选键、主键、外键