Разработайте шаблон для применения преобразования к нескольким свойствам в нескольких классах
-
05-07-2019 - |
Вопрос
Я использую редактор WMD markdown в проекте для большого количества полей, которые соответствуют большому количеству свойств в большом количестве классов сущностей.Некоторые классы могут иметь несколько свойств, для которых требуется уценка.
Я сохраняю саму уценку, так как это облегчает последующее редактирование полей.Однако мне нужно преобразовать свойства в HTML для последующего отображения.Вопрос в том,:есть ли какой-нибудь шаблон, который я могу использовать, чтобы избежать написания кода преобразования markdown во всех моих классах сущностей?
Я создал служебный класс с методом, который принимает строку markdown и возвращает HTML.Я использую markdownj, и это работает нормально.
Проблема в том, что для каждого свойства каждого класса, в котором хранится markdown, мне может понадобиться другой метод, который преобразует в HTML:
public class Course{
private String description;
.
.
.
public String getDescription(){
return description;
}
public String getDescriptionAsHTML(){
return MarkdownUtil.convert(getDescription());
}
.
.
.
}
Проблема заключается в том, что если у класса Course есть еще 2 свойства, в которых указано, что для обучения и предварительных условий обоим нужны преобразователи, тогда мне придется написать getTuitionAsHTML() и getPrerequisiteAsHTML().
Я нахожу это немного уродливым и хотел бы найти более чистое решение.Классы, которые требуют этого, не являются частью единой иерархии наследования.
Другой вариант, который я рассматриваю, заключается в том, чтобы делать это в контроллере, а не в модели.Что вы думаете по этому поводу?
Спасибо.
[ПРАВИТЬ]:Новые мысли (спасибо Джасперу).Поскольку проект использует struts2 (я не говорил этого раньше) Я мог бы создать компонент просмотра, скажем, который преобразует markdown для меня.Затем я использую это везде, где мне нужно отобразить значение в виде HTML.
Решение
Классы, которые требуют этого, не являются частью единой иерархии наследования.
Они должны, по крайней мере, реализовать общий интерфейс, в противном случае создание чистого универсального решения будет громоздким.
Другой вариант, который я рассматриваю, заключается в том, чтобы делать это в контроллере, а не в модели.Что вы думаете по этому поводу?
Очевидно, что это ответственность The View.Правило # 1 MVC заключается в том, что Модель не заботится о своем представлении, уценке в данном случае.
Тем не менее, я чувствую, что существует слишком мало подробностей о вашей текущей архитектуре, чтобы дать содержательный ответ на ваш вопрос.
Другие советы
У вас есть один вариант для этого, если вы не можете использовать наследование или интерфейс.Я знаю, я знаю рефакторинг, но это реальность, и * попадание происходит.
Вы можете использовать отражение для перебора ваших свойств и применения к ним форматирования.Вы могли бы либо пометить их атрибутом, либо принять схему именования (хрупкий, но все же вариант).
Игнорируя архитектурные проблемы, я думаю, что простым ответом могло бы быть:
public String getDescription(MarkDownUtil converter)
{
if (converter == null) return description;
else return MarkdownUtil.convert(description);
}
Еще лучше было бы заставить MarkDownUtil реализовать IStringConverter, и у вас могло бы быть несколько разных StringConverters для разных заданий.