私はアドバイスを求めたり、「あなたは何と思いますか?私は考えていますか?これはです。読んで、あなたの考えを知らせてください。受注クラスに料金表や割引を組み込むか、商品ラインにする必要がありますか
説明よりも表示が簡単ですが、アプリは本質的に3つの主要な部分(商品、OrderItems、Order)を持つPOSアプリと似ています。
アイテムクラスは、データストアからのデータです。
public class Item
: IComparable<OrderItem>, IEquatable<OrderItem>
{
public Int32 ID { get; set; }
public String Description { get; set; }
public decimal Cost { get; set; }
public Item(Int32 id, String description, decimal cost)
{
ID = id;
Description = description;
Cost = cost;
}
// Extraneous Detail Omitted
}
オーダーアイテムクラスはオーダーのアイテムラインです。あなたは順番に手数料や割引を追加するとき
public class OrderItem
: Item, IBillableItem, IComparable<OrderItem>, IEquatable<OrderItem>
{
// IBillableItem members
public Boolean IsTaxed { get; set; }
public decimal ExtendedCost { get { return Cost * Quantity; } }
public Int32 Quantity { get; set; }
public OrderItem (Item i, Int32 quantity)
: base(i.ID, i.Description, i.Cost)
{
Quantity = quantity;
IsTaxed = false;
}
// Extraneous Detail Omitted
}
は現在、それは同じくらい簡単です:私はそれが好き
Order order = new Order();
// Fee
order.Add(new OrderItem(new Item("Admin Fee", 20), 1));
// Discount
order.Add(new OrderItem(new Item("Today's Special", -5), 1));
、それは感覚とOrderは内の項目を反復処理を継承する基本クラスを作ります適切な税金を計算し、他のOrder-type文書(2がある)が、何も補完せずにこれをすべて計算する基本クラスから継承できるようにします。オーダー・タイプの文書に割引がない場合は、$ value OrderItemを追加しないだけの簡単な方法です。
唯一の問題は、このデータを表示することです。このフォームには、販売アイテム(つまり、手数料/割引ではない)を表示するグリッドがあります。同様に、特定の料金と特定の割引のテキストボックスがあります。私はこのクラスのフィールドにそれらのUI要素をデータバインドしたいので、ユーザー(と私)にとっては簡単です。 IHasFees、IHasDiscountsをとOrderはそれらを実装する必要があり;:
MY THOUGHT
2つのインターフェイスを持っていますどちらもリストの単一メンバーを持ちます。そうすれば、私はセールアイテムだけにアクセスすることができ、料金と唯一の割引(必要ならばコントロールにバインド)することができます。
私はそれについて好きではない: - 今、私は3種類のアドオンは、/クラス(AddItemメソッド/ AddFee/AddDiscount /削除...) ための方法を取り除く持っている - 私はtriplicating(複製てる? )機能はすべて同じタイプのアイテムのリストであり、各リストは異なる意味を持つからです。
私は正しい経路にいますか?私はこれが大部分の人にとって解決された問題であると考えています(この種のソフトウェアは非常に一般的です)。
public IList<OrderItem> Fees
{
get
{
return _items.Find(i=>i.ItemType==ItemType.Fee);
}
}
を今、あなたはまだあなたの単一のリストを維持し、余分なインターフェースを避けることができます。
IHasFeesとIHasDiscounts音不器用にLOLCatsが好きです。 –