Encapsulation ( компьютерное программирование)

редактировать

В объектно-ориентированном программировании (ООП) инкапсуляция относится к объединению данных с методы, которые работают с этими данными, или ограничение прямого доступа к некоторым компонентам объекта. Инкапсуляция используется, чтобы скрыть значения или состояние объекта структурированных данных внутри класса , предотвращая прямой доступ к ним неавторизованных сторон. Общедоступные методы обычно предоставляются в классе (так называемые «геттеры» и «сеттеры» ) для доступа к значениям, а другие клиентские классы вызывают эти методы для извлечения и изменения значений внутри объекта.

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

Содержание
  • 1 Значение
    • 1.1 Инкапсуляция и наследование
  • 2 Скрытие информации
    • 2.1 Примеры
      • 2.1.1 Ограничение полей данных
      • 2.1.2 Изменение имени
  • 3 См. Также
  • 4 Ссылки
Значение

В объектно-ориентированных языках программирования и других связанных полях, инкапсуляция относится к одному из двух связанных, но различных понятий, а иногда и к их комбинации:

  • языковой механизм для ограничения прямого доступа к некоторым компонентам объекта .
  • A языковая конструкция, которая облегчает объединение данных с помощью методов (или других функций), работающих с этими данными.

Некоторые исследователи языков программирования и академические круги используют первое значение отдельно или в сочетании со вторым в качестве отличительного особенность объектно-ориентированного программирования, в то время как некоторые языки программирования предоставляют лексические замыкания инкапсы представлений Уляция как особенность языка ортогональна объектной ориентации.

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

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

Инкапсуляция и наследование

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

Скрытие информации

Согласно определению, что инкапсуляция «может использоваться для сокрытия элементов данных и функций-членов», внутреннее представление объекта обычно скрыто от просмотра снаружи определения объекта. Обычно только собственные методы объекта могут напрямую проверять его поля или управлять ими. Скрытие внутренних компонентов объекта защищает его целостность, не позволяя пользователям переводить внутренние данные компонента в недопустимое или несогласованное состояние. Предполагаемое преимущество инкапсуляции состоит в том, что она может снизить сложность системы и, таким образом, повысить надежность, позволяя разработчику ограничивать взаимозависимости между программными компонентами.

Некоторые языки, такие как Smalltalk и Ruby разрешают доступ только через методы объекта, но большинство других (например, C ++, C#, Delphi или Java ) предлагают программисту некоторую степень контроля. над тем, что скрыто, обычно с помощью таких ключевых слов, как publicи private. Стандарт ISO C ++ относится к protected, privateи publicкак к «спецификаторам доступа » и что они не «скрывают никакой информации». Сокрытие информации достигается путем предоставления скомпилированной версии исходного кода, которая сопоставляется через файл заголовка.

Почти всегда есть способ переопределить такую ​​защиту - обычно с помощью отражения API (Ruby, Java, C # и т. Д.), Иногда с помощью такого механизма, как изменение имени (Python ) или использование специального ключевого слова, например friendв C ++.

Примеры

Ограничение полей данных

Такие языки, как C ++, C#, Java, PHP, Swift и Delphi предлагают способы ограничения доступа к полям данных.

Ниже приведен пример на C #, который показывает, как можно ограничить доступ к полю данных с помощью ключевого слова private:

class Program {public class Account {private decimal accountBalance = 500.00m; общедоступный десятичный CheckBalance () {вернуть this.accountBalance; }} static void Main () {Account myAccount = new Account (); десятичный myBalance = myAccount.CheckBalance (); / * Этот метод Main может проверять баланс с помощью общедоступного метода * "CheckBalance", предоставляемого классом "Account" *, но он не может управлять значением "accountBalance" * /}}

Ниже приведен пример в Java :

открытый класс Сотрудник {частная BigDecimal зарплата = новый BigDecimal (50000.00); общедоступные BigDecimal getSalary () {вернуть this.salary; } public static void main () {Employee e = new Employee (); BigDecimal sal = e.getSalary (); }}

Инкапсуляция также возможна в не объектно-ориентированных языках. В C, например, структура может быть объявлена ​​в общедоступном API через файл заголовка для набора функций, которые работают с элементом данных, содержащим элементы данных, которые недоступны для клиентов API с ключевое слово extern.

// Заголовочный файл "api.h" struct Entity; // Непрозрачная структура со скрытыми членами // Функции API, которые работают с объектами 'Entity' extern struct Entity * open_entity (int id); extern int process_entity (структура Entity * информация); extern void close_entity (struct Entity * info); // Ключевые слова extern здесь избыточны, но не повредят. // extern определяет функции, которые могут быть вызваны вне текущего файла, поведение по умолчанию даже без ключевого слова

. Клиенты вызывают функции API для выделения, работы и освобождения объектов с непрозрачным типом данных . Содержимое этого типа известно и доступно только для реализации функций API; клиенты не могут напрямую получить доступ к его содержимому. Исходный код этих функций определяет фактическое содержимое структуры:

// Файл реализации "api.c" #include "api.h" struct Entity {int ent_id; // ID номер char ent_name [20]; // Имя... и другие члены...}; // Реализации функций API struct Entity * open_entity (int id) {...} int process_entity (struct Entity * info) {...} void close_entity (struct Entity * info) {...}

Изменение имени

Ниже приведен пример Python, который не поддерживает ограничения доступа к переменным. Однако существует соглашение, что переменная, имя которой начинается с подчеркивания, должна считаться частной.

class Car (object): def __init __ (self) ->None: self._maxspeed = 200 def drive (self) ->Нет: print (f "Максимальная скорость равна {self._maxspeed}.") Redcar = Car () redcar.drive () # Это напечатает «Максимальная скорость составляет 200.» redcar._maxspeed = 10 redcar.drive () # Это напечатает "Максимальная скорость 10".
См. Также
Ссылки
Последняя правка сделана 2021-05-19 10:03:12
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте