Распространено мнение, что приведение объектов является плохой практикой, и его следует избегать, например Почему следует следует избегать приведения? вопрос получил несколько ответов с вескими аргументами:
- Джерри Коффин:
#P2#
- Эрик Липперт:
#P3#
Переходя к моему вопросу, недавно я начал изучать исходный код известного проекта с открытым исходным кодом AutoFixture изначально был разработан Марком Симаном, что я очень ценю.
Одним из основных компонентов библиотеки является интерфейс ISpecimenBuilder
которые определяют какой-то абстрактный метод:
object Create(object request, ISpecimenContext context);
Как вы можете видеть, тип параметра запроса является объектом, и поэтому он принимает совершенно разные типы, разные реализации интерфейса обрабатывают разные запросы по их типу времени выполнения, проверяя, является ли это чем-то, с чем они имеют дело, в противном случае возвращая какое-то представление без ответа.
Кажется, что дизайн интерфейса не соответствует «хорошей практике», согласно которой приведение объектов должно использоваться редко.
Я думал про себя, есть ли лучший способ разработать этот контракт таким образом, чтобы победить все приведения, но не смог найти никакого решения.
Очевидно, что параметр объекта можно заменить каким-то маркерным интерфейсом, но он не будет избавьте нас от проблемы приведения, я также подумал, что можно использовать некоторые варианты шаблона посетителя, как описано здесь, но он не кажется очень масштабируемым, у посетителя должны быть десятки различных методов, так как существует так много разных реализаций интерфейса, способных обрабатывать разные типы запросов.
Хотя то, что я в принципе согласен с аргументами против использования кастинга как части хорошего дизайна, в данном конкретном сценарии кажется не только лучшим вариантом, но и единственно реалистичным.
Подводя итог, является ли приведение объектов и очень общие контракты неизбежностью реальности, когда есть необходимость в разработке модульной и расширяемой архитектуры?
That's not to say there's never a reason to do such a conversion, but anytime it happens, it should prompt the question of whether you could re-design the code so the correct type was used throughout.
- person Kevin Gosse   schedule 04.02.2019object
, а затем посмотрите, не применима ли эта причина в вашем конкретном случае(ах) использования... (Существует очень большая вероятность того, что авторы уже потратили много времени на поиск альтернативного решения, и это единственное, что сработало до сих пор) - person Alexei Levenkov   schedule 04.02.2019