Я согласен с тем, что поддерживать операторы switch по всей вашей кодовой базе сложнее и плохо масштабируется.
Однако, если Sword
и Bow
не зависят от класса, содержащего Attack
метод, то у вас нет другого выбора. И для этого есть много примеров, таких как сериализация (как упоминалось в NibblyPig), но также и при создании уровня представления, ViewModel и т. Д. *
Если Sword
и Bow
не несут ответственностиобработки атаки (где релевантен SRP), и у вас есть определенный класс для этого случая, тогда вам придется переключаться между различными типами. Вы не хотите, чтобы у Sword
был метод, который имеет дело с сериализацией, и метод, который имеет дело с тем, какой цвет будет Sword
в одном конкретном меню и т. Д ...
Конечно, это полезно, если выэтого можно избежать, создав интеллектуальные интерфейсы, которые абстрагируют тип и просто позволяют вам получить доступ к необходимой информации, но иногда у вас нет других вариантов.
Кроме того, иногда языковые функции могут помочь в работе с устаревшим кодом ине является показателем рекомендуемой передовой практики.