C#

Code Review моего скрипта.

Реши изучить ООП (обьектно ориентированное программирование), начал с изучения "Инкапсуляция" и хотел бы посмотреть на сколько хорошо усвоил тему. Я написал простой проект из 3-ех скриптов. Которые отвечают за ходьбу вперед и получение урона. Принимаю любую критику и хотелось бы увидеть предложение как сделать лучше.
Damage ты в отдельный класс обул щоб було или в этом есть какая-то глубинная логика? Такие вещи обычно делаются через базовый класс или интерфейсы, совать единственное поле в отдельный класс - это огораживание совершенно лишних огородов. В остальном вполне красиво.
Александр Киселёв
Александр Киселёв
56 683
Лучший ответ
Болат Жумагулов Спасибо, учту.
1) Не увидел пространство имён.
2) Там пока нечего ревьюить, кода мало.
3) Выше написали правильный совет. И публичные поля здесь не нужно использовать.

В юнити не разбираюсь. Зачем там SerializeField, если сам класс не помечен как сериализуемый? Семантически, контроллеры, плееры и прочие инфраструктурные объекты не должны сериализовываться. Для этого лучше отдельное что-то придумывать
Федор Савельев
Федор Савельев
14 410
По теме инкапсуляции - то, что вы теперь знаете private, public, и атрибут [SerializeField] - очень хорошо, но это только средства. Применяете вы их достаточно разумно в этом примере, но это ничего не говорит о понимании концепции. Отвечайте себе на вопросы - "что такое этот класс?", "что должно в нём быть private, что public, а чего ВООБЩЕ не должно в нём быть?"

Посмотрите на приватные поля классов (т. е. детали реализации) - Controller ссылается на Player, Player ссылается на Controller.
Зачем? Если они являются деталями друг друга - это признак кривой абстракции. Может быть они на самом деле единая сущность? Или может их связь - это отдельная сущность?

Если вы хотите действительно разделить Player и Controller (один - управляемый, другой - управляющий) - одному из них совсем ни к чему знать о другом.
Player-у вашему, например, можно добавить событие "public UnityEvent OnDeath;", и пусть какие угодно объекты подписываются и слушают это событие.

Приспичило вам искать объект по имени "Player", кстати, по всей сцене (GameObject.Find)? Вы же точно знаете, что нужный вам компонент Player находится на этом же объекте, где и контроллер (судя по коду класса Player).

P.S.
Кэшировать трансформу в _transform - снобизм. Вы так со всеми protected-полями и свойствами поступать планируете, в которых вам не нравится стиль именования? А если думаете, что оптимизируете что-то таким образом - так ведь нет. Начиная с Unity 4.6, если не раньше, кэширование трансформы не даёт совершенно никакого выигрыша в производительности.