HIT-软件构造blog-有关实验三(2)

在Lab Manuals中,要求我们实现IntervalSet和MultiIntervalSet,但又说,可以考虑将二者进一步抽象形成一个更高层次的ADT,进而使用一个ADT来代替这两个。

说实话,我真的挺想这么办的。但是感觉大家都没有这样做,玩意我写不出来没有人可以交流病情,于是就放弃了。但是还是简单设想了一下。

Lab Manuals中的3.4.1节,介绍了三个维度上的差异。我的考虑是,是否是Multi的,也是一种差异,也就是我们总共要处理4个维度的差异。只是Lab Manuals认为,其中一种的地位与另三种不同。

在很多可以采用的实现方案中,“Set是否是Multi的”的确与另外三个维度的差异地位不同。但是,如果使用类似3.4.2节中方案一的办法,将所有特殊操作置入顶层接口中,那么这四种区别的地位其实差不多。事实上,我们可以使用4个比特(相当于4个0、1选项)来表示差别,比如,对于排班表,“允许重叠”这一选项为0——即不允许重叠;类似地,“是否是Multi的”这一选项为0——即不是Multi的,每个员工只能对应一个Interval。这样,总共的选项组合有 2 4 = 16 2^4=16 24=16种。如果要完整实现顶层ADT,就需要对这16种可能分别实现(但其中有可以复用的部分)。

当然,为了完成实验,只需要实现三种,另外13种本实验中不涉及(也许有些奇怪的选项组合很难被使用)。

总之,这个方案的代码可能不是很优雅,但方案本身有其优雅性:将每种区别一视同仁,统一处理。最终代码展现出来的树形结构很对称。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值