2010-11-19 20 views
-1

私はC#を使って(仮説的な)アプリケーション - オンラインストアを作成しています。 (データ構造の設計は静的型の言語です

  • 製品番号(必須)
  • 名(必須)
  • 価格(必須)
  • 評価:

    私は、各製品には、以下の情報が関連付けられた、製品のデータベースを持っています

  • 販売数量(オプション) - これは、この商品の総額であり、

私は、製品のフィルタリングされたリストを示す4ページを持っています。ページには、製品ごとに異なる情報を表示:

  • 1ページ目:PN、名前、価格
  • 2ページ目:PN、名前、価格、評価
  • 3Dページ:PN、名前、価格、販売数量
  • 4ページ目:PN、名前、価格、評価、販売数量

私の質問はで、どのように私は少し重複してすべての私のページに対応するためのデータ構造を設計していますか?

ブルートフォースアプローチ各ページの種類を作成することです:

IList<Product> 
IList<ProductWithRating> 
IList<ProductWithSoldQuantity> 
IList<ProductWithRatingAndSoldQuantity> 

後の3はProductから派生することができますが、原因多重継承ProductWithRatingAndSoldQuantityの欠如に評価し、SoldQuantity製品の両方から派生することはできません。

動的言語では、私が必要とするフィールドを追加して満足しています。別のdictonaries、例えば中

だから私は、余分な情報を格納することにより、動的言語のアプローチをシミュレートすることができ(評価、数量販売):

{ 
    IList<Product> Products; 
    IDictionary<Product, Rating> ProductRatings; 
    IDictionary<Product, SoldQuantity> ProductSoldQuantities; 
} 
// is equivalent to 
IList<ProductWithRatingAndSoldQuantities> 

がすべてを含み、その後、部分的に周りを通過製品構造の構築初期化されたオブジェクトはではなく、私が探している解決策です。

提案がありますか?

答えて

1

コメントで返信する文字が不十分です。

単一のドメインオブジェクトProductが必要です。これらのものを持たない製品を所有することはできないため、名前とProductNumberとPriceはnullを使用できません。

格付けのない製品を持つことができるため、格付けはNULL可能でなければなりません。製品の定格にかかわらず、それは常に製品です。私はQuantitySoldを残しておきます。なぜなら、私は実際にそれを製品のプロパティとして保管しないからです。私はOrdersとOrderLineコレクションを持ち、それらからQuantitySoldを計算します(正規化)。しかし、他のコレクションがない場合は、Productにフィールドとして格納することができます。もしそれをやろうとすれば、null不可能な整数プロパティーになります。デフォルトはゼロです。

IEnumerableやIQueryableのいずれかの実装であるフィルタリングするコレクションは1つだけ必要ですが、Entity Frameworkのようなものを選択して実際にObjectSetを使用しますが、デザインにとらわれないようにしていますどのようなストレージ方法を使用しているのか、それらのインターフェースに対して作業しています。

次に、単一のコレクションを照会して、ドメインモデル内の製品でどの属性がnullであるかを識別できます。構文は完璧ではないかもしれませんが、何もIntellisenseは拾いません、私はVBの男99%の時間です。

var productsWithNoSales = Context.Products.Where(p=> p.QuantitySold == 0); 
var productsWithNoRating = Context.Products.Where(p=> p.Rating == nothing); 
var productsWithNoSalesOrRating = Context.Products.Where(p=> p.QuantitySold == 0).Where(p=> p.Rating == nothing); 

これは、あなたが後にしているもののための最もきれいな可能なドメインモデルです。

追加のプロパティまたは異なる動作のいずれかを持つ、製品の特殊化された派生商品があれば継承されます。たとえば、私自身のシステムには基本Productクラスがあり、EbayProductとAmazonProductエンティティはProductから継承され、これらのサイトでの作業に関連する余分なロジックとプロパティのみを含んでいます。 My Productクラスには約20のプロパティがあります。ほとんどの場合、nullableです。製品をリストするときに、必ずしもすべての情報が利用可能なわけではありません。これらの20のうち、1ページに表示される最も多くのものは約15です。私はおそらくあなたが何をしようとしているのかと同様のことをします。不足しているフィールドの私の商品コレクション。

