В чем принципиальная разница в unity между private и public?
Я только начинаю разрабатывать игры, но базу уже имею. Меня мучает вопрос: в чем разница между private и public? Да, я понимаю, что это связано с инкапсуляцией и сокрытием данных, чтобы ничего не сломать и т.д. Но если убрать это, то в чем разница? Я видел, как опытные люди используют public у полей, а не свойств. Есть ли что-то масштабное, почему надо использовать private?
Базы у вас нет ) Потому что это базовый вопрос даже не юнити и даже не c#, а основ программирования.
Вы правильно поняли что это связано с инкапсуляцией и сокрытием данных. Вот и развивайте эту тему для себя. Если ОЧЕНЬ кратко - это чтобы данные в одном классе не модифицировались (скрывались) от другого класса. Именно чистая безопасность когда разрабатывает больше одного человека - чтобы Вася не перетер данные в классе Пети., потому что потом Пете это разгребать.
Спасибо за ответ! Я знаю, что такое `private`, `public` и инкапсуляция. Мой вопрос был конкретно о разнице между `private` и `public` в контексте Unity. Я видел у Lead разработчика такую строку: `public Camera camera`. Мне стало интересно, в чем же тогда разница и почему используют `public` в этом случае.
jaroslav1245, значения приватных полей могут быть привязаны к жизненному циклу объекта. Если бы они были бы пабликовскими свойствами, то вы бы их читали из вне, когда объект, скажем был бы в каком-нибудь запрещенном состоянии. А если поля приватны, то читать их можно только методами, а метод может кинуть исключение, что сейчас недоступно такое-то свойство, потому что есть такое-то состояние (вы можете описать такую ситуацию выброса исключения в методе).
Очень удобно вести лог ошибок, и объекты всегда отвечают требованиям модели данных.
jaroslav1245, В контексте юнити - паблик поля видны в инспекторе, прайват - нет. Больше различий нет.
Приватными поля делают потому что в какой-то книжке/статье/видео на ютуб кто-то написал/сказал, что так нужно делать и так правильно. В реальности же, в подавляющем большинстве случаев, приватные поля попросту не нужны и мешаются, вынуждая тебя плодить немыслимое количество методов (отобразить данные в ui, подсчитать что-то, основываясь на части данных этого класса, повзаимодействовать с другим классом). Аргумент с безопасностью абсолютно бредовый. Что мешает Васе изменить приватное поле на публичное или использовать рефлексию и достать данные этим способом? Если Вася захочет, он сделает свое грязное дело и никакие приватные поля его не остановят.
Ограничение доступа к данным, когда объект находится в каком-то неправильном состоянии, как написал алекс - один из немногих(если не единственный) адекватных юзкейсов приватных полей. Но таких случаев крайне мало, на ум приходит только многопоток и использования мьютекса, чтобы ограничить доступ к данным из разных потоков. Методы, которые кидают исключения, избегай, т.к., потом эти исключения нужно будет обрабатывать, это лишняя сущность, которую нужно будет поддерживать.
Так речь не про безопасность, скорее просто табличка "не трогать".
Вот простой пример:
в C# в List есть поле version. Его пабликом делать? а потом кто-то изменит и все foreach полетят. А так если уж кто-то дошел до изменения приватного поля, то скорее всего он точно понимает что и зачем он делает.
leremin, Табличка "не трогать" Васю не остановит, как я и написал выше, если он захочет что-то изменить, он заменит приват на паблик. Если эта табличка висит абсолютно везде, то ее польза начинает превращаться во вред, т.к. становится невозможно сходу определить где приватное поле означает, что все сломается, если его изменить, а где оно просто так впихнуто, потому что так сказали "умные дяди" в книжке.
Твой пример несостоятельный. Во-первых, зачем кому-то может понадобиться изменять поле версии? Во-вторых, даже если ты изменишь это поле, то запустишь программу, чтобы проверить работает ли то, что ты сделал, программа не будет работать, откатишь изменения назад. И опять же, если бы поле версии было приватным, а всё остальное подавляющее большинство полей - публичными, то сразу было бы понятно, даже тому самому Васе, что это поле трогать не нужно. Но в ситуации, когда у тебя 10 приватных полей и одно публичное свойство, которое возвращает данные из приватного поля, и так по всему проекту, становится невозможным определить действительно ли это поле настолько важное, что оно должно быть приватным.
Сергей Соловьев, боюсь вас расстроить, если вы не знаете кто такой Lead разработчик, вам даже не нужно было отвечать на мой вопрос, вашей базы точно не хватит для ответа
GavriKos, Все замечательно, доступ можно предоставить, но ранее вы упомянули, что у меня нет базы. Однако, в данной ситуации, целесообразнее использовать свойство вместо простого публичного поля.
jaroslav1245, Вполне, да. А еще можно реактивность, методы (не свойства а прям методы), вообще какую нить дичь типа коллбеков и прочее прочее. Все это - средства для реализации инкапсуляции.
И да, их много, и они нужны, потому что сисярп это не только юнити но и еще куча всего, включая и библиотеки внешние, и всякое легаси и т.д.