Путаница по поводу абстракции и инкапсуляции
Может кто-нибудь рассказать мне примеры абстракции и инкапсуляции и разницу между ними?
2 ответа
Они, конечно, связаны, но немного отличаются.
Абстракция - это трактовка конкретных классов (типов объектов) как абстракций. Я имею в виду, что у вас нет классов, представляющих square
, circle
, rectangle
и так далее. Все это может быть абстрагировано от общего предка, shape
, Абстракция полезна, потому что есть определенные операции, которые вы можете выполнять с любой формой, такие как рисование, установка начала координат, установка размера и так далее.
Инкапсуляция, с другой стороны, скрывает информацию. Это акт раскрытия только достаточного количества информации, чтобы вы могли делать то, что нужно сделать.
Классическим примером является телефонная книга. Вы не раскрываете тот факт, что вы используете хеш-таблицу или пару массивов или любую причудливую структуру, которую вы выбрали для ее представления. Вместо этого вы предоставляете только те операции, которые ожидаете выполнить над объектом.
Инкапсуляция позволяет изменять внутренние компоненты класса, не беспокоясь о влиянии на клиента. Поэтому, возможно, массив подходит, когда в вашей телефонной книге двадцать записей, но, когда вы становитесь настолько популярными, что люди требуют добавления, вы можете захотеть перейти на использование хеш-таблиц или базы данных.
С инкапсуляцией это гораздо более безболезненный процесс, поскольку, пока вы поддерживаете публичное лицо своего класса, вы можете изменить то, что вы хотите. Если бы вы "опубликовали" свои внутренние компоненты, люди могли бы зависеть от этого, до такой степени, что эта зависимость сломала бы их код, когда вы изменили его. Хорошее правило - публиковать только то, что вы ожидаете, никогда не изменится.
Инкапсуляция облегчает задачу абстракции, поскольку внутренние детали класса скрыты от глаз.
Инкапсуляция:
Инкапсуляция - это, по сути, сокрытие деталей реализации, разделение данных и поведения и предоставление простых интерфейсов для сложных объектов черного ящика.
Пример: вы нажимаете рычаг тоста на тостере, он активирует нагревательные катушки и таймер, и тост поднимается, готовый к употреблению через минуту. Детали приготовления тоста заключены в простой интерфейс толкания рычага вниз. Через 20 лет вы можете купить ядерный тостер, но тот же набор функций позволит вам использовать его так, как вы привыкли сейчас.
Абстракция:
Определение 1
В общем смысле интерфейс, обеспечиваемый инкапсуляцией, по существу является абстракцией для его более сложных внутренностей. При таком определении различие размыто.
Пример: можно сказать, что тот же тостер сверху абстрагирует сложное действие поджаривания хлеба в простую операцию нажатия на рычаг.
Определение 2
Другое более четкое значение - это использование иерархии типов или другой общности, чтобы позволить объектам использоваться взаимозаменяемо в их более общих формах. Инкапсуляция часто позволяет использовать этот тип абстракции.
Пример: тостер может жарить ломтики пшеничного хлеба, ржаного хлеба, хлеба или даже рогаликов. Единственное требование состоит в том, чтобы они были нарезаны и ограничены некоторым общим набором размеров. Здесь мы можем сказать, что тостер может поджарить все, что угодно. Это абстракция, которая охватывает все эти элементы.
Грэди Буч говорит...
(из http://en.wikipedia.org/wiki/Information_hiding)
В своей влиятельной книге по объектно-ориентированному дизайну Грэди Буч определил инкапсуляцию как "процесс разделения элементов абстракции, составляющих его структуру и поведение; инкапсуляция служит для разделения договорного интерфейса абстракции и его реализации"[2]. Эта формулировка цитируется рядом книг как авторитетное определение инкапсуляции.