2010-02-28

TaggyTODO:该不该添加周期性任务支持?

很长时间没有更新TaggyTODO了。这期间发生了很多事情,有个人的,也有工作上的,导致实在没有时间。但最主要的问题是设计上的,因为我正在考虑一个重要功能,而这个功能最终可能导致整个设计的大幅改变,我不敢不慎重。

这个功能就是周期任务支持。

我一直很犹豫是不是需要让TaggyTODO支持周期性任务,因为这个东西实在非常有诱惑力。很多我们生活中的任务都是周期性质的,比如每个月的水电费,支付信用卡帐单,话费,等等。

但是周期性任务的支持会带来的设计上的巨大变化。首先是我们如才能合理地定义多个任务。有一个很简单的方法是:一个任务需要重复多少次,我们就在数据库里保留多少个任务。这个设计是最简单也最容易实现的,但这一来有一个问题:假如用户要求无限重复怎么办?例如用户试图定义一个任务,记录每个月的水电费缴纳情况。假如他/她已经买了房子,那么这个任务可以一直持续到他/她把房子卖掉的时候。我总不能添加无数个任务对象。退一步讲,即使我们限制了重复的最大次数,比如最多365项,那么用户定义一个每天的任务就需要占用365个项目,任务一多起来就会迅速地占用数据库的大量空间,我个人认为这个很难接受。


另一个方案是只定义一个任务,但通过内部添加一些数据来表示和记录多个重复事件的完成情况,每个任务可以通过当前日期计算出相应的起止时间。这个方案就可以有效地节约空间占用问题,但存在一个缺点:假如用户备份并删除了一个老任务,那么后来应当发生的新任务就给一并删掉了。另一个需要解决的问题是如何处理临时改期。对第一个方案这不是问题,而对这个方案来说则需要添加一个新事件,那么如何关联两个事件?这也是需要解决的。


当然,一个最直白的手段是:我不支持重复事件,简单而直接。事实上很多我见到的任务管理程序就是这么做的。不过我还是希望给自己一点挑战。

先记录到这里吧。

No comments: