| 
  • If you are citizen of an European Union member nation, you may not use this service unless you are at least 16 years old.

  • You already know Dokkio is an AI-powered assistant to organize & manage your digital files & messages. Very soon, Dokkio will support Outlook as well as One Drive. Check it out today!

View
 

Программирование - Leaky Abstraction

Page history last edited by Boris Sivko 13 years, 5 months ago


 


 

Leak и не-Leak абстракции

 

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

 

Если абстракция не скрывает от пользователя (т.е. протекает - leak), то она помогает только в разработке, но не в сопровождении или использовании. Т.е. крайний случай утечки абстракции - если человеку нужно разобраться в её реализации.

 

Закон утечек абстракции

 

"Любые нетривиальные абстракции подвержены утечкам"

 

Примеры протекающих абстракций

 

Двумерный массив

 

Абстракция подразумевает, что имеется двумерный массив, при чем его реализация может быть различной. Пользователи же думают, что двумерный массив представляет собой в памяти набор элементов, которые идут друг за другом в порядке построчно (A(i,0), A(i,1), ... A(i, N)) и далее после строки идет переход на новую строку (+1). Например в соответствии с таким представлением пользователи могут осуществлять перебор всего массива самостоятельно в том порядке, котором они думают, рассчитывая, что такой перебор будет наиболее быстрым (например вследствие действия кэша, который будет содержать рядом расположенные участки памяти). Но в реальности данный массив может быть организован по-другому (например строки по вертикали A(0,i), A(1,i), ... A(N, i) или попасть на границы страниц памяти). Соответственно, от этого может пострадать производительность.

 

Но существенное в том, что пользователи задумываются о том, как реализована абстракция. А такое задумывание представляет собой утечку (конечно тут ещё вопрос, кто виноват - пользователи или разработчики). Решением может быть например отдельный метод или функция от разработчика, которая реализует эффективный перебор массива в соответствии с реализацией.

 

SQL

 

Язык предназначен для абстрагирования от внутренней реализации БД, т.е. пользователь должен написать то, что он хочет, а далее все это делает БД.

 

Классическим примером является разность в производительности запросов вида

 

select .. where a=b and b=c

 

и

 

select .. where a=b and b=c and c=a

 

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

 

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

 

Строки C++

 

На примере класса std::string.

При введении данного класса пользователю необходимо также рано или поздно освоить char *.

Например в языке можно написать 

 

std::string str = "Hello";
str = str + " world";

 

но нельзя написать

 

std::string str = "Hello" + " world";

 

На этом шаге придется разобраться с понятием char *.

Т.о. класс std::string не замещает полностью строки С и вынуждает пользователя её осваивать тоже.

 

Примеры непротекающих абстракций

 

Отсутствуют. Совсем не собирается абстракция, которая не подвержена leak.

Походу, любая абстракция leak, только в большей или меньшей степени.

 

Ссылки

 

  1. http://www.joelonsoftware.com/articles/LeakyAbstractions.html
  2. http://en.wikipedia.org/wiki/Leaky_abstraction

Comments (0)

You don't have permission to comment on this page.