2010-02-15 62 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