В информатике сокрытие информации — это принцип разделения проектных решений в компьютерной программе , которые с наибольшей вероятностью изменятся, тем самым защищая другие части программы от обширной модификации в случае изменения проектного решения. Защита включает в себя предоставление стабильного интерфейса , который защищает остальную часть программы от реализации (чьи детали с наибольшей вероятностью изменятся). Другими словами, сокрытие информации — это возможность предотвратить доступ клиентов к определенным аспектам класса или программного компонента с помощью либо функций языка программирования (например, закрытых переменных), либо явной политики экспорта.
Термин инкапсуляция часто используется взаимозаменяемо с термином сокрытие информации. Однако не все согласны с различиями между ними; можно считать, что сокрытие информации — это принцип, а инкапсуляция — это метод. Программный модуль скрывает информацию, инкапсулируя ее в модуль или другую конструкцию, которая представляет интерфейс. [1]
Распространенным применением сокрытия информации является сокрытие физической структуры хранения данных, так что если она изменяется, то изменение ограничивается небольшим подмножеством всей программы. Например, если трехмерная точка ( x , y , z ) представлена в программе тремя скалярными переменными с плавающей точкой , а затем представление изменяется на одну переменную массива размером три, модуль, разработанный с учетом сокрытия информации, защитит остальную часть программы от такого изменения.
В объектно-ориентированном программировании сокрытие информации (путем вложения типов) снижает риск разработки программного обеспечения, перенося зависимость кода от неопределенной реализации (проектного решения) на четко определенный интерфейс . Клиенты интерфейса выполняют операции исключительно через интерфейс, поэтому, если реализация изменяется, клиентам не нужно меняться.
В своей книге об объектно-ориентированном проектировании Грэди Буч определил инкапсуляцию как «процесс разделения элементов абстракции, составляющих ее структуру и поведение; инкапсуляция служит для разделения договорного интерфейса абстракции и ее реализации». [2]
Целью является достижение потенциала для изменений: внутренние механизмы компонента могут быть улучшены без влияния на другие компоненты, или компонент может быть заменен другим, который поддерживает тот же открытый интерфейс. Инкапсуляция также защищает целостность компонента, не давая пользователям устанавливать внутренние данные компонента в недопустимое или несогласованное состояние. Еще одним преимуществом инкапсуляции является то, что она снижает сложность системы и, таким образом, повышает надежность, ограничивая взаимозависимости между компонентами программного обеспечения. [2]
В этом смысле идея инкапсуляции более общая, чем то, как она применяется в объектно-ориентированном программировании. Например, реляционная база данных инкапсулирована в том смысле, что ее единственным открытым интерфейсом является язык запросов (такой как SQL ), который скрывает все внутренние механизмы и структуры данных системы управления базами данных. Таким образом, инкапсуляция является основным принципом хорошей архитектуры программного обеспечения на каждом уровне детализации.
Инкапсуляция программного обеспечения за интерфейсом позволяет создавать объекты, которые имитируют поведение и взаимодействие объектов в реальном мире. Например, простой цифровой будильник — это объект реального мира, который может использовать и понимать неспециалист (неэксперт). Он может понять, что делает будильник и как им пользоваться через предоставленный интерфейс (кнопки и экран), без необходимости понимать каждую часть внутри часов. Аналогично, если бы часы были заменены другой моделью, неспециалист мог бы продолжать использовать их таким же образом, при условии, что интерфейс работает так же.
В более конкретном контексте объектно-ориентированного языка программирования это понятие используется для обозначения либо механизма сокрытия информации, либо механизма объединения, либо их комбинации. (Подробнее см. в разделе Инкапсуляция (объектно-ориентированное программирование) ).
Концепция сокрытия информации была впервые описана Дэвидом Парнасом в 1972 году. [3] [4] До этого модульность обсуждалась Ричардом Готье и Стивеном Понтом в их книге 1970 года «Проектирование системных программ» , хотя само модульное программирование использовалось на многих коммерческих сайтах много лет назад — особенно в подсистемах ввода-вывода и библиотеках программного обеспечения — без приобретения тега «сокрытие информации» — но по схожим причинам, а также по более очевидной причине повторного использования кода . [ необходимо разъяснение ]
Скрытие информации служит эффективным критерием для разделения любого оборудования, программного обеспечения или оборудования на модули функциональности. Например, автомобиль — это сложное оборудование. Чтобы сделать проектирование, производство и обслуживание автомобиля разумными, сложное оборудование делится на модули с определенными интерфейсами, скрывающими проектные решения. Проектируя автомобиль таким образом, производитель автомобилей также может предлагать различные варианты, при этом имея транспортное средство, которое будет экономичным в производстве.
Например, производитель автомобилей может иметь люксовую версию автомобиля, а также стандартную версию. Люксовая версия поставляется с более мощным двигателем, чем стандартная версия. Инженеры, проектирующие два разных автомобильных двигателя, один для люксовой версии и один для стандартной версии, обеспечивают одинаковый интерфейс для обоих двигателей. Оба двигателя помещаются в моторный отсек автомобиля, который одинаков для обеих версий. Оба двигателя подходят к одной и той же трансмиссии, одинаковым опорам двигателя и одинаковым органам управления. Различия в двигателях заключаются в том, что более мощная люксовая версия имеет больший рабочий объем с системой впрыска топлива, которая запрограммирована на подачу топливовоздушной смеси, которая требуется двигателю большего рабочего объема.
В дополнение к более мощному двигателю, люксовая версия может также предлагать другие опции, такие как лучшее радио с CD-плеером, более удобные сиденья, лучшая система подвески с более широкими шинами и другие цвета краски. Со всеми этими изменениями большая часть автомобиля одинакова между стандартной версией и люксовой версией. Радио с CD-плеером — это модуль, который заменяет стандартное радио, также являющееся модулем, в люксовой модели. Более удобные сиденья устанавливаются в те же крепления, что и стандартные типы сидений. Не имеет значения, являются ли сиденья кожаными или пластиковыми, имеют ли они поясничную поддержку или нет.
Инженеры проектируют автомобиль, разделяя задачу на части работы, которые назначаются командам. Затем каждая команда проектирует свой компонент в соответствии с определенным стандартом или интерфейсом, что обеспечивает гибкость команды в проектировании компонента, в то же время гарантируя, что все компоненты будут подходить друг другу.
Производители автомобилей часто используют одну и ту же основную структуру для нескольких разных моделей, отчасти в качестве меры контроля затрат. Такая « платформа » также является примером сокрытия информации, поскольку план этажа может быть построен без знания того, будет ли он использоваться в седане или хэтчбеке.
Как видно из этого примера, сокрытие информации обеспечивает гибкость. Эта гибкость позволяет программисту изменять функциональность компьютерной программы в ходе обычной эволюции, поскольку компьютерная программа изменяется, чтобы лучше соответствовать потребностям пользователей. Когда компьютерная программа хорошо спроектирована, разложение исходного кода решения на модули с использованием принципа сокрытия информации, эволюционные изменения намного проще, поскольку изменения обычно локальные, а не глобальные.
Автомобили являются еще одним примером этого в том, как они взаимодействуют с водителями. Они представляют стандартный интерфейс (педали, руль, переключатель передач, сигналы, датчики и т. д.), на котором люди обучаются и получают права. Таким образом, людям нужно только научиться водить машину; им не нужно изучать совершенно другой способ вождения каждый раз, когда они садятся за руль новой модели. (Конечно, есть механические и автоматические коробки передач и другие подобные различия, но в целом автомобили поддерживают единый интерфейс.)