Я не уверен, могут ли оба термина использоваться взаимозаменяемо. Может быть, есть какое-то академическое различие в информатике, которое не имеет отношения к повседневному программированию? Или я могу использовать оба термина взаимозаменяемо, не ошибаясь? Может быть, это зависит от контекста, в котором я использую оба термина?
Редактировать: По той причине, что я нахожу оба термина взаимозаменяемыми, есть запись в Википедии о уровне абстракции . Там вы можете найти цитату Дэвида Уилерса : «Все проблемы в информатике могут быть решены с помощью другого уровня косвенности».
computer-science
terminology
Тео Ленндорф
источник
источник
Ответы:
Абстракция имеет дело с упрощением, косвенное имеет дело с местоположением.
абстракцияэто механизм, который «скрывает» сложные детали объекта в терминах более простых, более простых в обращении терминов. В программировании хорошим примером является различие в деталях между машинным кодом и различными инструментами для создания приложений, которые в конечном итоге основаны на машинном коде. Рассмотрите возможность создания приложения Windows Form с IDE Visual Studio. Среда IDE позволяет рассматривать приложение с точки зрения простых в обращении элементов способом «что видишь, то и получаешь». Положение экранного виджета абстрагируется от визуального местоположения в кадре, которое можно изменить, перетаскивая виджет вокруг. Внутри IDE манипулирует виджетом, используя другой уровень абстракции, такой как язык высокого уровня (например, C #). Сам C # не манипулируется с помощью машинного кода, он манипулирует с помощью "Common Runtime Environment"
Под косвенным обращением подразумевается прозрачность расположения элемента. Если вы знаете URI веб-ресурса, вы можете получить доступ к ресурсу, не зная его точного местоположения. Вы не обращаетесь к ресурсу напрямую, вместо этого вы получаете доступ через канал, который передает ваш запрос через ряд серверов, приложений и маршрутизаторов. Направление может считаться особым типом абстракции, где местоположение абстрагируется.
источник
Абстракции реализуются с помощью косвенного обращения.
Например, виртуальная память: абстракция - это непрерывное адресное пространство, полностью находящееся в вашем распоряжении. Эта абстракция реализована с использованием косвенного обращения через таблицу страниц. Вместо прямого доступа к адресам физической памяти они переводятся с виртуального адреса на физический адрес.
Чтобы добавить слой абстракции, вы должны добавить слой косвенности. Но добавление косвенности не обязательно дает вам абстракцию. Например, наличие геттеров и сеттеров для каждой отдельной переменной является слоем косвенности, но если все, что они делают, это получают и устанавливают простые значения, то абстракция отсутствует.
источник
Во-первых, давайте попробуем правильные определения для терминов:
Слой абстракции означает:
Уровень косвенности с другой стороны означает:
Обе эти вещи могут означать одно и то же, если вы используете:
источник
Насколько я понимаю, абстракция в основном относится к функциям, а косвенность - к данным. Другими словами, уровень абстракции - это то, насколько глубокой становится ваша трассировка стека, а уровень косвенности - сколько указателей вы должны разыменовать. По крайней мере, так я использую термины.
источник
Слой абстракции и уровень косвенности - это разные понятия. Абстракция - это агрегация и осмысленное именование ряда элементов, таких как фрагменты данных или программные инструкции, например концепция вызова файла или метода, тогда как косвенное обращение - это разделение сущностей для облегчения отсрочки реализации их отношений, например, использование JNDI для отделения идентификации ресурса в программе от фактического ресурса, который в конечном итоге может быть предоставлен контейнером приложения.
Часто концепции идут рука об руку, и то, какое из них применимо к конкретной конструкции, зависит от того, какое упражнение или обсуждение ведутся. Например, абстрактная природа интерфейса важна при изучении или документировании API; его свойство косвенности важно при добавлении расширяемости или создании тестов для приложения.
Слой абстракции - это агрегация абстракций и придание им концептуальной целостности и последовательности использования. CreateProcess - это имя Win32 API для набора кода, который создает и выполняет процесс. «Имя» имеет важное значение для этого контекста, потому что если бы мы назвали функцию чем-то вроде DoAllocMemThenMakeEnvThenFindEntryPoint ... это действительно было бы не очень абстрактно. Слой, такой как Win32 API, обеспечивает барьер, через который программист может посоветовать не рисковать. Это устраняет сложность с точки зрения вызывающего абонента за счет снижения энергопотребления (гибкость, производительность и т. Д.). Этот компромисс подчеркивается частым обсуждением неплотных абстракций: нам все еще может потребоваться сделать прямые вызовы SQL при использовании Hibernate или вызовы Win32 при использовании .NET.
Что касается косвенного обращения, большинство нетривиальных программ работают с некоторой формой пользовательского кодированного косвенного обращения, о чем свидетельствует раздел INBUT-OUTPUT COBOL, который был до ковчега. При доступе к ресурсу, такому как база данных, мы можем видеть встраивание строки соединения JDBC в код как косвенное указание уровня 0, соединение JNDI (которое делегирует выбор ресурса в контейнер приложения) в качестве уровня 1 и некоторую конструкцию Spring, которая отображает идентификатор JNDI приложения для одного из многих контейнерных ресурсов уровня 2. Множество уровней позволяют множеству сторон, внешних по отношению к отношениям (в данном случае отношениям между выполнением кода и базой данных), манипулировать этими отношениями. Это в равной степени относится и к внутренним программным компонентам, таким как интерфейсы и события.
Мы видим, что независимо от других качеств абстракция уменьшает сложность, а косвенность увеличивает ее. Абстракция уменьшает силу, тогда как косвенность увеличивает ее. Косвенное обращение можно использовать для восстановления силы абстракции, позволяя переопределять поведение по умолчанию с помощью пользовательских обратных вызовов.
источник
Указатель на указатель на указатель на указатель на указатель на int имеет шесть уровней косвенности, но никаких уровней абстракции вообще не имеет.
источник
Хорошим примером абстракции является вызов единственного метода для сохранения элемента в базе данных. Метод абстрагирует детали подключения и вызова базы данных. Где пример косвенного обращения использует структуру для доступа к прерываниям. Вы по-прежнему обращаетесь к прерыванию, когда устанавливаете значения в структуре. это только косвенно через структуру, давая имена членов структуры определенным точкам в памяти.
Таким образом, абстракция скрывает детали реализации, где косвенное указание просто обеспечивает «косвенный» интерфейс для доступа к чему-либо.
Абстракция - это когда вам не нужно понимать, что скрывается, где вы делаете косвенное обращение.
источник
Добавление уровня (или уровня) абстракции и добавление уровня косвенности - это просто два способа сказать одно и то же. Когда вы решаете проблему, вы обычно пытаетесь решить ее напрямую. Иногда это невозможно, поэтому попробуйте косвенное решение. Это требует введения некоторой абстракции для упрощения проблемы, поскольку проблема сложна и не может быть решена напрямую. Решив проблему с помощью косвенного подхода, нет оснований не рассматривать решение проблемы снова, но в более общем плане; Это потребует введения другого, более высокого уровня абстракции. И это новое, более общее решение является даже более косвенным, чем первоначальное косвенное решение, т. Е. Так что был введен другой уровень косвенности.
источник