Considera il seguente esempio (molto semplificato):
public class Basket
{
private readonly List<BasketItem> _items = new List<BasketItem>();
public IReadOnlyCollection<BasketItem> Items => _items;
// _items.Sum(item=>item.TotalAmount)
public decimal TotalAmount { get; private set; }
// ...other properties ...
public void ChangeItemQuantity(BasketItem item, decimal quantity)
{
if (item == null) throw new ArgumentNullException(nameof(item));
///////////////////////////////////
// code duplication
if (quantity <= 0) throw new ArgumentOutOfRangeException(nameof(quantity));
///////////////////////////////////
item.ChangeQuantity(quantity);
// recalculates basket totals, items.Sum(item=>item.TotalAmount)
RecalculateTotals();
}
}
public class BasketItem
{
public decimal Quantity { get; private set; }
public decimal TotalAmount { get; private set; } // quantity * price
// ...other properties ...
public void ChangeQuantity(decimal quantity)
{
///////////////////////////////////
// code duplication
if (quantity <= 0) throw new ArgumentOutOfRangeException(nameof(quantity));
///////////////////////////////////
Quantity = quantity;
RecalculateTotals(); // recalculates item total (price * quantity)
}
}
Come puoi vedere, incapsulo molto le cose (sto davvero considerando di allontanarmi da OOP).
Il problema che vedo con questo codice è che eseguo la stessa validazione in 2 punti. In realtà è la stessa convalida in 3 posizioni perché ce n'è una aggiuntiva ai confini (livello API / UI).
Potresti dirmi per favore, è la convalida in Basket.ChangeItemQuantity
ridondante?