Задать вопрос
@ByXesh

Почему рекомендуется использовать private а не просто ставить везде Public?

Я знаю что не рекомендуется постоянно использовать
public модификатор доступа в unity но никогда не задумывался почему. Можете помочь с этим?
  • Вопрос задан
  • 402 просмотра
Подписаться 1 Простой 16 комментариев
Решения вопроса 2
GavriKos
@GavriKos Куратор тега Unity
Почему рекоменудется носить трусы? Чтобы жопа была в безопасности.

Вот тут прибилзительно то же самое. Чтобы программисту не надо было думать как поведет себя код, если ВДРУГ кто то снаружи изменит то, что менять не надо вообще.
Когда вы делаете переменную публичной - вы тем самым говорите "эту переменную можно менять, я все предусмотрел, все будет ок. Это интерфейс взаимодействия - пользуйтесь". Но ведь далеко не для всех переменных класса НАДО предусматривать такое - зачем же делать лишнюю работу - ставим private и все, манипулируем переменной только изнутри, ЗНАЯ все варианты ее изменения.
Ответ написан
Если без шибко умных слов, то приватными поля нужно делать, чтобы код отображал намерения разработчика и чтобы скрывать детали реализации (польза второго менее очевидна).

Вот пример из комментариев о том, как делать не стоит:
class Character {
  public double health;
  public void TakeDamage(double damage) {
    if(damage <= 0) return;
    this.health -= damage;
    if(this.health <= 0) {
       this.Die();
    }
    // ...
  }
  public void Die() {
    this.DoSomethingSpecial();
    // ...
  }
  
  // Этот метод в будущем будет удалён, оставлен пока как костыль
  public void DoSomethingSpecial() {/*...*/}
}


Потом спустя хз сколько времени ты вернулся к коду.
Как ты будешь вспоминать, как правильно стоит наносить урон персонажам?
Через TakeDamage или в каких-то случаях можно напрямую изменить поле health?
Если в каких-то случаях нужно напрямую использовать поле health, то в каких?
Если ошибёшься - возникнут закономерные баги.

Про скрытие деталей реализации:
Допустим, что ты решил добавить в игру поддержку модов.
Как разработчик мода поймёт, какие методы на персонажах можно вызывать не беспокоясь о том, что мод сломается в следующей версии игры?
Например без использования модификатора internal - разработчик мода может подумать, что этот метод можно вызывать, а по факту - в следующей версии ты, как разработчик игры, планируешь его удалить или изменить сигнатуру, что поломает мод.
+ если у тебя многие вещи сделаны через поля, то тогда ты не сможешь использовать интерфейсы (ну или их использование будет затруднено)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@rPman
Одно слово - инкапсуляция.
Если ты делаешь внутренний метод или переменную публично доступной, и работаешь с ней снаружи класса, то когда тебе понадобится изменить эту переменную или метод по работе с ней, тебе понадобится искать все использования этой переменной, а вот если ты заранее ограничишь себя, и для выхода наружу будешь специально создавать методы класса, то в тот момент, когда ты пожелаешь что либо изменить, тебе будет достаточно сделать это внутри класса.. да и искать влияние таких исправлений снаружи по ошибкам компилятора будет проще.

Ты не только должен делать переменные приватными, тебе необходимо оформить у класса методы по работе с ними таким образом, по возможности, чтобы при использовании класса тебе было бы все равно, как именно у тебя хранятся эти данные... т.е. часто не достаточно просто заворачивать эти переменные в геттеры и сеттеры.

Тупой пример с координатами персонажа... делаешь эти переменные приватными, и оформляешь методы 'бег вперед', 'поворот' и т.п. а значит снаружи у тебя не будет чего то типа object.pos_x+=object.speed_x а будет object.moveRight().
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы