2008-11-17 3 views
1

У меня есть набор объектов домена, которые мне нужно преобразовать в другой тип для использования в .NET framework. Какова наилучшая практика для такого преобразования?Лучшая практика OO для адаптации одного типа к другому?

В частности, у меня есть тип под названием ContentEntry, и мне нужно преобразовать его в SyndicationItem для использования в создании SyndicationFeed. Само преобразование прямо, но я ищу хороший образец. Создать метод ContentEntry с именем CreateSyndicationItem() или, возможно, отдельный объект конвертера? Возможно, метод расширения?

Это будет несколько субъективно, но я буду благодарен за некоторые идеи.

Редактировать Примечание: Я хотел бы отметить, что я не контролирую SyndicationItem. Он встроен в .NET Framework. Кроме того, я бы очень хотел преобразовать несколько объектов ContentEntry в SyndicationItems за один раз.

ответ

3

Как не может изменить конструкторы в SyndicationItem, я хотел бы предложить вам использовать factory pattern. Создайте класс SyndicationItemFactory, который имеет метод CreateSyndicationItem(). Этот метод возвращает объект SyndicationItem. В этом случае вам понадобится только одна версия метода, которая будет принимать объект ContentEntry.

Когда вы говорите, что хотите создать несколько объектов ContentEntry сразу, я предполагаю, что вы сказали массив объектов ContentEntry. Другой метод (например, CreateSyndicationItems()) может возвращать массив элементов SyndicationItems и принимать в качестве параметра массив объектов ContentEntry.

+0

В моей ситуации здесь я нашел, что это лучший метод. Кастинг не кажется подходящим, и поскольку ни одно государство не нуждается в обслуживании, создание нового класса конвертера, который получает каждый раз, когда мне нужно преобразовать, кажется излишним. Мой завод в настоящее время имеет только статические элементы. – 2008-11-18 02:29:04

1

IMHO, класс конвертера, который преобразует один способ и, возможно, другой, - это то, что вы должны делать. Класс должен иметь одну цель, например, представлять ContentEntry. Добавление преобразования дает ему вторую цель и поэтому нарушает это правило OO.

4

Я предлагаю смотреть на Adapter Pattern

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

0

Это зависит от ... вам просто нужен удобный способ размещения метода преобразования? Если вы контролируете один или оба класса, вы можете просто добавить перегрузку оператора броска, чтобы вы могли просто передать один класс другому. Если вы хотите, чтобы это было очевидно, что вы можете сделать Явный оператор

SyndicationItem item = (SyndicationItem)entry

0

Если вы можете сделать преобразование посредством публичного договора обоих типов, я настоятельно рекомендую метод расширения.

Смотрите также, System.Linq.Enumerable.ToList(), Enumerable.ToDictionary()

Рассуждение:

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