HIT软件构造经验漫谈(三)

针对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);

  这种修正方法的好处在于,不会影响到原来的接口,不论最初的调用者是以航班编号作为航班名,还是以航班日期+逗号+航班编号作为用户名,修改后的表现型都是一样的。而且在判断是否有同日期同航班编号的航班时,也只需要简单地向集合中插入即可。但是在向集合插入航班时,请记得以真实姓名,而不是航班编号为判等方式!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值