我在一个项目中使用WMD markdown编辑器,用于对应于大量Entity类中的大量属性的大量字段。某些类可能有多个需要降价的属性。

我正在存储markdown本身,因为这样可以让以后更容易编辑字段。但是,我需要将属性转换为HTML以便稍后显示。问题是:是否有一些模式可以用来避免在我的所有实体类中编写降价转换代码?

我创建了一个实用程序类,其方法接受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。

有帮助吗?

解决方案

  

需要它的类不是单个继承层次结构的一部分。

他们应该至少实现一个通用接口,否则提出一个干净的通用解决方案将会很麻烦。

  

我正在考虑的另一个选项是在控制器而不是模型中执行此操作。你对此有何看法?

这显然是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