Примеры того, почему важно объявить данные в классе как частные? - PullRequest
3 голосов
/ 18 мая 2011

Я понимаю, что только класс может получить доступ к данным, поэтому они "безопаснее", а что нет, но я не совсем понимаю, почему это так важно.Может быть, это потому, что я не сделал ни одной программы достаточно сложной, где данные могли бы быть случайно изменены, но это немного сбивает с толку, когда я изучаю классы, и мне говорят, что важно делать вещи частными, потому что это «безопаснее», когда меняют только один разДанные в программе - это когда я явно хотел.Может ли кто-нибудь привести некоторые примеры непреднамеренного изменения данных, если бы эти данные не были частными?

Ответы [ 7 ]

5 голосов
/ 18 мая 2011

Зависит от того, что вы подразумеваете под «непреднамеренными изменениями».Весь код написан кем-то, поэтому, если он меняет переменную-член класса, то изменение является преднамеренным (по крайней мере, с его стороны).Однако разработчик класса, возможно, не ожидал этого, и это может нарушить функциональность.

Представьте себе очень простой стек:

class Stack
{
    public:
        int Items[10];
        int CurrentItemIndex;
}

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

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

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

3 голосов
/ 18 мая 2011

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

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

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

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

Вы минимизировали открытый интерфейс, сохранив приватность своих рядовых?

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

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

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

1 голос
/ 18 мая 2011

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

0 голосов
/ 18 мая 2011

Допустим, у вас есть BankAccount класс, в котором вы храните NIP человека и сумму наличных.Давайте сделаем все поля открытыми и посмотрим, что может пойти не так:

class BankAccount
{
public:
    std::string NIP;
    int cash;
};

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

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

class BankAccount
{
public:
    int getCash() const { return cash; }
    void setCash(int amount) 
    {
        if (amount >= 0)
            cash = amount;
        else
            throw std::runtime_exception("Cash amount is negative.");
    }

private:
    int cash;
}

И что теперь?Вы должны найти все cash ссылки и заменить их.Быстрый и грязный Найти и заменить не так легко исправить: вы должны изменить методы доступа на getCash () и сеттеры на setCash .Все это время исправление чего-то не столь важного, чего можно было бы избежать, скрывая детали реализации в вашем классе и предоставляя доступ только к общему интерфейсу.


Конечно, это действительно довольно глупый пример, но этосо мной случалось так много раз с более сложными случаями (иногда найти ошибку гораздо сложнее), что я действительно научился инкапсулировать столько, сколько смогу.Сделайте свое будущее себе и зрителям вашего кода услугу и скрывайте частных пользователей, вы никогда не знаете, когда изменится ваша «информация о реализации».

0 голосов
/ 18 мая 2011

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


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

0 голосов
/ 18 мая 2011

Как правило, вы хотите скрыть «данные» (сделать переменные частными), чтобы люди, не знакомые с классом, не имели прямого доступа к данным.Вместо этого, если они используют публичные модификаторы для доступа и изменения этих данных.

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

0 голосов
/ 18 мая 2011

Когда вы работаете над проектом, в котором над одним проектом работают 2 или более человека, но вы работаете, скажем, 2 человека работают по понедельникам, 2 по вторникам, 2 по средам и т. Д. Следующие люди, которые продолжат работупроекту не придется беспокоить других программистов, просто чтобы объяснить, что / когда / почему так было.Если вы знаете TORTOISE, вы увидите, что это очень полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...