Чтобы ответить на этот вопрос, мы должны уточнить, что мы подразумеваем под «абстракцией» и «инкапсулированием».
Википедия defines абстракции следующим образом:
абстракция в своем главном смысле представляет собой концептуальный процесс, посредством которого общих правила и понятия являются производными от использования и классификации конкретных примеров, буквальный («реальный» или «бетон »), первые принципы или другие методы. «Абстракция» является продуктом этого процесса - концепции, которая действует как суперкатегорическое существительное для всех подчиненных понятий и связывает любые связанные понятия как группу, поле или категорию.
и for mathematics:
Абстракция в математике является процессом извлечения основной сущности математической концепции, удаляя зависимость от объектов реального мира, с которым он мог бы первоначально был связан, и обобщая его так, что она имеет более широкое применение и согласование среди других абстрактных описаний эквивалентных явлений
и computer science:
В информатике абстракция - это метод управления сложностью компьютерных систем. Он работает, устанавливая уровень сложности, с которым человек взаимодействует с системой, подавляя более сложные детали ниже текущего уровня.
Таким образом, абстракция - это процесс обобщения, а абстракции - это результаты этого процесса.
Обобщая что-то, мы делаем его более широко применимым (многоразовым). Например, если у меня есть метод сортировки людей и метод сортировки кошек, я могу обобщить метод сортировки всего, что можно сравнить пополам. Этот метод имеет множество применений. Это полезная абстракция.
Обобщая что-то, мы относимся ко всей группе вещей одинаково и не заботимся о конкретной вещи, о которой мы думаем. В приведенном выше примере я отчислил за виды сортируемых объектов и абстрагировал их внутреннее представление.
Абстракция поэтому тесно связана с концепцией сокрытия информации, что Википедия defines следующим образом:
В информатике, скрытие информации является принцип разделения проектных решений в компьютерной программе, скорее всего, изменится, тем самым защищая другие части программы от обширной модификации, если решение о дизайне будет изменено. Защита предусматривает создание стабильного интерфейса, который защищает оставшуюся часть программы от реализации (детали, которые, скорее всего, будут изменены).
Написано другим способом: скрытие информации - это возможность предотвратить доступ к своим клиентам определенных аспектов класса или программного компонента с использованием либо функций языка программирования (таких как частные переменные), либо явной политики экспорта.
То есть, скрытие информации - это способ обеспечения соблюдения абстракций. Мы не просто позволяем нашим звонящим мыслить в абстракции, мы заставляем их, скрывая знание конкретных вещей, о которых им не следует думать.
При том, что мы можем, наконец, говорить о капсулировании, который Википедия defines следующим образом:
Инкапсуляция является упаковкой данных и функций в одном компонент. Возможности инкапсуляции поддерживаются с использованием классов на большинстве объектно-ориентированных языков программирования, хотя существуют и другие альтернативы. Это позволяет выборочно скрывать свойства и методы в объекте путем создания непроницаемой стены для защиты кода от случайного повреждения.
Т.е. инкапсуляция - это скрытая информация (мы скрываем поля или методы).
С этой теорией в виду, по вашим вопросам:
WRT Point1 (выше) говорит, "Новый, лучше реализация может заменить старое.". Это цель абстракции, но не инкапсуляция. Я прав?
Поскольку инкапсуляция может использоваться для обеспечения абстракций, она может способствовать их использованию и поэтому может способствовать пожинанию их выгоды. На самом деле, это цель инкапсуляции.
Однако вы правы, что инкапсуляция без абстракции не способствует обмену опытом. Такая инкапсуляция не достигла своей цели; он был неправильно использован.
То есть в статье, которую вы цитируете, подразумевается, что инкапсуляция использовалась правильно.
Как программа поддержки инкапсуляции может независимо реализовать модуль без доступа к другим модулям? Как эта параллельная реализация модулей имеет какое-либо отношение к инкапсуляции? Потому что инкапсуляция - это защита в-вариантах.
Если инварианты защищены путем инкапсуляции, код вызова может не понадобиться не знать об этом инварианте. Если это так, то инвариант был абстрагирован, развитие вызывающего кода не зависит от этого инварианта, т. Е. Другой модуль может быть разработан независимо от этого инварианта.
«интерфейс» - это договор между компонентами. Каждая сторона должна работать только с контрактом, не зная о деталях реализации, поэтому разработчики могут работать параллельно, так как им не нужно знать друг о друге, возможно, неполные реализации. –
@PeterLawrey Но ваша точка имеет какое-то отношение к * Абстракции *, но не к * Инкапсуляции *. Потому что * Абстракция * связана с отделением интерфейса ('java.util.List' или' java.util.AbstractList') от реализации ('java.util.ArrayList'). – overexchange
Ключевой особенностью инкапсуляции является совместный контракт, предназначенный для скрытия деталей реализации. Абстракция делает это проще, но не требуется. –