Стоит ли изменять тип параметра в методе TryProcessOrder

Учитывая вышесказанное, я хочу с вами присмотреться к методу 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, что давало бы нам гарантию стоимости товара.

Было бы очень неловко разрушать это всё одним виртуальным методом, который бы сделал платный заказ опять бесплатным.

Если вы нашли ошибку, пожалуйста выделите её и нажмите Ctrl+Enter.


Leave a Reply

Your email address will not be published. Required fields are marked *