针对HIT软件构造Lab3常见问题的回答
首先回顾一下Lab3的实验目标:
实验目标回顾
本次实验覆盖课程第3、4、5 章的内容,目标是编写具有可复用性和可维护性的软件,主要使用以下软件构造技术:
- 子类型、泛型、多态、重写、重载
- 继承、代理、组合
- 常见的OO 设计模式
- 语法驱动的编程、正则表达式
- 基于状态的编程
- API 设计、API 复用
本次实验给定了五个具体应用(高铁车次管理、航班管理、操作系统进程管理、大学课表管理、学习活动日程管理),学生不是直接针对五个应用分别编程实现,而是通过ADT 和泛型等抽象技术,开发一套可复用的ADT 及其实现,充分考虑这些应用之间的相似性和差异性,使ADT 有更大程度的复用(可复用性)和更容易面向各种变化(可维护性)。
正文
语法驱动的编程
许多同学问我3.13中语法驱动的编程如何实现,其实实现方案老师已经在实验手册中多次提到了,即通过正则表达式来读取。
于是不难想到两种读取方案
-
写一个很长的正则表达式来确定一个航班信息的形式,然后从这个形式中提取需要的数据,由于是用正则表达式提取的数据,所以可以断言数据的格式是正确的,之后分析数据内容是否符合规约即可
-
每次读入一个航班信息,每个航班信息由13行组成,因此以13次为一个循环,循环中的每一轮读入一行,然后以冒号:为分隔符,把:以后的字符提取出来,然后把提取出来的内容去和正则表达式匹配即可,如果不匹配的话直接抛出异常,并终止读入
两种方案都是可行的,但是第一种方案需要写一个很长的正则表达式,对于不熟悉正则表达式的同学来说可能会比较难以实现。而第二种方案需要注意的一种情况是读入了一个空行,此时应该直接跳过,如果没有特殊处理这个情况,可能就会被一个空行卡死。
航班编号的唯一性问题
很多同学都和我一样遇到了一个问题:一开始以航班具有唯一性为前提进行设计,而做到了3.13之后才发现是允许不同日期相同航班编号的航班存在的。但其实有一种很方便的修正方法,即:将航班日期+逗号+航班编号作为航班的名称,而不是把航班编号作为名称。然后把原来的getName返回的name修改成返回name.substring(name.indexOf(’,’))
return name.substring(name.indexOf(',')+1);
这种修正方法的好处在于,不会影响到原来的接口,不论最初的调用者是以航班编号作为航班名,还是以航班日期+逗号+航班编号作为用户名,修改后的表现型都是一样的。而且在判断是否有同日期同航班编号的航班时,也只需要简单地向集合中插入即可。但是在向集合插入航班时,请记得以真实姓名,而不是航班编号为判等方式!