Рефакторинг Unity: Удалим управляющий флаг

Исходный код и его проблема

Класс изменяет материал игрового объекта в зависимости от состояний selected и unselected. Он использует два материала: selectedMaterial и unselectedMaterial, и управляющий флаг для переключения между ними. Такой подход неудобен и затрудняет поддержку и расширение кода.

Первый этап рефакторинга: улучшение структуры и имен

Добавим [RequireComponent(typeof(Renderer))] для явного указания зависимости от компонента Renderer, избегая ошибок, связанных с отсутствием необходимых компонентов.

Переименуем переменные selectedMaterial и unselectedMaterial в selectedMaterial и defaultMaterial для повышения понятности. Вместо MaterialSelection, подходящими названиями компонента будут TemporaryMaterialChange, ReversibleMaterialChange или название, связанное с игровой логикой. Вариант SelectAB также допустим.

Удаление управляющего флага

Управляющий флаг (isSelected) снижает читаемость кода. Заменим его на два отдельных метода: Select и Unselect. Это повысит понятность и структуру кода, избавив от условных операторов if (isSelected).

Вместо тернарного оператора, который может ухудшить читаемость, создадим метод GetMaterial, возвращающий нужный материал в зависимости от состояния объекта. Это повысит читаемость и поддерживаемость кода.

Работа с методами и событиями

Использование булевых значений внутри методов — плохая практика. Лучше использовать два отдельных метода: Select и Unselect. Они будут управлять состоянием объекта напрямую, без передачи булевых значений.

Предотвращение конфликтов и race conditions

Несколько компонентов, изменяющих один и тот же Renderer, могут приводить к конфликтам (race conditions). Создадим фасад на игровом объекте для контроля доступа к изменению материала, предотвращая конфликты и обеспечивая предсказуемое поведение. Фасад абстрагирует доступ к внутреннему состоянию объекта, делая код более устойчивым и легко поддерживаемым.

Рефакторинг позволил избавиться от управляющего флага, улучшить читаемость и поддерживаемость, а также предотвратить потенциальные конфликты. Использование отдельных методов для управления состоянием объекта и фасад для контроля доступа к изменению материала делают код более структурированным и надежным. Важно помнить о принципах чистого кода и стремиться к созданию легко понимаемого и поддерживаемого кода.

Что будем искать? Например,программа