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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

Что? Вы еще не уверены?

Проще показать противоположное. Мы использовали для написания кода, который не мог контролировать, кто может получить доступ к деталям его реализации. Это делало почти невозможным время от времени определять, какой код модифицировал переменную.

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

Ответ 5

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

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