Анализ кода YandereDev: антипаттерны и проблемы

Этот анализ демонстрирует множество антипаттернов и проблем, замедляющих разработку и приводящих к нестабильному коду проекта YandereDev. Рассмотрим несколько примеров.

Неэффективное использование анимаций и состояний

Определение конфигурации студента на основе его ID (4 или 5) приводит к неэффективной императивной логике. Изменение анимации (например, юбки) в зависимости от ID следует решать через префабы. Разные состояния студента должны представляться различными префабами, а не управляться условными операторами внутри одного класса.

Отсутствие полиморфизма и чрезмерное использование одного большого класса

Класс Student содержит 16000 строк кода. Наследование от такого класса и изменение поведения в производных классах — некорректный подход. Решение — декомпозиция этого класса на множество подкомпонентов, собираемых на префабе. Это позволит использовать композицию вместо наследования. Можно создать фасады для управления этими компонентами.

Моделирование отношений между студентами

Взаимодействие между студентами (например, наблюдение, оплакивание) реализовано неэффективно. Необходимо создать классы Relationship и RelationshipType, моделирующие отношения между студентами. Это позволит избежать дублирования кода и улучшит читаемость. Взаимодействие должно строиться на основе событий, а не на прямом доступе к полям объектов.

Управление эмоциями

Управление эмоциями студентов должно осуществляться через отдельный класс Emotions, предоставляющий понятный интерфейс для запуска анимаций и действий, избегая дублирования кода. Анимации и переходы между ними лучше определять в отдельном классе, используя, например, систему расписания анимаций.

Неэффективное использование типов данных и объектов

В коде используется антипаттерн «anaemic domain model». Вместо создания объектов оружия с полями (урон, дистанция), используются типы данных (например, WeaponType), и логика работы с оружием размазана по всему коду. Необходимо создать классы оружия (например, Knife, Katana) с соответствующими полями и методами.

Hardcoding значений и неявные связи

Многие значения hardcoded (записаны напрямую в код), что затрудняет изменение и поддержку кода. Например, дистанция атаки оружия зависит от типа оружия и режима скрытности, что реализовано неэффективно и нечитабельно. Неявные связи между компонентами (например, зависимость от значения поля fillAmount спрайта) приводят к плохому разделению ответственности и затрудняют отладку. Такие связи должны быть явными, через события или другие механизмы. Отсутствие четко определённых слоёв приложения (модель, представление, контроллер) усугубляет проблему. Необходимо разделить модель, представление и контроллер, используя, например, паттерн MVC или MVVM.

Код проекта YandereDev демонстрирует множество серьёзных проблем, связанных с архитектурой, дизайном и написанием кода. Применение принципов SOLID, паттернов проектирования и более чёткой структуризации кода значительно улучшит его качество и упростит дальнейшую разработку.

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