我在尋找的整潔,維護和測試的方式來處理諸如以下,其中不同的參數組合必須以不同的方式由該對象的方法來解釋的情況下建議:對象的構造/方法重載
# Every 2 days.
$event = Event::Recurrence->new(recurs => 'daily', interval => 2);
# 1st and 2nd day of every 3rd week.
$event = Event::Recurrence->new(recurs => 'weekly', days => [1, 2], interval => 3);
# 1st and 2nd day of every 4th month.
$event = Event::Recurrence->new(recurs => 'monthly', days => [1, 2], interval => 4);
# 1st and 2nd day of the 2nd and 3rd week of every month.
$event = Event::Recurrence->new(recurs => 'monthly', days => [1, 2], weeks => [2, 3], interval => 1);
# 1st and 2nd day of the 2nd and 3rd week of every year.
$event = Event::Recurrence->new(recurs => 'yearly', days => [1, 2], weeks => [2, 3], interval => 1);
# 1st and 2nd day of the 2nd and 3rd week of the 3rd and 4th months of every 5th year.
$event = Event::Recurrence->new(recurs => 'yearly', days => [1, 2], weeks => [2, 3], months => [3, 4], interval => 5);
# Do something with the event object.
$set = $event->get_set();
get_set()
將根據構造參數的不同而起作用。
我不是在尋找方法來實現日期處理 - 我使用循環事件來說明問題的類型。相反,我正在尋找更好的方法來處理將不同的可能的參數組合分配到合適的方法的更一般的信息。我使用駝鹿,所以駝鹿/ OO模式是受歡迎的。
上述示例可以大致分爲不同類型的事件:每日,每週,每月和每年。每個將以不同的方式處理剩餘的參數,但最終結果將是相同類型的對象 - 一組可以執行某些操作(獲取開始和結束日期,確定交叉點等)的循環事件。
get_set()
因此可以實現一個調度表來處理所有可能的參數組合,爲每個參數調用一個單獨的方法 - 但是感覺混亂。
我可以用單獨的類針對不同復發類型一起創建一個CodeRef屬性(Event::Recurrence::Daily
,Event::Recurrence::Weekly
,等等),並指定相應的類,在施工時間屬性,類似於接受的答案this question - 雖然我不確定我會如何實現這一點。
爲什麼要的方法做不同不同組參數的東西?你有沒有嘗試過一個系統,可以做循環事件,而不必關心他們的時期?在採用這種思維方式太古怪之前,我會尋找一個更簡單的解決方案。 –
@brian d foy:我在使用[DateTime :: Event :: Recurrence](http://search.cpan.org/~fglock/DateTime-Event-Recurrence-0.16/lib/DateTime/Event/Recurrence.pm) ,但它不能按照我喜歡的方式處理一些重複。相反,我使用[DateTime :: Set-> from_recurrence](http://search.cpan.org/~fglock/DateTime-Set-0.31/lib/DateTime/Set.pm)來創建循環事件。我想遵循類似於DateTime :: Event :: Recurrence的模式,其中'days','weeks'具有不同的含義,具體取決於是否存在其他參數。例如,'days'可以表示星期幾或一個月中的某一天。 – Martin