Зачем нужен private, если есть public?
Я знаю что такое private и что такое public, вопрос в другом. Зачем переменные и методы делать private и ограничивать доступ к ним, если можно сделать их всех public и не думать пригодится тебе они в других скриптах или нет?
Ответы (2 шт):
private нужен именно для того, чтобы кто попало снаружи не мог лазить во внутренние поля класса и произвольно менять их состояние. Да и "подсматривать" тоже не мог. Есть публичные поля и свойства - пожалуйте обращаться к ним. А когда снаружи могут как угодно менять состояние класса, это уже бардак какой-то. Внутреннее состояние и его поддержание в актуальном непротиворечивом состоянии - это внутреннее дело класса.
Как минимум, так гораздо легче искать ошибки в программах, когда у классов есть ограниченное число "точек доступа", которые нужно проверить, чтобы убедиться, что класс работает нужным образом. Если класс "полностью прозрачен" для доступа снаружи, нормально протестировать его - задача не реальная. Нужно проверить все сочетания всех возможных значений всех его полей, это задача просто даже вычислительно часто невозможная.
Простой пример: есть какое-то поле, которое может принимать только положительные значения (например, деньги на банковском счету). Это гарантируется тем, что изменение этого поля делается через сеттер, который проверяет устанавливаемое значение и не даёт ему становиться меньше нуля. Мы всегда можем быть уверены, что значение этого поля будет корректное. А что будет, если это поле будет публично выставлено наружу? Туда кто угодно может записать что угодно. И вся логика работы класса сломается, либо нужно будет делать дополнительные проверки значения этого поля по всему коду класса при работе с этим полем.
В общем, наличие private полей упрощает работу программиста, а не усложняет, как может показаться неопытному программисту.
Есть в объектно-ориентированном подходе, да и в принципе есть такое понятие инкапсуляция. В основном у нее 2 функции:
- Изолирование
- Снижение сложности
Если мы говорим про снижение сложности, то можно привести пример с автомобилем. Автомобиль устроен очень сложно - скорее всего вы не имеете представления об внутреннем устройстве поршневой группы или соединений лонжеронов, но это не помешает вам сесть в машину и поехать. Вам попросту не нужно знать внутренне устройство и соответственно иметь к нему доступ - этим займутся специально обученные специалисты в специальных помещениях. Считайте эти поля типа privat
И плавно можно перейти к Изолированию. Если вы вдруг захотите для себя открыть эти поля, и заменить двигатель например - это может привести к очень плачевным последствиям. Потому что вы не специалист, у вас нет специального помещения, знаний и т.д. Вы сделаете машину не гарантийным случаем.
Поэтому в больших проектах необходимо использовать инкапсуляцию.