2010-02-15 35 views
4

我们有一个“部分日期”对象,这将允许您指定的日期,如实现一个“部分日期”对象

new PartialDate(1, null, null); // first of the month 
new PartialDate(1, 2, null);  // first of the February 
new PartialDate(null, 2, null); // February 

用例是有关事件的要求。例如,您可能每年都会有一门课程,在这种情况下,您不需要或不需要指定日期对象的年份组件。

我们需要能够根据某些任意规则对这些日期进行排序,因此我认为要实现一个数据类型(它将实现IComparable<PartialDate>,但这不在我的问题的范围之内)。

我有几个问题:

  1. 这是一个坏主意?
  2. 我在.NET中工作,是否有框架(或第三方库)的某些部分将提供此功能?

回答

3

该类本身相当简单,只有三个可为空的日期组件的整数。 (你甚至可以使一个结构,如果你觉得如何正确地实现结构研读。)

是什么使得它有点复杂正在处理的特殊情况下,如:

new PartialDate(29, 2, null); // occurs only on leap years 
new PartialDate(31, null, null); // occurs only seven months in a year 

(另外,请查看DateTime结构中使用的参数顺序year,month,day,您可能希望复制该模式而不是创建新模式。)

到单个类的另一种可能是一个基类与seprate种日期的特定实现:

new MonthlyPartialDate(1); // the first every month 
new YearlyParticalDate(2, 1); // the first of february 
new YearlyPartialDate(2); // february 
1

我没有看到任何主要问题,但我不确定这是做到这一点的最佳方法。如果每个星期一发生什么事呢?你无法用你的PartialDate来表达这一点。其他类型的时间表可能也很困难。

另一种方法是让类像YearlySchedule,MonthlySchedule,WeeklySchedule,OneTimeSchedule和某种方式来组合和排除它们。

我从Google上找到的另一个选项是Flexible Time Schedule,它使用谓词来指定日期。

1

您可以看看DevExpress的Scheduler control

无论如何,在我们的应用程序中,我们没有使用它,因为我们确实需要更精细的粒度,并且不需要用于UI表示的日历。我们所做的就是创建一个基本的Interval接口,并使用一种方法根据最后一次调度程序运行计算下一个日期,并为MontlyInterval,WeeklyInterval等实现接口创建一些类。

1

我已经使用部分日期作为存储机构:

喜欢的东西

Structure PartialDate 
    Public Month As Byte '0 = null 
    Public Day as Byte '0 = null 
    Public Year As Integer '0 = null (there is no 0 year) 
End Structure 

我从来没有试图定义可比对象的完整色域(空年不是很有用)。

2

我对这个项目的未来有一些担忧。用户有一个想要更多功能的恶劣趋势,并且在这个设计中有一些主要的陷阱。

首先,不支持周和周日。人们可能会认为,一旦你有年,月和日,那么周和周将很容易添加。但它不会很简单!数据组件的各个子集之间的交互将非常复杂。其次,任意排序要求会很快变得非常复杂。以下将如何排序? 2008年

  • 月的第二天

    1. 的一年。
    2. 每个月的第一天。

    没有明显的理由把其中任何一个之前或之后的任何其他人。

  • +1

    虽然我同意没有明显的方式,但客户已经指定了一种方式,因此实现该规范非常简单。这是为了他们决定排序顺序的合适性。 星期几等待点等干杯 – 2010-02-15 17:34:32

    相关问题