前两天写一个小程序,需求是需要跟踪某个物流工具的物流状态。物流状态有六个,是固定的。且这个工具是可以循环使用的,所以物流状态系统要能自动的循环更新,思考后给出的解决办法是,对物流状态进行编码,从1开始编码,编码到6位置。然后用代码:
int nextState = currState%6+1;
通过这一行简单的代码就能得到下一个状态是什么。程序中,为了减少一些字符串转换过程,方便直接用SQL能读出最终的字符串文字,我把这些枚举变量存储到了一个数据库表中,好像有些比较大的财务软件也是这样处理这些枚举量的,还方便扩展。
解决这个问题后,我想起了一个面试题,如何再不使用任何系统获取时间相关API的情况下,实现时钟显示程序。当时我没有答出来,现在通过解决这个问题,再来重新思考这道题目,原来是如此之简单:
解决问题的思路:
1. 对日期的组成部分进行分割,由 年, 月, 日, 小时, 分钟, 秒 六部分组成。可以用一个枚举来描述组成部分。现在只考虑时间部分。小时,分钟,秒三个部分。
enum SegTypes{ Second, Minute, Hour };
2. 这些部分都有一个属性 Value来显示当前值。同时,有一个方法Increment是用来递增。
3. Value是有一定的循环规则的,例如秒的进位规则是 60 进1,小时是 24 进1, 天的话有31,30,29,28 四种。
4. 再就是每当本部分达到一个循环的时候,需要通知更高级的时间段进位。例如秒钟走完 60 秒后,分钟需要加 1。在C#里面,可以通过事件来进行事件传播。
public event EventHandler JW;
5. 显示要求,不同的时间段有不同的显示需求,例如小时可以有两种显示方式,24小时制,还是12小时制。
6. 年不做为时间段来考虑。因为年没有进位规则,且需要返过来影响天的进位规则。不做为通用的段来处理。