Прежде всего, не будьте слишком амбициозными, так как вы сказали, что эти три понятия связаны (особенно первые два) и могут использоваться друг для друга во многих контекстах. Их правильное использование гораздо важнее, чем полное окончательное определение.
« скрытие данных » - это установка стены между клиентом и (частью) реализацией. Некоторые объекты модуля могут быть внутренними для модуля и невидимыми для его пользователей. Таким образом, это способ, способ избежать зависимости. если я не могу знать, как реализована одна вещь, ее реализация может измениться.
" data abstraction " перегруппирует разные типы данных в одну и ту же абстракцию. Это близко к идее протокола. Вы не знаете, как реализован объект, но вы знаете, что он соблюдает общеизвестный протокол, то есть набор методов, которые работают с различными типами данных. В Python хорошим примером является файловый объект. В Java используются интерфейсы. Это хорошо, потому что вам нужно меньше учиться, а также потому, что вы можете проверить некоторые свойства на уровне абстракции, т. Е. Для всех видов данных, перегруппированных по этой абстракции.
" encapsulation " - это создание оболочки вокруг объектов, которая упрощает их использование. это связано с идеей, что объекты в кодовой базе могут быть перегруппированы в слои все более низкого уровня. Один объект в слое вызывает только те, что находятся под ним. Например, если вы хотите нарисовать линию на экране, объект obkect может инкапсулировать только контекст openGL, блок пикселей и другие элементы. Эти низкоуровневые объекты инкапсулированы строковым объектом. Обратите внимание, что инкапсуляция может быть применена к одному и тому же объекту, когда он является частью разных слоев одновременно, не очень хорошо, но иногда неизбежно. Например, файлоподобный объект в python имеет метод высокого уровня / инкапсуляции (открытый, закрытый, чтение) и низкоуровневый (поиск).
Вот и все. Очевидно, что определение каждого из них может быть более широким, но они делают эти три понятия немного более разными.