2

クラス内で計算されたものを書くための優れたパフォーマンスと読みやすさの方法が見つかりません。次のクラスと、FinalPrice を取得するすべての方法を想像してください。

public class Order {
    public Order(Product[] products) {
        Items = products;

オプション 1: 計算したい各プロパティの変数宣言を持つこと、恐ろしい可読性


        var orderPrice = products.Sum(p => p.Price * p.Quantity);
        var orderTaxes = products.Sum(p => p.Taxes * p.Quantity);
        var orderDiscount = products.Sum(p => p.Price * p.Quantity * p.Discount);

        OrderPrice = orderPrice;
        OrderTaxes = orderTaxes;
        OrderDiscount = orderDiscount;

        FinalPrice = orderPrice + orderTaxes - orderDiscount;

オプション 2: クラスでの順序の問題が問題になります。FinalPrice ラインを他のラインより前にすることはできません。そうしないと機能しませんが、エラーはスローされません。


        OrderPrice = products.Sum(p => p.Price * p.Quantity);
        OrderTaxes = products.Sum(p => p.Taxes * p.Quantity);
        OrderDiscount = products.Sum(p=> p.Price * p.Quantity * p.Discount);

        FinalPrice = OrderPrice + OrderTaxes - OrderDiscount;

オプション 3: すべての式を書き直す - メンテナンスに悪い。後で価格の違いを導入する可能性が最も高い.


        FinalPrice = products.Sum(p => p.Price * p.Quantity) + 
                     products.Sum(p => p.Taxes * p.Quantity) - 
                     products.Sum(p => p.Price * p.Quantity * p.Discount);

    }

オプション 4: ゲッターの使用。これは呼び出されるたびに計算されます。これは単純な計算ですが、より多くのコードが重く想定されています。


    public decimal FinalPrice { get {
        return OrderPrice + OrderTaxes - OrderDiscount;
    } }
}

オプション 5: 関数を使用します。これは良いことか悪いことか??


    public decimal CalculateFinalPrice() {
        return OrderPrice + OrderTaxes - OrderDiscount;
    }
4

2 に答える 2

4

CalculateFinalPriceCalculateOrderPriceCalculateOrderTaxesおよびのメソッドを次のように作成しますCalculateOrderDiscount

public decimal CalculateFinalPrice() {
    return CalculateOrderPrice() + CalculateOrderTaxes() - CalculateOrderDiscount();
}

public decimal CalculateOrderPrice()
{
    // Logic here to calculate order price
    return theOrderPrice;
}

public decimal CalculateOrderTaxes()
{
    // Logic here to calculate order taxes
    return theOrderTaxes;
}

public decimal CalculateOrderDiscount()
{
    // Logic here to calcuate order discount
    return theOrderDiscount;
}

これにより、各メソッドが単一の責任を負うため、保守、読み取り、および単体テストが容易な、より多くの小さい断片が提供されます。

于 2013-08-29T04:47:13.300 に答える