calculatePrice(): float.
Чтобы посчитать цену свойство $price не должно быть null. Однако из-за особенностей клиентского кода значение для $price неизвестно до момента создания экземпляра AbstractPriceCalculator. То есть нельзя задать $price в конструкторе.
Добавил сеттер для $price. Однако метод calculatePrice могут вызвать до установки $price через сеттер. Как можно обойти? Выбрасывать исключение в calculatePrice, если $price === null? Но наследники могут переопределить метод и не выбрасывать исключение
0 присваивай, если null. Меньше исключений будет
да, но это может в будущем породить баги и проблемы бизнесу из-за того, что $price будет равно нулю
Хммм, тогда может не стоит вызывать calculatePrice до setPrice?
В конструкторе делай валидацию
Вариант с нулем по умолчанию хорош для отладки — это исключает неопределенное поведение. Я бы постарался сделать так: - При создании класса-потомка от AbstractPriceCalculator в конструкторе будет нуль для price. - При записи или других действиях невозможно довести до конца, если price === 0
Как уже сказал, из-за особенностей легаси клиентского кода нельзя задать $price в конструкторе
По-хорошему это значит, что класс увлькуляятор не подходит для тсоей задачи. Может быть тебя спасет какой-нить враппер вроде new CalculatorWithPrice($calculator, $price) который ты будешь передавать дальше по код. А может и не спасет. Попробуй не натягивать сову на глобус, а переработать модель под твою задачу.
FYI: описанная проблема, вернее, одно из ее проявлений, называется temporal coupling, погугли, может почерпнешь вдохновение какое-то
цены во float мммм
Статью прочитал. Сделал вывод, что можно избавится от свойства $price и передавать значение $price аргументом в calculatePrice. Выглядит очевидно
Обсуждают сегодня