Какова цель инкапсуляции?Обеспечивает ли это уровень безопасности? - PullRequest
1 голос
/ 28 мая 2019

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

Ответы [ 3 ]

3 голосов
/ 28 мая 2019

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

class ProgressBar {
    public int maximum;
    public int current;
}

против

class ProgressBar {
    private int maximum;
    private int current;

    ...
    public set_current(int amount) {
        if (amount <= this.maximum) this.current = amount;
    }
}

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

1 голос
/ 28 мая 2019

Цель инкапсуляции двойная:

  1. Объединение связанных функций;
  2. Управление доступом к полям и методам, которые участвуют в предоставлении функциональности.

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

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

Пример: два внешних участника пытаются изменить баланс вашего счета одновременно;

  1. Локализация аспекта кода, который может измениться в будущем.

Пример: Простое разрешение изменить тип переменной состояния с логического значения на enum в будущем, поскольку к нему всегда обращаются из метода получения в классе;

  1. Реализация бизнес-правил, если таковые имеются, которые необходимо применять при внесении изменений в ваши поля.

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

1 голос
/ 28 мая 2019

Тебе нужно посмотреть на это,

your code <------ <code>client code

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

Чтобы привести пример,

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

public class GameCharacter {

public int Health{ get; } 

public GameCharacter ()
{
    Health = 100;
}

}

Никто не может изменить здоровье!

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