Почему нам нужно установить переменную private / public? - PullRequest
1 голос
/ 06 апреля 2010

Почему бы не сделать все переменные приватными? Все переменные должны давать getter, setter для изменения / чтения. Зачем оставлять здесь ключевое слово "public"? Кроме удобной, есть еще одна причина для этого?

Ответы [ 7 ]

5 голосов
/ 06 апреля 2010

Ну, у них есть значение по умолчанию.

Вопрос, который вы должны задать себе, - почему не все публично, если вы поймете это - я уверен, что вы сможете ответить на свой вопрос.

1 голос
/ 06 апреля 2010

Правда в том, что не так много было бы потеряно, если бы поля были вынуждены быть закрытыми в языке. Как вы говорите, в большинстве языков рекомендуется инкапсулировать все поля с помощью метода установки / получения свойств. Язык вполне может заставить все поля быть закрытыми.

Однако, если у вас есть что-то вроде закрытого внутреннего класса:

public class OuterClass
{
     private InnerClass
     {
          public int publicField;
     }
}

Тогда вы можете утверждать, что геттеры / сеттеры не требуются. В этом случае в C # так же просто использовать автоматически реализуемое свойство. Однако они были введены только в C # 2, поэтому я думаю, что это причина того, что открытые поля все еще разрешены. Предварительно автоматически реализованные свойства, можно было бы написать геттеры / сеттеры, что можно считать излишним для частного внутреннего класса.

В языках с указателями, таких как C ++, публичные поля обязательны, если кто-то хочет получить указатель на поле извне класса.

1 голос
/ 06 апреля 2010

Вы очень правы, лучше иметь переменную private и иметь public getter / setter. Прямой доступ к полю public на самом деле является плохой практикой .

Это относится к тому, что называется «независимостью представления»: тот факт, что если внешний доступ происходит через getter / setter, вы можете изменить внутреннее представление объекта без существенных сбоев.

0 голосов
/ 06 апреля 2010

Обычный рефлекс для программиста состоит в том, чтобы установить все поля в классе как частные * и предложить интерфейс, состоящий из ряда методов получения и установки для управления ими.Это в соответствии с принципом инкапсуляции, когда внутренняя работа класса остается скрытой и позволяет программисту указать, какие изменения возможны.

В некоторых случаях требуется открытый, защищенный и заданный по умолчанию (= нет) спецификатор доступа,Public может использоваться для любого метода или поля, которые должны быть свободно доступны извне класса, в то время как отсутствие спецификатора ограничивает доступ к самому классу и любому классу в том же пакете.Наконец, защищенный может быть использован в тех случаях, когда необходимо получить доступ к полям из подклассов и других классов в пакете, что иногда используется в рамках.

Вот ссылка, показывающая различия между спецификаторами доступа:http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

* За исключением объектов-контейнеров, поскольку получение экземпляра дает вам полный контроль.

0 голосов
/ 06 апреля 2010
  1. Некоторые переменные нужны только для внутренней логики
  2. Возможна проверка при установке новых значений. Если вам не нужно это знать, возможно, вам понадобится позже
0 голосов
/ 06 апреля 2010

Если вы единственный человек, который использует этот код - сделайте его общедоступным. Если нет - вам следует использовать закрытые поля, если вы не хотите, чтобы кто-то это изменил, потому что это может разрушить ваш дизайн и поведение вашего класса будет непредсказуемым.

0 голосов
/ 06 апреля 2010

Создание переменной private называется скрытием информации или инкапсуляцией . Эти понятия вводятся для отделения логики программы от реализации программы.

Имея переменную public или переменную private с public getter и setter - это не одно и то же, даже getter и setter не производят никакого преобразования в переменную. Getter и setter предназначены для выполнения каких-либо операций с переменной, когда это set или get, например, кеширование или проверка ограничений.

Публичный метод получения или установки может быть перезаписан в подклассе, специализируясь на его поведении. Вы не можете сделать то же самое с публичной переменной. Даже со свойствами поведение не то же самое, потому что вы не можете перезаписать метод доступа в подклассе. Написание (пустых) аксессоров дает вам больше возможностей расширения.

Обратите внимание, что эти концепции не реализованы всеми языками, например, C и Python.

...