stringtranslate.com

Инкапсуляция (компьютерное программирование)

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

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

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

Все системы объектно-ориентированного программирования (ООП) поддерживают инкапсуляцию, [2] [3], но инкапсуляция не является уникальной особенностью ООП. Реализации абстрактных типов данных , модулей и библиотек , среди других систем, также предлагают инкапсуляцию. Сходство было объяснено теоретиками языков программирования с точки зрения экзистенциальных типов . [4]

Значение

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

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

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

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

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

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

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

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

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

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

Примеры

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

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

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

класс Program { общественный класс Account { частное десятичное _accountBalance = 500,00 м ;           общественный десятичный CheckBalance () { return _accountBalance ; } }        static void Main () { Учетная запись myAccount = новая учетная запись (); десятичное число myBalance = myAccount . Проверить баланс ();             /* Этот метод Main может проверять баланс через общедоступный  * метод «CheckBalance», предоставляемый классом «Account»  , * но он не может манипулировать значением «accountBalance» */ } } 

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

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

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

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

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

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

Искажение имени

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

class  Car :  def  __init__ ( self )  ->  None :  self . _maxspeed  =  200  def  Drive ( self )  ->  Нет :  print ( f «Максимальная скорость { self . _maxspeed } ) redcar  =  Автомобиль () redcar . привод ()  # Это напечатает «Максимальная скорость 200».Красная машина . _maxspeed  =  10 красная машина . привод ()  # Это напечатает «Максимальная скорость 10».

Смотрите также

Цитаты

  1. ^ аб Роджерс, Wm. Пол (18 мая 2001 г.). «Инкапсуляция — это не сокрытие информации». JavaWorld . Проверено 20 июля 2020 г.
  2. ^ «Что такое объектно-ориентированное программирование (ООП)?». Архитектура приложения . Проверено 2 марта 2024 г.
  3. ^ «Инкапсуляция в объектно-ориентированном программировании (OOPS)» . www.enjoyalgorithms.com . Проверено 2 марта 2024 г.
  4. ^ Пирс 2002, § 24.2 Абстракция данных с помощью экзистенциалов
  5. ^ Скотт, Майкл Ли (2006). Прагматика языка программирования (2-е изд.). Морган Кауфманн. п. 481. ИСБН 978-0-12-633951-2. Механизмы инкапсуляции позволяют программисту группировать данные и подпрограммы, которые с ними работают, в одном месте и скрывать ненужные детали от пользователей абстракции.
  6. ^ Дейл, Нелл Б.; Уимс, Чип (2007). Программирование и решение проблем с помощью Java (2-е изд.). Джонс и Бартлетт. п. 396. ИСБН 978-0-7637-3402-2.
  7. ^ Митчелл, Джон К. (2003). Концепции в языках программирования . Издательство Кембриджского университета. п. 522. ИСБН 978-0-521-78098-8.
  8. ^ Аб Пирс, Бенджамин (2002). Типы и языки программирования . МТИ Пресс. п. 266. ИСБН 978-0-262-16209-8.
  9. ^ Коннолли, Томас М.; Бегг, Кэролайн Э. (2005). «Глава 25: Введение в объектную DMBS § Объектно-ориентированные концепции». Системы баз данных: практический подход к проектированию, внедрению и управлению (4-е изд.). Пирсон Образование. п. 814. ИСБН 978-0-321-21025-8.
  10. ^ Гамма, Эрих; Хелм, Ричард; Джонсон, Ральф; Влиссидес, Джон (1994). Шаблоны проектирования . Аддисон-Уэсли. ISBN 978-0-201-63361-0.
  11. ^ ab Bloch 2018, стр. 73–77, глава §4, пункт 15. Минимизируйте доступность классов и членов.
  12. ^ Кинг, КН (2008). Программирование на C: современный подход (2-е изд.). WW Нортон и компания. п. 464. ИСБН 978-0393979503.
  13. ^ Бадер, Дэн. «Значение подчеркиваний в Python». Улучшите свои навыки Python . Проверено 1 ноября 2019 г.

Рекомендации