Что означает "уровень косвенности" в афоризме Дэвида Уилера?

Я прочитал эту цитату в книге:

В информатике нет проблем, которые не могут быть решены с использованием другого уровня косвенности.

Может кто-нибудь объяснить это? Что означает "уровень косвенности"?

Из того, что я понял, косвенность - это причудливое имя для использования указателя значения вместо самого значения. Просьба уточнить это для меня.

Ответы

Ответ 1

"Направление" использует то, что использует что-то еще в самом широком смысле.

Таким образом, ваш пример, используя указатель значения вместо значения, соответствует этому определению на одном уровне. Указатель - это что-то, а значение - что-то еще.

Обычно это нечто большее по охвату:

  • Использование веб-сайта для графического отображения данных, сгенерированных службой на основе XML. Здесь веб-сайт - это то, что скрывается за ним - это данные, которые являются чем-то другим.
  • Использование операционной системы для доступа к экрану дисплея. Вот два слоя, по крайней мере, косвенности. ОС использует драйвер экрана. Один из них использует что-то другое. Затем экранный драйвер разговаривает непосредственно с аппаратным экраном экрана, заставляя его делать крошечные точки света здесь и там. Драйвер следующий, что-то, используя что-то еще, что является аппаратным обеспечением.
  • Нередко один API имеет дело с чем-то на высоком уровне и что API имеет дело с одним и тем же на более низком уровне. Снова уровень косвенности добавляется поверх API низкого уровня, и мы называем его новым улучшенным API.

Этот последний пример, возможно, объясняет "почему" всего этого.

По мере того, как мы работаем с чем-то, мы осваиваем его и учим, как абстрагировать его до более высокого уровня абстракции, поэтому необходим новый уровень косвенности, и мы можем быстрее решать большие проблемы, выгружая часть работы в новый API.

Ответ 2

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

В качестве примера, если вашему приложению необходимо прочитать некоторые сохраненные данные, вместо того, чтобы иметь конкретное знание того, где (и как) читать его, разбросанное по всему приложению, вы его изолируете (поместите это чтение данных в метод), а затем пусть все остальные части вашего приложения вызовут этот метод, чтобы получить данные, а не каждую часть приложения, чтобы иметь дело с этими деталями.