0

以下のクラスのすべての cdl (ローソク足パターン) メソッドを TA-Libに実装したいと考えています。

約 61 の cdl 分析メソッドがあり、そのうちの約 90% が同様の署名を持っていますが、コアの実装が異なるだけです。

例えば:

 public RetCode cdl2Crows(int startIdx,
      int endIdx,
      double inOpen[],
      double inHigh[],
      double inLow[],
      double inClose[],
      MInteger outBegIdx,
      MInteger outNBElement,
      int outInteger[])


public RetCode cdl3BlackCrows(int startIdx,
      int endIdx,
      double inOpen[],
      double inHigh[],
      double inLow[],
      double inClose[],
      MInteger outBegIdx,
      MInteger outNBElement,
      int outInteger[])

ソースクラスからメソッド名を引数として渡し、リフレクションを使用してメソッドを呼び出して、コードの重複を回避できるかどうかを考えていました

public invokeAnalytic(String analyticMethodName, common params .....)
{
    // using reflection invoke analyticMethodName of Core class
    // and pass rest of the params
}
  1. このようなシナリオで従うべき Java の最適な設計パターンは何ですか?
  2. このようなシナリオでリフレクションを使用すると、パフォーマンスの問題が発生しますか?
4

5 に答える 5

2

不変のValue Objectで引数をラップするのはどうですか?

例えば

MyValueObject params = new MyValueObject(int startIdx,
    int endIdx,
    double inOpen[],
    double inHigh[],
    double inLow[],
    double inClose[],
    MInteger outBegIdx,
    MInteger outNBElement,
    int outInteger[]);

// ....
someObject.cdl2Crows(params);
// ...
someObject.cdl3BlackCrows(params);
于 2012-11-16T18:59:28.790 に答える
1
public interface CDL

    public RetCode invoke
    (
          int startIdx,
          int endIdx,
          double inOpen[],
          double inHigh[],
          double inLow[],
          double inClose[],
          MInteger outBegIdx,
          MInteger outNBElement,
          int outInteger[]
    );

static Map<String,CDL> map = new HashMap<>();


map.put("cdl2Crows", new CDL()
{ 
    public RetCode invoke(...)
    { 
        impl... 
    }
});
...
于 2012-11-16T19:12:34.600 に答える
1

共通データ ポイントの最終クラス (C の構造体に似ています) を作成し、それを引数として関数に渡します。少し重いですが、思ったほど悪くはありません (特にクラスが宣言されている場合final)。

于 2012-11-16T18:58:21.990 に答える
0

これには、戦略パターンが最適だと思います。

http://java.dzone.com/articles/design-patterns-strategy

于 2012-11-16T20:01:09.453 に答える
0

この場合、リフレクションは避ける必要があります。タイピングが少なくなるだけで、安全性とパフォーマンスの両方が失われるからです。

この場合、メソッド シグネチャが同じ場所/実装の詳細が共有されている場所に基づいて、インターフェイスの階層または抽象クラスのいずれかを使用します。

于 2012-11-16T18:55:54.197 に答える