Lab4-实验心得
在实验三的基础上进行了如下的改进:
1.处理输入文本的错误
- 输入文件中不符合语法规则的语句
此类问题共找出了八处,分别为:航班编号中日期与编号混淆,航班编号大小写错误,航班编号字母与数字的顺序错误,落地时间错误,飞机编号语法错误,座位数语法错误(低于50或超出600),机龄错误(不是一位小数或超出30),飞机机型错误(首位不是B或N)以航班编号相关问题为例展示代码:
发生错误后抛出:2.输入文件中存在标签一样的元素在程序中设置了一处:航班的标签存在重复
对所有读入的航班进行遍历,如果发现有完全相同的标签存在则抛出Exception并退出程序
3.输入文件中各元素依赖关系不正确
在程序中设置了四处:航班号与实际日期不相符,降落日期与起飞日期相差超过一天,同航班号的航班起降机场或起降时间不同,同飞机编号的飞机机龄、座位数、机型不同。
对所有的航班和飞机用List进行记录,在每次读入时对所有的Flight和Plane进行遍历,如果发现有编号相同的,则进行内部条件的比较,一旦发现不符则立刻抛出Exception并结束程序。
在读入降落日期后,将其与起飞日期进行比较,如果相差超过一天则抛出Exception并结束程序
用assert和防御式编程进行改进
在每个ADT设置assert检查RI和方法的前置、后置条件
1.checkRep()检查rep invariants
2.Assertion/异常机制来保障pre-/post-condition:
用assert在方法的前后确保方法的前置条件和后置条件能够得到保证Eg.在FlightScheduleApp的Location方法中,前置条件检查为:
确保输入的panel存在,以及后续运算需要用到的list不为空
3.防御式策略阐述:
(1)利用checkRep进行ADT条件检测:首先检查ADT中的变量是否为空,然后检查重复问题与语法问题,例如飞机的起飞和降落地点是否重复、火车的车厢是否重复、时间是否符合语法、飞机的编号是否符合语法、状态转移是否合法等。当出现错误后及时进行修正
(2)利用assert在方法前后进行前置和后置条件检测:例如方法的参数是否为空、方法中要用到的变量是否为空、方法的返回值是否为空等
日志功能
1.异常处理日志功能
在assert处理的位置和throw Exception的位置进行日志记录,利用log.warning进行记录,此时会自动显示出问题所在类、方法、出现问题的时间,在日志记录中手动输入问题名称和解决方式即可,以FlightFileReader为例:
首先定义log和记录级别:
在出现assert和Exception的地方进行记录其他assert和Exception的位置记录方式同上
2.应用层操作日志功能
在每次进行操作后对操作进行日志记录,级别设定为Info,在记录时会自动记录操作时间,手动记录操作名称即可,以CourseCalendarApp为例:
首先创建log:
对初始级别进行设定:
进入一项功能后记录:
Summary
经过本次试验,我能够明显的感觉到自己Debug的经验增加了,熟悉了assert、exception和log的应用,对于防御式编程有了更好的掌握。本次实验使我认识到一定在最初编程的时候尽力减少bug的存在,debug是一个比写代码更难的过程。熟练运用log和assert能够有效的帮忙在程序中找到bug的存在
同时通过本次实验,也清楚地感受到了健壮性与正确性在某些程度上的冲突,程序员需要综合考虑进行编程。面对出现概率低的一场合理考虑修复的成本和不修复的损失,综合考量是否要进行修复。