2

私のトレーディングプログラムには、マーチャントクラスがあります。特定のマーチャントオブジェクトは、特定の特別な品質または特別な品質のバンドルを持っている場合と持っていない場合があります。たとえば、あるマーチャントオブジェクトには株式仲買人の品質があり、別のマーチャントには金融サービスと株式仲買人の品質があり、別のマーチャントには特別な品質がまったくない場合があります。

私の最初の考えは、次のようにHashMapとQualitiesクラスを作成することでした。

Map<Qualities, Boolean> merchantQualities = new HashMap<Qualities, Boolean>();

唯一の問題は、商人には少なくとも50の特別な品質が存在する可能性があるため、品質クラスからすべての品質をサブクラス化するのは非常に面倒です。

これらのオプションの特別な品質をコーディングしてMerchantsクラスで表現する方法は、HashMapを使用してQualitiesクラスをサブクラス化するよりも優れていますか?

4

2 に答える 2

10

これはすべて、彼らが何であり、何をするかに依存しQualitiesます。リストがかなり安定している場合は、enums適切な解決策になる可能性があります。

enum Quality {
  MERCHANT,
  STOCKBROKER,
  ...
}

sの良いところenumは、基本的にクラスであるため、インターフェイスを実装し、状態と動作を持たせることができることです。また、便利なヘルパークラスが付属しています。

Set<Quality> = EnumSet.of(MERCHANT, STOCKBROKER);

そうすれば、などのすべてのSet機能を使用できます。contains()

しかし、これがあなたにとって適切な解決策であるかどうかは、詳細を知らなければわかりません。

編集:多くの言語でこれを行うための一般的な出発点は列挙型です。C / C ++ / C#では、これは次のようになります。

if (merchantType == STOCKBROKER) { ... }

Javaの列挙型がどのように優れているかを次に示します。在庫タイプに別の列挙型を定義するとします。

enum StockType {
  LISTED_EQUITIES,
  MANAGED_FUNDS
}

あなたが仮定をするならば、与えられた商人タイプは1つのタイプのものを売ります:

enum MerchantType {
  STOCKBROKER(StockType.LISTED_EQUITIES),
  FINANCIAL_ADVISER(StockType.MANAGED_FUNDS);

  private final StockType stockType;

  MerchantType(StockType stockType) {
    this.stockType = stockType;
  }

  public StockType getStockType() {
    return stockType;
  }
}

だから言う代わりに:

StockType stockType;
if (merchantType == MerchantType.STOCKBROKER) {
  stockType = StockType.EQUITIES;
}
...

あなたは言う:

StockType stockType = merchantType.getStockType();

Java列挙型には状態と動作があります。これは非常に強力な概念です。

しかし、あなたはこれよりもうまくやることができます。商人ごとに1つの在庫を想定する代わりに、これは行動によってより適切に処理されます。

enum MerchantType {
  STOCKBROKER,
  FINANCIAL_ADVISER;

  private static final Map<MerchantType, Set<StockType>> STOCK_TYPES;

  static {
    STOCK_TYPES = new EnumSet<MerchantType, Set<StockType>>(MerchantType.class);
    STOCK_TYPES.put(STOCKBROKER, EnumSet.of(StockType.LISTED_EQUITIES));
    STOCK_TYPES.put(FINANCIAL_ADVISER,
      EnumSet.of(StockType.LISTED_EQUITIES, StockType.MANAGED_FUNDS));
  }

  public boolean canSell(StockType stockType) {
    Set<StockType> stockTypes = STOCK_TYPES.get(this);
    return stockTypes != null && stockTypes.contains(stockType);
  }
}

その時点で、コードは次のようになります。

if (merchantType.canSell(StockType.LISTED_EQUITIES)) {
  ...
}

これは、はるかに自然で、読みやすく、拡張可能なソリューションです。

于 2010-04-17T03:40:39.873 に答える
0

ここでデコレータパターンを使用して、さまざまなデコレータ(株式仲買人、フィンサービスなど)でマーチャントを装飾できると思います。http://en.wikipedia.org/wiki/Decorator_patternをご覧ください。

于 2010-04-17T03:57:08.037 に答える