Блестящий пример эффективной инкапсуляции посредством сокрытия информации? - PullRequest
9 голосов
/ 11 марта 2009

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

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

Ответы [ 5 ]

21 голосов
/ 11 марта 2009

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

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

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

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

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

9 голосов
/ 11 марта 2009

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

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

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

2 голосов
/ 19 января 2010

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

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

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

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

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

0 голосов
/ 11 марта 2009

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

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

0 голосов
/ 11 марта 2009

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

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

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

...