Страницы

Поиск по вопросам

четверг, 27 декабря 2018 г.

Кастинг в коде это нормально?

Кастинг в коде это нормальное явление или повод задуматься над тем что, что то с кодом не так?


Ответ

Кастинг, кастингу рознь. К примеру, если у вас в коде есть static_cast, то это может быть подозрительно, но вряд-ли опасно. Тем не менее, даже со static_cast нужно убедиться, что это не просто безответственная попытка «заткнуть» компилятор, а явное и нужное преобразование. Как правило, такие вещи нужны на стыке кода библиотек, но, в идеальном случае лучше избегать и static_cast
Если у вас в коде появляется dynamic_cast, то есть вероятность, что вы неправильно используете полиморфизм. Тем не менее, с точки зрения корректности программы, dynamic_cast не является проблемой. Он не может ничего такого добавить, чтобы сделало программу некорректной(т.е. он не служит «затычкой» компилятора). Поэтому наличие dynamic_cast может служить признаком неправильного дизайна(и пессимизации), но не более того.
Если у вас в коде есть const_cast, то наиболее вероятно, что у вас в коде имеет место ошибка дизайна, которая должна быть исправлена как можно скорее. В противном случае вы сами знаете, что делаете и const_cast там не случаен. Прибегать к нему стоит лишь в том случае, когда других вариантов уже не осталось. И даже в этом случае стоит 100 раз всё обдумать и взвесить, т.к. const_cast не снимает константность с объектов, которые были рождены таковыми изначально. Точнее он может снять, а может и не снять — UB, если не ошибаюсь будет в этом случае.
Наконец, если у вас в коде есть reinterpret_cast и он не находится в коде, который работает на стыке кроссплатформенного модуля и модуля специфичного конкретной ОС, то у вас с большой долей вероятности есть проблема.
Если же у вас в коде есть C-style касты, то, сначала, замените их на C++ аналоги, а потом удалите те, что не являются необходимостью.
В целом, любой оператор явного преобразования является потенциальной проблемой, поэтому их использование желательно свести к минимуму. Каждое такое использование должно иметь смысл и быть необходимым.

Комментариев нет:

Отправить комментарий