Уровень косвенности в программировании

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 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) 
 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. 

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

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

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

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

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

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

Источник

Оцените статью