1

小売店の正しいモデルは何ですか?たとえば、会社は店舗から製品を販売しています。

会社は多くの店舗を持ち、多くの製品を販売することができます。商品は必ずしも各店舗に結びついているわけではないので、と思いました。

製品の経済発注量を計算するシステムを設計するように依頼する基本的な割り当てがあります。後の割り当てに適した構造を実装することになっています(詳細はありません)。推奨される構造は次のとおりです。

public class Company {
    private Store store;

    public static void main(String[] args)
    {
        Store storeOne = new Store();

        storeOne.setEOQRelevantValues(1, etc..);
    }
}

public class Store {
    private Product product;

    //..

    public setEOQRelevantValues(int eoqRelevantValues)
    {
        Product.setEOQRelevantValues(eoqRelevantValues);
    }
}

public class Product{
    private int eoqRelevantValues;

    //..

    public setEOQRelevantValues(int eoqRelevantValues)
    {
        this.eoqRelevantValues = eoqRelevantValues;
    }

    public int calculateEOQ()
    {
        //do stuff with this.eoqRelevantValues..
        return EOQ;
    }
}

これは、私がOOPについて知っているほとんどすべてに違反しているようです。階層を介してデータを渡すメソッド-オブジェクト間でパラメーターを複製しますか?私は何が欠けていますか?

4

1 に答える 1

2

すべてのパラメータを上から下に渡してオブジェクトの階層を初期化するのは珍しいことを心配するのは正しいです。

講師は、Compositeパターンの線に沿って何かを実装することをほのめかしている可能性があります。これにより、階層内の各クラスが共通のメソッドを共有します(例getValue())。Product(つまりリーフノード)の場合、これは単に製品の値を返しますが、aStoreま​​たはの場合は、構成要素s(またはs)Companyを反復処理して、結果を呼び出して合計します。ProductStoregetValue()

これと上記で記述したものとの主な違いは、通常Product、別のオブジェクトからデータを渡すのではなく、コンストラクターを介してそれぞれを個別に初期化することです。製品が不変である場合は、そのフィールドをとしてマークすることを選択できますfinal。次に、階層内の他のクラスにユーティリティメソッドを追加することを選択できます(例moveProduct(Store store1, Store store1))。言い換えると、他のクラスは単なる「データコンテナ」ではなく動作を示します。

/**
 * Optional interface for uniting anything that can be valued.
 */
public interface Valuable {
  double getValue();
}

/**
 * Company definition.  A company's value is assessed by summing
 * the value of each of its constituent Stores.
 */
public class Company implements Valuable {
  private final Set<Store> stores = new HashSet<Store>();

  public void addStore(Store store) {
    this.stores.add(store);
  }

  public void removeStore(Store store) {
    this.stores.remove(store);
  }

  public double getValue() {
    double ret = 0.0;

    for (Store store : stores) {
      ret += store.getValue();
    }

    return ret;
  }
}

/**
 * Store definition.  A store's value is the sum of the Products contained within it.
 */
public class Store implements Valuable {
  private final List<Product> products = new LinkedList<Product>();

  public void addProduct(Product product) {
    this.products.add(product);
  }

  public void removeProduct(Product product) {
    this.products.remove(product);
  }

  public double getValue() {
    double ret = 0.0;

    for (Product product : products) {
      ret += product.getValue();
    }

    return ret;
  }
}

/**
 * Product definition.  A product has a fixed inherent value.  However, you could
 * always model a product to depreciate in value over time based on a shelf-life, etc.
 * In this case you might wish to change the Valuable interface to accept a parameter;
 * e.g. depreciationStrategy.
 */
public class Product implements Valuable {
  private final double value;

  public Product(double value) {
    this.value = value;
  }

  public double getValue() {
    return value;
  }
}
于 2012-04-04T07:41:10.527 に答える