Блестящий пример эффективной инкапсуляции посредством сокрытия информации?

StackOverflow https://stackoverflow.com/questions/635715

Вопрос

"Абстракция и инкапсуляция являются взаимодополняющими понятиями:абстракция фокусируется на наблюдаемом поведении объекта...инкапсуляция фокусируется на реализации, которая приводит к такому поведению...инкапсуляция чаще всего достигается за счет сокрытие информации, который представляет собой процесс сокрытия всех секретов объекта, которые не влияют на его существенные характеристики ". - Грейди Буч в Объектно-ориентированном анализе и проектировании

Можете ли вы показать мне несколько убедительных примеров преимуществ инкапсуляции за счет сокрытия информации?

Это было полезно?

Решение

Пример, приведенный в моем первом ОО-классе:

Представьте себе медиаплеер. Он абстрагирует понятия игры, паузы, быстрой перемотки вперед и т. Д. Как пользователь, вы можете использовать это для управления устройством.

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

Когда появляется новая реализация мультимедийного проигрывателя (скажем, DVD-проигрыватель, который использует диски, а не ленты), она может заменить реализацию инкапсулированной в мультимедийном проигрывателе и пользователи могут продолжать использовать его так же, как они использовали со своим видеомагнитофоном (такие же операции, как воспроизведение, пауза и т. д.).

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

Другие советы

Абстракция * nix символьных потоков (дисковые файлы, каналы, сокеты, ttys и т. д.) в одну сущность (модель «все является файлом») позволяет применять широкий спектр инструментов для широкого спектра диапазон источников / приемников данных таким способом, который был бы невозможен без инкапсуляции.

Аналогично, концепция потоков на разных языках, абстрагирование от списков, массивов, файлов и т. д.

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

Я знаю, что уже есть принятый ответ, но я хотел бы добавить еще один: OpenGL / DirectX

Ни один из этих API-интерфейсов не является полной реализацией (хотя DirectX в этом отношении, конечно, немного более сложен), но вместо этого являются общими методами передачи команд рендеринга на графическую карту.

Поставщики карт - это те, кто предоставляет реализацию (драйвер) для конкретной карты, которая во многих случаях очень специфична для аппаратного обеспечения, но вам, как пользователю, не нужно заботиться о том, чтобы один пользователь работал с GeForce ABC, а другой - Radeon XYZ, потому что точная реализация скрыта за высокоуровневым API. Если бы это было не так, вам нужно было бы иметь кодовый путь в своих играх для каждой карты на рынке, который вы хотели бы поддерживать, что было бы совершенно неуправляемо с первого дня. Еще один большой плюс этого подхода заключается в том, что Nvidia / ATI может выпустить более новая и эффективная версия их драйверов, и вы автоматически получаете выгоду без усилий с вашей стороны.

Тот же принцип действует для звука, сети, мыши, клавиатуры ... в основном для любого компонента вашего компьютера. Независимо от того, происходит ли инкапсуляция на аппаратном уровне или в программном драйвере, в какой-то момент все особенности устройства скрыты, чтобы вы могли рассматривать любую клавиатуру, например, как просто клавиатуру, а не как Microsoft Ergonomic Media Explorer Deluxe Revision 2 .

Когда вы смотрите на это таким образом, быстро становится очевидным, что без какой-либо формы инкапсуляции / абстракции компьютеры, как мы их знаем сегодня, просто не будут работать вообще. Это достаточно блестяще для вас?

Почти каждая кодовая база Java, C # и C ++ в мире имеет сокрытие информации: это так же просто, как private: разделы классов.

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

Что?Вы еще не убеждены?

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top