Шаблон проектирования для применения преобразования к нескольким свойствам в нескольких классах - PullRequest
3 голосов
/ 31 октября 2008

Я использую редактор разметки ОМУ в проекте для большого количества полей, которые соответствуют большому количеству свойств в большом количестве классов сущностей. Некоторые классы могут иметь несколько свойств, которые требуют уценки.

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

Я создал служебный класс с методом, который принимает строку уценки и возвращает HTML. Я использую markdownj, и это прекрасно работает.

Проблема в том, что для каждого свойства каждого класса, в котором хранится уценка, может потребоваться другой метод, который преобразует в HTML:

public class Course{

     private String description;
     .
     .
     .
     public String getDescription(){
          return description;
     }

     public String getDescriptionAsHTML(){
          return MarkdownUtil.convert(getDescription());
     }
     .
     .
     .
 }

Проблема состоит в том, что если у класса Course есть еще 2 свойства, Tuition и Prerequisites говорят, что оба нуждаются в преобразователях, то мне придется написать getTuitionAsHTML () и getPrerequisiteAsHTML ().

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

Другой вариант, который я рассматриваю, - это делать это в контроллере, а не в модели. Что вы думаете об этом?

Спасибо.

[редактировать]: новые мысли (спасибо Джаспер). Поскольку в проекте используются Struts2 (я не говорил этого раньше), я мог бы создать компонент представления, который будет преобразовывать уценку для меня. Затем я использую это везде, где мне нужно отобразить значение в виде HTML.

Ответы [ 3 ]

2 голосов
/ 31 октября 2008

Классы, которым это требуется, не являются частью единой иерархии наследования.

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

Другой вариант, который я рассматриваю, - это делать это в контроллере, а не в модели. Что ты думаешь по этому поводу?

Это явно является обязанностью Видения. Правило № 1 MVC заключается в том, что Модель не заботится о своем представлении, в данном случае уценка.

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

1 голос
/ 31 октября 2008

Игнорируя архитектурные проблемы, я думаю, что простой ответ может быть:

public String getDescription(MarkDownUtil converter)
{
    if (converter == null) return description;
    else return MarkdownUtil.convert(description);
}

Еще лучше было бы сделать так, чтобы MarkDownUtil реализовал IStringConverter, и вы могли бы иметь несколько разных StringConverter для разных заданий.

1 голос
/ 31 октября 2008

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

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

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