stringtranslate.com

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

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

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

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

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

Значение

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

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

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

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

Инкапсуляция может также относиться к содержанию повторяющегося или сложного процесса в одном блоке, который будет вызван. Объектно-ориентированное программирование облегчает это как на уровне метода, так и на уровне класса. Это определение также применимо к процедурному программированию . [10]

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

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

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

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

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

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

Примеры

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

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

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

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

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

public class Employee { private BigDecimal salary = new BigDecimal ( 50000.00 ) ; public BigDecimal getSalary ( ) { return this.salary ; }                  public static void main () { Employee e = new Employee (); BigDecimal sal = e . getSalary (); } }              

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

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

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

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

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

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

класс  Car :  def  __init__ ( self )  - >  None :  self._maxspeed = 200    def  drive ( self )  ->  None :  print ( f "Максимальная скорость равна { self . _maxspeed } ." ) redcar  =  Car () redcar . drive ()  # Это выведет «Максимальная скорость — 200».redcar._maxspeed = 10 redcar.drive () # Это выведет «Максимальная скорость — 10 » .   

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

Цитаты

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

Ссылки