1

単純な(そしておそらく非常に一般的な)設計上の問題があります。次のようなインターフェイスがあるとします。

public interface AnalysisResult {

    BigDecimal getMeasure();

}

ただし、これは後でいくつかの異なる具体的な実装によって実装されます。平均フィールドも含むものもあれば、さまざまなプロパティのカウントを含むものもありますAnalysisResult。タイプ、つまり平均結果は、メジャーなどの上に平均が何であるかを示します。これを行う1つの方法は、インターフェイス sayoutputResult()でメソッドを公開することですが、問題は、HTML形式で結果を出力したい場合があることです。 CSV と他の多くの方法があるため、それぞれにメソッドが必要です。また、「これが平均結果です」など、タイプに基づいて何かを出力したい場合もあります...この場合、単純に使用instanceofして作業を行う方が簡単だと思いますか?アウトプット側?

4

4 に答える 4

1

私はさらに拡張します..次のようなものです

public interface Measure {
   public String getOutputAsTxt();
   public String getOutputAsCsv();
   public String getOutputAsFunnyFormat();
};

public interface AnalysisResult {

  public Measure getMeasure();

}

したがって、出力の特殊化を特定のメジャーに移動します。はい、これにより少しコードが追加されますが、すべてがきちんと分離された状態になります。

または、Visitor パターン (これは一種の単純な実装です) を少し調べてみます。

詳細については、このSOの質問で選択した回答を参照してください(読むたびに、その素晴らしさを+1したいという衝動を感じます)

于 2012-12-18T08:50:19.813 に答える
0

結果データを一般的なxml形式で保存し、XSLTを使用して生データを目的の形式に変換します。JUnitはこれをテスト結果で行います。後で別の形式を追加することにしたときに、コードを変更する必要はありません。

于 2012-12-18T08:59:59.903 に答える
0

インターフェイスでメソッド public String getOutput(String format) を使用することをお勧めします。

「フォーマット」引数に基づいて何を返すかを実装に決定させます。

これは、特定の実装に固有のメソッドを呼び出すのにも役立ちます。

于 2012-12-18T08:55:04.817 に答える
0

タイプに応じた結果:

これは別の動作であるため、Strategy Patternのようなものを実装することをお勧めします。メソッド print() を持つ基本インターフェースを用意します。次に、CSVStylePrint、HTMLStylePrint などの複数の実装クラスでこのメソッドを実装できます。

このようにして、印刷機能が分離され、OCP (オープン クローズの原則: 拡張はオープン、変更はクローズ) の原則に従います。OCP は、ストラテジー パターンで使用される基本的な設計原則です。

于 2012-12-18T08:53:23.220 に答える