В чем разница между «уровнем абстракции» и «уровнем косвенности»?


38

Я не уверен, могут ли оба термина использоваться взаимозаменяемо. Может быть, есть какое-то академическое различие в информатике, которое не имеет отношения к повседневному программированию? Или я могу использовать оба термина взаимозаменяемо, не ошибаясь? Может быть, это зависит от контекста, в котором я использую оба термина?

Редактировать: По той причине, что я нахожу оба термина взаимозаменяемыми, есть запись в Википедии о уровне абстракции . Там вы можете найти цитату Дэвида Уилерса : «Все проблемы в информатике могут быть решены с помощью другого уровня косвенности».


7
... кроме проблемы слишком большого количества уровней косвенности!
Мейсон Уилер

@MasonWheeler: Вы можете добавить еще один, менее косвенный уровень косвенности ...
Джон Пурди,

C ++ позволяет добавлять уровень абстракции без уровня косвенности, поэтому они не могут означать одно и то же.
fredoverflow

Ответы:


30

Абстракция имеет дело с упрощением, косвенное имеет дело с местоположением.

  • абстракцияэто механизм, который «скрывает» сложные детали объекта в терминах более простых, более простых в обращении терминов. В программировании хорошим примером является различие в деталях между машинным кодом и различными инструментами для создания приложений, которые в конечном итоге основаны на машинном коде. Рассмотрите возможность создания приложения Windows Form с IDE Visual Studio. Среда IDE позволяет рассматривать приложение с точки зрения простых в обращении элементов способом «что видишь, то и получаешь». Положение экранного виджета абстрагируется от визуального местоположения в кадре, которое можно изменить, перетаскивая виджет вокруг. Внутри IDE манипулирует виджетом, используя другой уровень абстракции, такой как язык высокого уровня (например, C #). Сам C # не манипулируется с помощью машинного кода, он манипулирует с помощью "Common Runtime Environment"

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


2
+1 лучший ответ до сих пор! Собирался написать один, но этот достаточно близок к тому, что я имел в виду.
Newtopian

27

Абстракции реализуются с помощью косвенного обращения.

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

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


2
На самом деле последний пример не очень хорош. Простые методы получения и установки действительно добавляют абстракцию. Единственный, кто знает, они простые, это класс, который их объявляет. Если вы решите изменить реализацию, любой код, созданный на основе абстракции, не будет затронут.
back2dos

Можете ли вы привести лучший пример, который является косвенным, но не абстрагирующим?
Мистер Кодер

1
безусловно, неправильный пример
Морг.

3
Кто сказал что-нибудь о занятиях? Я также ничего не сказал об изменении видимости переменной. Ничто не мешает вам получить прямой доступ к нему; это переменная. Но вы также можете сделать это с уровнем косвенности через геттер и сеттер. Так как семантика использования getter и setter такая же, как прямой доступ к переменной, абстракции нет.
Остин

2
За исключением того, что геттер и сеттер не обязательно «просто» обращаются к переменной. Если вы используете метод получения и установки, вы добавляете абстракцию, поскольку вы можете изменить их, чтобы использовать другую переменную без ведома пользователя, следовательно, абстракции.
Доминик Макдоннелл,

9

Во-первых, давайте попробуем правильные определения для терминов:

  1. Слой абстракции означает:

     a) there is large number of positions which use abstraction
          (layer = all the positions together)
     b) each position is hiding some complex stuff, but allows invoking it 
          using only simple code. 
         (abstraction == one-to-one mapping between simple code and complex code)
    
  2. Уровень косвенности с другой стороны означает:

      a) you're counting levels
      b) indirection==there are several steps before you can reach or access the data
      c) level of indirection is just how many steps it takes to access the data
    

Обе эти вещи могут означать одно и то же, если вы используете:

  a) step = going from simple code to complex code. 

7

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


виртуальные функции моделируются как указатели на функции?
Caleth

7

Слой абстракции и уровень косвенности - это разные понятия. Абстракция - это агрегация и осмысленное именование ряда элементов, таких как фрагменты данных или программные инструкции, например концепция вызова файла или метода, тогда как косвенное обращение - это разделение сущностей для облегчения отсрочки реализации их отношений, например, использование JNDI для отделения идентификации ресурса в программе от фактического ресурса, который в конечном итоге может быть предоставлен контейнером приложения.

Часто концепции идут рука об руку, и то, какое из них применимо к конкретной конструкции, зависит от того, какое упражнение или обсуждение ведутся. Например, абстрактная природа интерфейса важна при изучении или документировании API; его свойство косвенности важно при добавлении расширяемости или создании тестов для приложения.

Слой абстракции - это агрегация абстракций и придание им концептуальной целостности и последовательности использования. CreateProcess - это имя Win32 API для набора кода, который создает и выполняет процесс. «Имя» имеет важное значение для этого контекста, потому что если бы мы назвали функцию чем-то вроде DoAllocMemThenMakeEnvThenFindEntryPoint ... это действительно было бы не очень абстрактно. Слой, такой как Win32 API, обеспечивает барьер, через который программист может посоветовать не рисковать. Это устраняет сложность с точки зрения вызывающего абонента за счет снижения энергопотребления (гибкость, производительность и т. Д.). Этот компромисс подчеркивается частым обсуждением неплотных абстракций: нам все еще может потребоваться сделать прямые вызовы SQL при использовании Hibernate или вызовы Win32 при использовании .NET.

Что касается косвенного обращения, большинство нетривиальных программ работают с некоторой формой пользовательского кодированного косвенного обращения, о чем свидетельствует раздел INBUT-OUTPUT COBOL, который был до ковчега. При доступе к ресурсу, такому как база данных, мы можем видеть встраивание строки соединения JDBC в код как косвенное указание уровня 0, соединение JNDI (которое делегирует выбор ресурса в контейнер приложения) в качестве уровня 1 и некоторую конструкцию Spring, которая отображает идентификатор JNDI приложения для одного из многих контейнерных ресурсов уровня 2. Множество уровней позволяют множеству сторон, внешних по отношению к отношениям (в данном случае отношениям между выполнением кода и базой данных), манипулировать этими отношениями. Это в равной степени относится и к внутренним программным компонентам, таким как интерфейсы и события.

Мы видим, что независимо от других качеств абстракция уменьшает сложность, а косвенность увеличивает ее. Абстракция уменьшает силу, тогда как косвенность увеличивает ее. Косвенное обращение можно использовать для восстановления силы абстракции, позволяя переопределять поведение по умолчанию с помощью пользовательских обратных вызовов.


1

Указатель на указатель на указатель на указатель на указатель на int имеет шесть уровней косвенности, но никаких уровней абстракции вообще не имеет.


0

Хорошим примером абстракции является вызов единственного метода для сохранения элемента в базе данных. Метод абстрагирует детали подключения и вызова базы данных. Где пример косвенного обращения использует структуру для доступа к прерываниям. Вы по-прежнему обращаетесь к прерыванию, когда устанавливаете значения в структуре. это только косвенно через структуру, давая имена членов структуры определенным точкам в памяти.

Таким образом, абстракция скрывает детали реализации, где косвенное указание просто обеспечивает «косвенный» интерфейс для доступа к чему-либо.

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


-1

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


3
это , кажется, не добавляет ничего существенного по точкам сделанных и объяснено в предыдущих 7 ответов
комар

Спасибо, Гнат. Я понимаю вашу точку зрения, и очень жаль, что этот интересный вопрос привлекает много спама!
ChrisC
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.