10.11.1 在内存中的表示
应该如何在内存中表示读数呢?一个很直接的做法是定义三个类Year、Month和Reading,与输入准确匹配。显然,Year和Month在处理数据过程中很有用:我们希望比较不同年份的温度,计算每月的平均温度值,比较一年中不同月份的温度,比较不同年份相同月份的温度,将温度读数与日照记录和湿度读数进行匹配,等等。本质上说,Year和Month与我们思考温度和天气的一般方式是吻合的:Month包含了一个月的信息,而Year包含了一年的信息。但是Reading呢?它与硬件(如传感器)的底层表示形式吻合。一个Reading对象的数据“(日期,小时,温度)”显得很奇怪,而且只在Month对象内才有意义。它还是非结构化的:读数不保证按日期或小时顺序给出。基本上,无论何时我们想对读数进行感兴趣的操作时,都要进行排序。
对于温度数据的内存表示,可以作如下假定:
·如果我们获得了某月的任何一个读数,就很可能会读取该月的其他更多读数。
·如果我们获得了某日的一个读数,就很可能会读取该日的其他更多读数。
如果情况确实如此,那么就有必要将Year表示为12个Month的vector,Month是包含30个Day的一个向量,而Day包含24个温度值(每小时一个)。对于很多应用来说,这种方式简单、易于处理。因此,Day、Month和Year都是简单数据结构,只是带有构造函数。既然我们计划在获取温度读数之前就创建Month和Day来作为Year的一部分,那么还需要使用一个“非读数”的概念,来表示某个小时数据还未读入。
类似地,我们引入“非月份”的概念来直接表示未读入数据的月份,以免不得不搜索该月所有日期来确定不包含数据:
于是三个关键的类可以定义如下:
也就是说,Day包括24个小时的读数,每个都被初始化为not_a_reading。 ...