変換を複数のクラスの複数のプロパティに適用するデザインパターン
-
05-07-2019 - |
質問
私は、多数のEntityクラスの多数のプロパティに対応する多数のフィールドに対して、プロジェクトでWMDマークダウンエディターを使用しています。一部のクラスには、マークダウンを必要とする複数のプロパティがあります。
後でフィールドを編集しやすくするため、マークダウン自体を保存しています。ただし、後で表示するためにプロパティをHTMLに変換する必要があります。問題は、すべてのエンティティクラスにマークダウン変換コードを記述しないようにするために使用できるパターンがあるかどうかです。
マークダウン文字列を受け取り、HTMLを返すメソッドを持つユーティリティクラスを作成しました。私はmarkdownjを使用していますが、これは正常に動作します。
問題は、マークダウンを保存する各クラスの各プロパティです。HTMLに変換する別のメソッドが必要になる場合があります。
public class Course{
private String description;
.
.
.
public String getDescription(){
return description;
}
public String getDescriptionAsHTML(){
return MarkdownUtil.convert(getDescription());
}
.
.
.
}
問題は、CourseクラスにTuitionとPrerequisitesの2つのプロパティがあり、両方ともコンバーターが必要である場合、getTuitionAsHTML()とgetPrerequisiteAsHTML()を記述する必要があることです。
それは少しいので、よりクリーンなソリューションが必要です。これを必要とするクラスは、単一の継承階層の一部ではありません。
私が検討している他のオプションは、モデルではなくコントローラーでこれを行うことです。これについてどう思いますか?
ありがとう。
[編集]:新しい考え(ありがとう、ジャスパー)。このプロジェクトではstruts2を使用しているため(これは以前には言いませんでした)、マークダウンを変換するビューコンポーネントを作成できます。次に、値をHTMLとして表示する必要がある場合はいつでもそれを使用します。
解決
これを必要とするクラスは、単一の継承階層の一部ではありません。
少なくとも共通のインターフェイスを実装する必要があります。そうしないと、クリーンで汎用的なソリューションを作成するのが面倒になります。
私が検討している他のオプションは、モデルではなくコントローラーでこれを行うことです。これについてどう思いますか?
これは明らかにビューの責任です。 #1 MVCルールは、モデルはその表現(この場合はマークダウン)を気にしないということです。
しかし、あなたの現在のアーキテクチャについては、あなたの質問に意味のある答えを出すための詳細はほとんどないと感じています。
他のヒント
継承またはインターフェイスを使用できない場合、これを行うためのオプションが1つあります。リファクタリングは知っていますが、これは現実であり、*ヒットが発生します。
リフレクションを使用してプロパティを反復処理し、フォーマットを適用できます。属性でタグ付けするか、命名スキーム(脆弱ですが、オプション)を採用することができます。
アーキテクチャの問題を無視すると、単純な答えは次のようになります。
public String getDescription(MarkDownUtil converter)
{
if (converter == null) return description;
else return MarkdownUtil.convert(description);
}
さらに良いのは、MarkDownUtilにIStringConverterを実装させることです。 さまざまなジョブの複数の異なるStringConverters。