在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种本实验中不涉及(也许有些奇怪的选项组合很难被使用)。
总之,这个方案的代码可能不是很优雅,但方案本身有其优雅性:将每种区别一视同仁,统一处理。最终代码展现出来的树形结构很对称。