Реализация объекта «Частичная дата» - PullRequest
4 голосов
/ 15 февраля 2010

У нас есть требование для объекта " Partial Date ", который позволял бы вам указывать такие даты, как

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

Вариант использования связан с событиями. Например, у вас может быть курс, который проводится каждый январь, и в этом случае вы не хотите или не должны указывать компонент year объекта date.

Нам нужно иметь возможность сортировать по этим датам, основываясь на некоторых произвольных правилах, поэтому я подумал реализовать тип данных (который будет реализовывать IComparable<PartialDate>, однако это выходит за рамки моего вопроса).

У меня есть пара вопросов:

  1. Это плохая идея?
  2. Я работаю в .NET, есть ли какая-то часть фреймворка (или сторонней библиотеки), которая обеспечит эту функциональность?

Ответы [ 5 ]

3 голосов
/ 15 февраля 2010

Сам класс был бы довольно простым, просто имея три обнуляемых числа для компонентов даты. (Вы могли бы даже сделать это структурой, если хотите прочитать, как правильно реализовать структуру.)

Что немного усложняет, так это обработка особых случаев, таких как:

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

(Кроме того, взгляните на порядок параметров year,month,day, используемый в структуре DateTime, возможно, вы захотите скопировать этот шаблон, а не придумывать новый.)

Альтернативой отдельному классу может быть базовый класс с конкретными реализациями для отдельных видов дат:

new MonthlyPartialDate(1); // the first every month
new YearlyParticalDate(2, 1); // the first of february
new YearlyPartialDate(2); // february
2 голосов
/ 15 февраля 2010

У меня есть некоторые опасения по поводу будущего этого проекта. У пользователей есть неприятная тенденция хотеть больше функций, и в этом дизайне есть некоторые важные ошибки.

Во-первых, нет поддержки для недель и дней недели. Люди, вероятно, предположят, что если у вас есть Год, Месяц и День, то Недели и Будни можно будет легко добавить. Но все будет не просто! Взаимодействия между различными подмножествами компонентов даты будут очень сложными.

Во-вторых, требование произвольного порядка очень быстро усложняется. Как будет отсортировано следующее?

  1. 2008 год.
  2. Второй день марта.
  3. первый день каждого месяца.

Нет очевидных причин ставить какие-либо из них до или после каких-либо других.

1 голос
/ 15 февраля 2010

Я использовал частичную дату в качестве механизма хранения:

Что-то вроде

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

Я никогда не пытался определить полную гамму сопоставимых объектов (нулевой год был не очень полезен).

1 голос
/ 15 февраля 2010

Вы можете взглянуть на Планировщик из DevExpress.

В любом случае, в нашем приложении мы не использовали его, потому что нам нужна была более тонкая детализация и не требовался календарь для представления пользовательского интерфейса. Мы создали базовый интерфейс Interval с методом для вычисления следующей даты на основе последнего запуска планировщика и создали некоторые классы для MontlyInterval, WeeklyInterval и т. Д., Реализуя интерфейс.

1 голос
/ 15 февраля 2010

Я не вижу серьезных проблем, но я не уверен, что это лучший способ сделать это. Что если что-то случится каждый понедельник? Вы не можете выразить это с помощью PartialDate. Другие типы расписаний также могут быть трудными.

Альтернативой может быть наличие классов, таких как YearlySchedule, MonthlySchedule, WeeklySchedule, OneTimeSchedule, и некоторый способ их объединения и исключения из них.

Еще одна опция, которую я нашел в Google, - это Гибкое расписание , в котором для указания дат используются предикаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...