2012-04-04 15 views
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について知っている。階層間でデータを渡すメソッド - オブジェクト間のパラメータの複製?私は何が欠けていますか?

+0

。私はなぜ「製品は店舗であるはずです」または「店舗は製品であるはずです」とは言いません。それは本当に*表示された/示唆されたものですか? –

+0

@pst - 次の割り当てでは、複数の店舗とその下にある商品が必要になります。 – tkf144

答えて

2

すべてのパラメータを上から下に渡すことでオブジェクトの階層を初期化するのは珍しいということは間違いありません。

あなたの講師は、コンポジットパターンの線に沿って何かを実装し、階層内の各クラスが共通の方法(例:getValue())を共有することを示唆しているかもしれません。 Product(すなわち葉ノード)の場合、これは単に製品の値を返すが、StoreまたはCompanyの場合はProducts(またはStores)を反復し、getValue()を呼び出して結果を合計する。

これと上記の主な違いは、通常、別のオブジェクトのデータを渡すのではなく、コンストラクタを使用して各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; 
    } 
} 
+0

ありがとうございます。私はコンポジットパターンを読んだことがありますが、この段階で私は少し上のように見えます。私はあなたが何を意味するのか把握するのに苦労しています。短いコードサンプルを提供する可能性はありますか? :)ありがとう – tkf144

+0

@トーマス:例が追加されました。 – Adamski