Разработайте шаблон для применения преобразования к нескольким свойствам в нескольких классах

StackOverflow https://stackoverflow.com/questions/254060

  •  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 для разных заданий.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top