+0

ああ、私が 'ProductWithRating'と言ったとき、私は** rating **を属性として持つ** type **の名前を意味しました。 'ProductWithRating' **は、評価のある商品のみのコレクションを意味しません**。 –

+0

私は意味があるように多くの属性や少数の属性を設定します。私はEF4を使ってすべてのデータベース項目を処理するので、すべてのデータベースフィールドを戻して意味を持ち、実際には仮想プロパティなどのプロキシを使用してDBからオブジェクトをインスタンス化します。あなたのMyRatingに関しては、もしそれがかなり疎れていれば、おそらくそれをProductと0..1-1の関係を持つ新しいエンティティ/タイプとして追加することになるでしょう(製品は0または1のMyRatings、MyRatingはちょうど1 Productを持つことができます)。 ProductWithRatingルートは、痛いほど速く、どんなコストでも避けられます。 – RichardW1001

+0

EFからView/ViewModelにProductを渡しますか? –

1

なぜRatingSoldQuantityをnullにできないのですか?または常に存在するが、必ずしも常に表示されるとは限りませんか?

+0

システムに追加する新しいページごとにnull値のプロパティを追加し続けることをお勧めしますか?これはクラスを膨らませ、ページ間の依存関係を導入します(あるページを変更すると、他のページを再コンパイルする必要があるかもしれません)。これはまた、「部分的に初期化するオブジェクトの反パターン」を構成する。 –

1

属性として販売された評価と数量を保存し、それらが存在するかどうかを示すブール値を保存できますか?私はあなたがおそらく作曲をしているときに継承を使っていると思います。

+0

まさに私が考えていたもの。 –

+0

システムに追加する新しいページごとに、(基本的に)null可能なプロパティを追加したままにすることをお勧めしますか?これはクラスを膨らませ、ページ間の依存関係を導入します(あるページを変更すると、他のページを再コンパイルする必要があるかもしれません)。これはまた、「部分的に初期化されたオブジェクトの反パターン」を構成する。 –

+0

私はここで継承を主張していません、私はそれを* brute force * solutionの例として挙げました。 –

0

あなたが使用しているものを指定することはおそらく可能でしょうか?最初にあなたの「ページ」は何ですか?あなたのデータ保存方法は何ですか?

データを保存してデータを表示しているようですが、データが存在するために表示するという義務はありません。

あなたのオブジェクトドメインには、ほぼ確実に製品があるはずです。データ記憶装置は、プロパティがヌル可能であるように設定され、ヌルをチェックしてデータを戻す。

あなたはLINQのようなものを使用している場合、あなたは、単に

var productsWithoutRating = Context.Products.Where(p => p.Rating == nothing); 

ような何か辞書アイデア、継承、構図のすべてを行うことができますビット奇妙に見えます。プロパティが存在するかどうかを示す独立したブール値を格納することは面倒であり、維持するのは悪夢になります。

+0

'Product'データ型にどこかで使用できる情報を追加することをお勧めしますか?私はページを追加するので、 'Product'データ構造は今後も増え続けます。新しいページを追加するたびに、 'Product'に依存するすべてのコンポーネントを再コンパイルする必要があります。それが悪い設計をする理由の1つです。 –

+0

また、一部の属性は存在するだけでなく、適用できない属性もあります。例えば、私は 'MyRating'フィールドを追加して、手渡しのための価格リストを生成します。 「MyRating」はこのような意味では意味がありません。 –

+0

あなたが実際にやろうとしていることについて、まだかなり泥だらけですか?どのような技術など?大規模な問題を再コンパイルしていますか?確かにフィールドを頻繁に追加するだけなので、デザインが成熟すれば新しいビルドをリリースすることは問題にならないでしょうか?もう1つのアプローチは、MVVM(model-view-viewmodel)パターンを使用し、進化を続ける単一のデータクラスを持つことですが、カスタマイズされた各ページのビューモデルです。 – RichardW1001

関連する問題