170 похожих чатов

Класс AbstractPriceCalculator имеет свойство protected float $price и метод public

calculatePrice(): float.

Чтобы посчитать цену свойство $price не должно быть null. Однако из-за особенностей клиентского кода значение для $price неизвестно до момента создания экземпляра AbstractPriceCalculator. То есть нельзя задать $price в конструкторе.

Добавил сеттер для $price. Однако метод calculatePrice могут вызвать до установки $price через сеттер. Как можно обойти? Выбрасывать исключение в calculatePrice, если $price === null? Но наследники могут переопределить метод и не выбрасывать исключение

10 ответов

8 просмотров

0 присваивай, если null. Меньше исключений будет

W.-Blazkowicz Автор вопроса
Ярослав Халюзов
0 присваивай, если null. Меньше исключений будет

да, но это может в будущем породить баги и проблемы бизнесу из-за того, что $price будет равно нулю

W. Blazkowicz
да, но это может в будущем породить баги и проблем...

Хммм, тогда может не стоит вызывать calculatePrice до setPrice?

W. Blazkowicz
да, но это может в будущем породить баги и проблем...

Вариант с нулем по умолчанию хорош для отладки — это исключает неопределенное поведение. Я бы постарался сделать так: - При создании класса-потомка от AbstractPriceCalculator в конструкторе будет нуль для price. - При записи или других действиях невозможно довести до конца, если price === 0

W.-Blazkowicz Автор вопроса
Nikolay Underground
В конструкторе делай валидацию

Как уже сказал, из-за особенностей легаси клиентского кода нельзя задать $price в конструкторе

По-хорошему это значит, что класс увлькуляятор не подходит для тсоей задачи. Может быть тебя спасет какой-нить враппер вроде new CalculatorWithPrice($calculator, $price) который ты будешь передавать дальше по код. А может и не спасет. Попробуй не натягивать сову на глобус, а переработать модель под твою задачу.

FYI: описанная проблема, вернее, одно из ее проявлений, называется temporal coupling, погугли, может почерпнешь вдохновение какое-то

цены во float мммм

W.-Blazkowicz Автор вопроса
🐴
FYI: описанная проблема, вернее, одно из ее проявл...

Статью прочитал. Сделал вывод, что можно избавится от свойства $price и передавать значение $price аргументом в calculatePrice. Выглядит очевидно

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
How to create an OS in C? what to study?
Linus
18
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
9
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
Карта сайта