Какой шаблон дизайна я должен использовать для импорта / экспорта? - PullRequest
11 голосов
/ 18 ноября 2009

У меня есть объект события календаря. У меня есть планы сделать его совместимым с протоколами / форматами файлов CalDAV / iCal / vCal, которые требуют сериализации и десериализации события в различные форматы.

Я мог бы написать набор методов ImportICal, ExportICal, ImportVCal, ExportVCal и т. Д., Но это не очень хороший подход, потому что, если формат vCal обновлен и т. Д.

Кто-нибудь имел дело с этим типом ситуации импорта / экспорта раньше? Если да, то какой шаблон проектирования (если таковой имеется) обычно лучше?

Спасибо за вашу помощь!

Ответы [ 3 ]

19 голосов
/ 18 ноября 2009

Я не особенно знаком с этими форматами, но я бы создал простой объект передачи данных, который представляет ваш общий объект события календаря. Он не делает ничего, кроме хранения данных (псевдокод):

class CalendarEvent
{
    DateTime Date { get; }
    string Title { get; }
    string Description { get; }
}

Затем вы создаете интерфейс для CalendarEventReader и CalendarEventWriter (это шаблон Стратегия и, возможно, шаблон Builder , в некотором роде):

interface ICalendarEventReader
{
     CalendarEvent Read(Stream data);
     // Add additional methods if needed e.g.:
     string GetTitleOnly(Stream data);
}
interface ICalendarEventWriter
{
     Stream Write(CalendarEvent event);
     // Add additional methods if needed e.g.:
     Stream WriteSummaryOnly(CalendarEvent event);
}

Тогда имейте фактические реализации, реализующие вышеупомянутые интерфейсы. Один для каждого формата. Вы даже можете подумать о том, чтобы иметь читателя и писателя в одном классе:

class CalDavConverter : ICalenderEventWriter, ICalendarEventReader
{
    ...
}

Тогда у вас будет репозиторий (это шаблон Factory , возможно, с Singleton ), который поддерживает список реализаций ICalenderEventReader / Writer для различных форматов:

static class CalenderEventConverterRepository
{
    static ICalendarEventReader GetReader(string formatName /*or any other data upon wich to decide wich format is needed*/)
    { 
    ...
    }

    static ICalendarEventReader GetWriter(string formatName /*or any other data upon wich to decide wich format is needed*/)
    { 
    ...
    }
}
0 голосов
/ 18 ноября 2009

Обычный способ организовать несколько реализаций (в вашем случае календарные протоколы) с одним общим интерфейсом - Шаблон моста .

0 голосов
/ 18 ноября 2009

Если формат vCal обновлен, вам придется изменить любой код, который вы написали, в зависимости от того, какой шаблон проектирования вы используете (если только они не решат переключиться на что-то вроде ASN.1, где выпекаются обновления).

Я хотел бы создать интерфейс формата с методами импорта и экспорта и, возможно, метаданными и методами для проверки того, может ли случайный бит XML быть этим форматом. Затем для каждого отдельного формата у вас есть объект, который реализует этот интерфейс. Это своего рода «шаблон разработки стратегии», но каждый формат представляет несколько стратегий для создания связного набора вещей (импорт, экспорт, обнаружение) вместо того, чтобы иметь отдельные объекты стратегии.

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