2009-08-12 12 views
0

私は、アイテムの注文処理を行うアプリケーションの新しいドメインモデルを作成しています(とにかくこの質問のために単純すぎないようにしてください)。私は、注文可能なアイテムを表す "VendorItem"クラスを持っています。もともと、 "Order"クラスにはそれに関連するVendorItemsのリストがありましたが、これまでのところ問題が出てきました。アーキテクチャ:注文履歴の更新

このシステムでは、しばらくの間オーダーを作成しているとしましょう。ある日、ユーザーは、ベンダーアイテムが価格やパッケージサイズなどの詳細を変更したと判断します。私は前の注文がそのような変更の影響を受けるのは望ましくない。

最初は、 "VendorItem"クラスの基本的なコピーである "OrderLine"クラスを作成しようとしていましたが、オブジェクト指向の意味で間違った感じがします。

これをリファクタリングするより良い方法はありますか?ドメインモデルにクラスと情報のコピーはありませんか?

+0

注:私たちの開発サイクルでは、ドメインモデルが完全になるまでデータベースを無視して、懸念を明確に分離することができます。 –

答えて

-1

はい、とにかくあなたはあなたのアイテム、スケートなどの "製品"を表すオブジェクトアイテムを1つ持っていると思いますが、そのオブジェクトはいくつかの価格設定オブジェクトなどで構成されています。 foreach orderでは価格オブジェクトを割り当てますので、今度は価格や何かの種類を変更したときに、新しい価格オブジェクト(異なるargを持つ)をItemオブジェクトに割り当てれば、各オブジェクトを表す1つのクラスアイテムにはどのような価格と特性(時間とともに変化する可能性のある属性を表す)を定義する価格オブジェクトがあります。この例のボイラープレートは、テンプレートのようなもので、決して変更されず、あなたのPriceオブジェクトでカスタマイズされているため、アイテムです。

+0

私はこのソリューションには反対します。なぜなら、価格設定は製品にのみ関連するスタンドアローンのオブジェクト(およびデータベースのテーブル)として価格を設定するからです。また、商品アイテムを更新した商品、タイトル、説明、色などについて、他の情報が変更される可能性があり、更新前の内容が分からず、変更を簡単に追跡できなくなります。タイトルが "Superfantastical ProductX"だったとき、または "ProductX"に変更されたときに購入しましたか?詳細は私の答えを見てください。 –

0

これまでは、「バリエーション」クラスを作成しました。 VendorItemには「バリエーション」が含まれていますバリエーションはTシャツサイズ、または下着のフレーバーになります。各バリエーションには独自の価格が付いていますので、チョコレートパンティーをイチゴよりも高価にすることができます。 OrderLineクラスには、Order、Variation、数量、および価格への参照があります。 OrderLineで価格を保持するので、バリデーションの価格を監査手続きに影響を与えずに後から変更することができます。既存のアイテムを編集するのではなく、単にバリエーションを追加して、古いものを「無効」として設定することができます。

私は家族経営についてあまり教えていませんか?

0

これは主にデータベースで処理する必要があります。 VendorItemと呼ばれるすべての製品には、そのアイテムに関するすべての関連情報とともに、有効な開始(許可されていない)と有効な終了日(現在の使用を中止するまではnull)が含まれています。

注文テーブルには、その時点で販売されていたVendorItemへの外部キーを含むレコードに、0から多くの注文IDに関するCustomerIDが必要です。

このようにして、製品ラインに加えられたすべての変更を追跡し、価格変更、説明変更などの分析を容易にして、売上に影響を与えやすくします。

あなたのコードの中には、商品表から現在の商品を受け取っている注文/表示商品の処理中以外はほとんど変わりません。

+0

ドメインモデルは永続性を知らないため、データベースを設計することはできません。 –

+0

...私は、製品のオンライン注文のようなはるかに小さなシステムでこれを見ることができました。 –

+0

私の答えは、PIソリューションと完全に一致しています。私が言及したようにオブジェクト間の関係を持つ必要があります。 –

1

私は、アイテムとして実際に存在するものとして、クラスとしてではなく、あなたが知っているものすべてを最初に記述するほうがずっと簡単です。次に、情報階層を把握し、クラスを使ってそれをモデル化する方法を説明します。

例: 商品は、通常、UPC(ユニバーサルプロダクトコード - 登録されたバーコード)によって定義される1つ以上のベンダーから購入した製品です。

ベンダーはしばしばVendor Item Number(VIN)と呼ばれる内部ID番号も持っています。

のアイテムはすべて同じUPCで、さまざまなサイズと色で来ることができる - しかし、異なるコストを持つ可能性が異なるのVIN:

T-Shirt UPC 9055540022 
VIN: 40001 - Large, White - $5.00 
VIN: 40002 - Small, White - $4.00 
VIN: 40003 - Large, Green - $5.00 
etc. 

し、それらのアイテム/のVINの費用は、時間の経過とともに変化します。

注文とは、特定の時点でのアイテムのリストとそのコストのことです。したがって、注文情報には、その注文に関するアイテムのコストとその他の変更可能な情報が含まれている必要があります。

項目UPCは、あなたの情報階層の最上位に位置するのであれば:

Item - 1 record per item - Descriptive info, UPC 

Vendor - 1 record per vendor - Vendor info 

VendorItemVin - 1 record per Vendor/Item/VIN - Vendor specific info, size/color/cost etc. 

その後、あなたは、データベースのテーブルがクラスをうまくそして、どのように見えるかのアイデアを得ることができます。

+0

これは有益なポストでしたが、これは実際にアイテムのバージョン管理方法に関するOPの質問には答えていませんでした。この場合、履歴を処理するためにVIN#を期限切れにする必要があります。 –

+0

これは、各Itemが1から多くのVIN#を持つことを要求するでしょう。 –

+0

古いバージョンで使用している現在の方法はこれと似ていますが、バージョンにはまだ問題があります。私たちが今問題にしているのは、ユーザーが関係の「アイテム」側を変更していることです。これをロックして変更できないようにすることはできますが、それは現実的な選択肢ではありません。理想的には、ベンダーの商品が決して変化せず、在庫品目が変わることはないが、私たちはそれをすることはできない状況が望まれる。 –