Шаблон "фабрика" C#

Я не мог заставить disableLoadDefaultDecorators работать совершенно верно. Вот решение, которое я предложил.

$hiddenIdField = new Zend_Form_Element_Hidden('id');
$hiddenIdField->setValue($portalId)
              ->removeDecorator('label')
              ->removeDecorator('HtmlTag'); 

В HTML, скрытое поле появляется без любых дополнительных тегов вокруг этого.

...
<dt><label for="password" class="required">Password</label></dt>
<dd><input type="password" name="password" id="password" value="" /></dd>
<input type="hidden" name="id" value="1" id="id" />
...
5
задан gerry3 7 January 2010 в 09:02
поделиться

1 ответ

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

Например, предположим, что у вас есть эти источники данных с атрибутами (если я правильно понимаю):

Document { Author, DateModified }
Picture { Size, Caption, Image }
Song { Artist, Length, AlbumCover }

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

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

Допустим, далее вы решили, что для результата «Документ» требуется раскрывающийся элемент управления, для изображения требуется несколько кнопок, а для композиций требуется элемент управления звуковым проигрывателем. Теперь каждый шаблон для каждого источника данных кардинально меняется, так что вы вернулись к тому месту, где начали, за исключением того, что теперь вам добавлен слой базы данных.

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

Я бы посмотрел, как вы можете повторно использовать общие элементы / элементы управления в создаваемых представлениях, но сохраните сопоставление на фабрике между шаблоном и источником данных и храните шаблоны в виде отдельных файлов для каждого источника данных. Посмотрите, как поддерживать рендеринг с помощью CSS или аналогичных настроек конфигурации. Чтобы упростить обслуживание, рассмотрите возможность экспорта сопоставлений в виде простого файла XML. Чтобы развернуть новый источник данных, вы просто добавляете сопоставление, создаете соответствующий шаблон и файл CSS и помещаете их в ожидаемые места.

Ответ на комментарии ниже:

Я имел в виду, что простого оператора switch должно хватить:

switch (resultType)
{
    case (ResultType.Song):
      factory = new SongResultFactory();
      template = factory.BuildResult();
      break;
    // ...

Где у вас есть логика для вывода заданного шаблона. Если вам нужно что-то более компактное, чем длинный оператор switch, вы можете создать сопоставления в словаре, например:

IDictionary<ResultType, ResultFactory> TemplateMap;
mapping = new Dictionary<ResultType, ResultFactory>();
mapping.Add(ResultType.Song, new SongResultFactory());
// ... for all mappings.

Затем вместо оператора switch вы можете сделать этот однострочный:

template = TemplateMap[resultType].CreateTemplate();

Моим основным аргументом было что в какой-то момент вам все равно придется поддерживать сопоставления - либо в базе данных, либо в большом операторе switch, либо в этом экземпляре IDictionary, который необходимо инициализировать.

Вы можете пойти дальше и сохранить сопоставления в простом XML-файле, который читается в:

<TemplateMap>
    <Mapping ResultType="Song" ResultFactoryType="SongResultFactory" />
    <!-- ... -->
</TemplateMap>

И использовать отражение et. al. для заполнения IDictionary. Вы по-прежнему поддерживаете сопоставления, но теперь в XML-файле, который, возможно, будет проще развернуть.

template = TemplateMap[resultType].CreateTemplate();

Мой главный аргумент заключался в том, что в какой-то момент вам все равно придется поддерживать сопоставления - либо в базе данных, либо в большом операторе switch, либо в этом экземпляре IDictionary, который необходимо инициализировать.

Вы можете пойти дальше и сохранить сопоставления в простом XML-файле, который читается в:

<TemplateMap>
    <Mapping ResultType="Song" ResultFactoryType="SongResultFactory" />
    <!-- ... -->
</TemplateMap>

И использовать отражение et. al. для заполнения IDictionary. Вы по-прежнему поддерживаете сопоставления, но теперь в XML-файле, который, возможно, будет проще развернуть.

template = TemplateMap[resultType].CreateTemplate();

Мой главный аргумент заключался в том, что в какой-то момент вам все равно придется поддерживать сопоставления - либо в базе данных, либо в большом операторе switch, либо в этом экземпляре IDictionary, который необходимо инициализировать.

Вы можете пойти дальше и сохранить сопоставления в простом XML-файле, который читается в:

<TemplateMap>
    <Mapping ResultType="Song" ResultFactoryType="SongResultFactory" />
    <!-- ... -->
</TemplateMap>

И использовать отражение et. al. для заполнения IDictionary. Вы по-прежнему поддерживаете сопоставления, но теперь в XML-файле, который, возможно, будет проще развернуть.

4
ответ дан 15 December 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: