Какой смысл доступа к закрытым переменным через функции получения и установки (средства доступа)? - PullRequest
10 голосов
/ 25 января 2012

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

Однако я всегда вижу закрытые переменные, а затем функцию получения и установки, используемую для получения этого значения (иногда даже указатель на эту переменную!). Например, int a является частным для предотвращения публичного доступа, но тогда getA() и setA() разрешают прямой доступ к ним.

Так почему функции получения и установки не могут быть конфиденциальными? Я имею в виду, что частные переменные с функцией доступа такие же, как публичные переменные, только код для доступа к ним изменяется. (object.variable против object.getVariable ())

Есть ли причина, по которой люди делают переменные приватными с помощью функций доступа? Есть ли какие-либо преимущества по сравнению с публикацией?

Я говорю о программировании в целом, но в основном на языках C (т.е. C, C ++, C #, Obj-C).

Ответы [ 6 ]

12 голосов
/ 25 января 2012

Ключевое слово и тег здесь - «инкапсуляция».Вы скрываете детали a, все еще делая его пригодным для использования.Мне нравятся уже перечисленные причины, есть еще много.Вот еще одно, вы отлаживаете и обнаруживаете, что a имеет неправильное значение.Если a общедоступно, вам нужно будет проверить каждое место, к которому a обращаются.Если a является приватным методом сеттера, вы знаете, что единственное место, которое a мог бы изменить, это вызов setA() - было бы отличным местом для установки точки останова;)

2 голосов
/ 25 января 2012

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

2 голосов
/ 25 января 2012

Потому что, если вы измените внутреннее представление этой переменной или захотите сделать больше, когда она установлена ​​или извлечена, она не сломает все другие классы, которые ее используют (и если это библиотека, вам не нужно менять ваш API).

Это также означает, что вы можете легко установить точку останова, чтобы увидеть, когда она будет использоваться (хотя большинство языков / отладчиков имеют точки останова данных какого-либо рода).

1 голос
/ 16 февраля 2017

Когда я начал изучать объектно-ориентированное программирование, я имел в виду тот же вопрос, потому что в большинстве книг они просто делают переменные приватными и добавляют к ним открытые методы (Getter / Setters), поэтому я подумал, смогу ли я получить к ним доступпеременная с помощью общедоступных методов, тогда какой смысл делать эту переменную частной.

Я получаю ответ Когда я начну реализовывать реальное бизнес-приложение.

Давайте рассмотрим ученика класса, который содержит имя ученика, бросокнет, оценки по 3 предметам

Class Student {

   private  int rollno;
    private int java_marks;
    private int cpp_marks;
    private int unix_marks;
    private int percentage;


    public int getJava_marks() {
        return java_marks;
    }
    public void setJava_marks(int java_marks) {
        if (java_marks > 100) {
            System.out.println("Marks value should be less than 100");
            //throw exception
        }
        this.java_marks = java_marks;
    }
    public int getCpp_marks() {
        return cpp_marks;
    }
    public void setCpp_marks(int cpp_marks) {
        if (cpp_marks > 100) {
            System.out.println("Marks value should be less than 100");
            //throw exception
        }
        this.cpp_marks = cpp_marks;
    }
    public int getUnix_marks() {

        return unix_marks;
    }
    public void setUnix_marks(int unix_marks) {
        if (unix_marks > 100) {
            System.out.println("Marks value should be less than 100");
            //throw exception
        }
        this.unix_marks = unix_marks;
    }
    public int getPercentage() {
        this.percentage = (this.cpp_marks + this.unix_marks + this.java_marks) /3;
        return percentage;
    }

    public int getRollno() {
        return rollno;
    }
    public void setRollno(int rollno) {
        this.rollno = rollno;
    }

} 

Здесь делают частные переменные по двум причинам

  1. Проверка: если пользователь предоставляет недопустимое значение для отметок, то объект ученика не долженсоздать с неверными данными и выдать соответствующую ошибку / исключение.В случае пометок как общедоступных переменных пользователь может установить для них любое значение, поэтому я добавил проверку / безопасность, чтобы убедиться, что у каждого созданного студенческого объекта правильные данные.

  2. Безопасность В случаепроцент, пользователь не может установить свой собственный процент.процент рассчитывается и устанавливается внутренне.Здесь я не предоставляю метод установки для процента, чтобы пользователь мог получать / читать процентное значение только методом получения.

Это приводит к безопасности в абстракции, которая ограничивает (только чтение) доступпеременная класса.

0 голосов
/ 10 октября 2016

Почему требуется инкапсуляция? Почему ООП был необходим? Разве язык программирования C не способен делать то, что мы делаем сегодня? Спроси это у себя. Или если вы работали на огромных системах с миллионами строк кода. И все, что вы использовали, это публичные переменные критической структуры данных, доступные из каждого модуля программы.

0 голосов
/ 25 января 2012

Класс определяет поведение, а члены - это состояние объекта ... поэтому наличие установщика и получателя определяет поведение инкапсуляции класса, позволяя другим находить / изменять состояние объектов.

Другими словами, разница заключается в том, чтобы позволить вашему соседу войти в ваш дом и взять то, что он хочет (сделать все объекты в классе публичными) .... или убедиться, что сосед приходит спросить меня о том, что он хочет, и Я даю ему (имея геттер / сеттер ....)

...