Я не могу найти хороший способ и удобочитаемость, чтобы написать некоторые вычисления внутри класса. Представьте себе следующий класс и все способы, чтобы получить FinalPrice:Getter, Function или просто установить его на конструкторе?
public class Order {
public Order(Product[] products) {
Items = products;
вариант 1: Having объявление переменной для каждого свойства, которые хотят быть вычислен, ужасный читаемость
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: переписывание все формулы - плохо для manteinance. Скорее всего, позже введут различия в ценах.
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;
}
Вы можете добавить что-то с кэш-сценарием? вы имеете в виду сохранение значений в частных свойствах? также любое преимущество использования геттеров вместо функций? –
@Bart. Да, вы можете хранить кеш в частной области, используя Lazy. Когда использовать свойства или когда использовать функции без параметров. Это долгая история. На данный момент я должен сказать, что если vanlue никогда не изменится И если в первый раз вы используете свойство, это не очень медленно, но вы можете использовать свойство (кэширование). –
@AlexSiepman сторона примечание. Кэширование в порядке. Но вам нужно обеспечить, чтобы недействительность кеша, если кто-то изменяет состояние объекта 'Order' (если класс' Order' является изменяемым, что кажется не в этом примере. Когда объект 'Order' создается с помощью' Product' массив, я думаю, что ни один клиент не изменит массив.) – Imran