Учитывая вышесказанное, я хочу с вами присмотреться к методу TryProcessOrder из класса WendingMachine.
Фрагмент 2.32
public bool TryProcessOrder(IOrder order)
{
if (IsOrderPossible(order))
{
Balance -= order.GetTotalPrice();
order.Ship();
return true;
}
else
{
return false;
}
}
Напоминаю, что этот метод снимает баланс вендингового аппарата и делегирует доставку заказа обратно заказу. Внимание на себя обращает строка со снятием баланса. В ней мы всё-таки предполагаем, что заказ чего-то стоит.
Так ли это? Это сложный вопрос. Сначала спросим у абстракции действительно ли она говорит о том, что заказ может чего-то стоить?
Фрагмент 2.33
interface IOrder
{
bool IsAvailable { get; }
int GetTotalPrice();
void Ship();
}
Метод GetTotalPrice описан таким образом, что он возвращает тип int. А это означает, что он может вернуть и ноль, и отрицательное число. Так верно ли предположение о том, что заказ чего-то стоит? Нет.
Поэтому, в классе WendingMachine мы не можем на это рассчитывать. И если бы мы хотели иметь дело только с заказами, которые предоставляют какую-либо ценность, мы бы изменили тип параметра с IOrder на PayableOrder, что давало бы нам гарантию стоимости товара.
Было бы очень неловко разрушать это всё одним виртуальным методом, который бы сделал платный заказ опять бесплатным.