Поскольку это вопрос дизайна, правильного ответа не будет, вам нужно сделать выбор, который может быть хорошим или не очень хорошим.
Не следует добавлять метод для определенного класса, поскольку он будет нарушать Liskov substitution principle
Объекты в программе должны заменяться экземплярами их подтипов без изменения правильности этой программы.
Вы можете инициализировать calibration
в конструкторе CalibratedSensorDecorator
и использовать его при выполнении требуемой функции.
Если это не соответствует вашим требованиям, то, возможно, CalibratedSensorDecorator
не входит в вашу иерархию датчиков. Попробуйте разделить его и использовать шаблон «Стратегия», чтобы решить, какой из них использовать.
Редактировать 1:
что я понимаю, это не говорит о том, что вы не должны добавлять методы к подтипам?
Да, вы правы. Он не запрещает добавлять методы, но если методы изменяют состояние объекта, его следует пересмотреть. Все эти шаблоны являются лишь рекомендациями, которые можно настроить в соответствии с нашими потребностями.
Чтобы объяснить мое обоснование:
Представьте, что вы создали setCalibration()
на CalibratedSensorDecorator
. Вы можете использовать CalibratedSensorDecorator
как для внутреннего разработчика, так и для внешнего разработчика. Вы создали Фабрику, которая просто возвращает IMeasureSensor
следующим образом:
public IMeasureSensor getCalibratedSensor(){
...
}
Теперь пользователь вашего API просто получает это и рад, что его / ее текущий код работает. Но понимает, что он / она пропустил до setCalibration()
, который был найден после часов отладки. Более того, он / она должен написать код проверки типа и кода приведения типов, чтобы использовать эту функцию, что может не подойти для чистого кода.
Вы должны стараться, чтобы ваши классы были как можно более неизменными, чтобы отладка и обслуживание были легкими. Нет ничего плохого в воссоздании объекта, так как старый будет собирать мусор.
Опять же, это только мое предложение, ваше решение тщательно обдумать, что лучше для вашего варианта использования. Вы по-прежнему можете использовать новый подход к созданию метода, если он является обязательным, и обеспечить надлежащую документацию, чтобы пользователь мог понять его использование.