Нет, это определенно не всегда неправильно.
Например, предположим, что в C # у вас есть обработчик событий, который получает параметр отправителя
, представляющий отправителя события. Теперь вы можете подключить этот обработчик событий к нескольким кнопкам, но вы знаете, что они всегда кнопки. Разумно преобразовать отправителя
в кнопку
в этом коде.
Это только один пример - есть много других. Иногда это просто способ обойти немного неудобный API, в других случаях это происходит из-за невозможности четко выразить тип в нормальной системе типов. Например, у вас может быть соответствующий инкапсулированный Dictionary
, с универсальными методами для добавления и извлечения значений - где значение записи имеет тип ключа. Приведение здесь совершенно естественно - вы можете видеть, что оно всегда будет работать, и это обеспечивает большую безопасность типов для остальной системы.
Я бы попробовал использовать тот же подход, что и собственные приложения для Android, поскольку исходный код доступен. Например, Контакты .
Проверьте, что они делают при поиске контакта.
-121--3713217-Если автоматизированному сценарию необходимо запустить что-либо с паролем, то необходимо либо обеспечить его считывание сценарием (что открывает возможность его чтения кем-либо другим), либо не предоставить его в автоматическом режиме.
Хитрость состоит в том, чтобы обойти часть «Автоматизация», имея однократный запуск: запустить сценарий как небольшой непрерывный процесс, который будет периодически просыпаться и запускаться. Попросите процесс ввести пароль при запуске или через другой вид запроса API (не в командной строке!).
Если сервер перезагружается, пароль теряется до тех пор, пока вы не войдете в систему и не введете пароль снова. Таким образом, пароль находится только в памяти, а не в файловой системе.
Может потребоваться, чтобы cron-задание проверяло процесс и предупреждало, если он не запущен.
-121--5086040-Это никогда не является идеальным решением и его следует избегать везде, где это возможно - если только альтернатива не будет хуже. Иногда этого невозможно избежать, например, библиотека Java Standard API pre-Generics имела множество классов (наиболее заметных коллекций), которые требовали понижения, чтобы быть полезными. И иногда, изменение конструкции, чтобы избежать downcast значительно усложняет его, так что downcast является лучшим решением.
Примером «легального» понижающего преобразования является версия Java pre 5.0, в которой при доступе к элементам контейнера приходилось понижать их до их конкретного типа. В этом контексте это было неизбежно. Это также показывает и другую сторону вопроса: если вам нужно сильно упасть в данной ситуации, это начинает плохо, поэтому лучше найти другое решение, не понижая. Это привело к появлению универсальных шаблонов в Java 5.
Джон Влиссидес много анализирует эту проблему (также известную как «Отмывание типов») в своей превосходной книге Pattern Hatching (практически продолжении Design Patterns). ).