УДК 004.053 DOI: 10.25513/2222-8772.2018.1.131-143
О ФОРМАЛЬНОМ ОПРЕДЕЛЕНИИ АБСТРАКЦИИ
Е.А. Тюменцев
ген. директор, e-mail: [email protected]
LLC Hello World! Technologies, Омск, Россия
Аннотация. В статье предлагается формальное определение абстрагирования как отображения множества сущностей во множество подслов всех слов некоторого алфавита, иерархии абстракций как отношения на множестве подслов языка и интерпретации. Также получен ряд ограничений, которым обладает механизм абстрагирования.
Ключевые слова: абстрация, барьер абстракции, наследование, Гради Буч, Барбара Лисков, Роберт Мартин.
Введение
Абстракция — одно из важнейших понятий в программировании. По словам Ахо и Ульмана [1]: «Computer Science is a science of abstraction — creating the right model for thinking about a problem and devising the appropriate mechanizable techniques to solve it». При этом, как отмечено, например, в [2], его понимание и изучение, и, как следствие, применение на практике, вызывает серьёзные трудности. На наш взгляд, возможная причина связана с неформальным характером широко используемых определений. Например, вот одно из наиболее популярных, предложенное Гради Бучем [3]:
«Абстракция выделяет существенные характеристики некоторого объекта, отличающие его от всех других объектов».
Его часто используют в университетских курсах по программированию, цитируют или перефразируют в учебных пособиях и учебниках, например: [4, с. 172], [5, с. 375].
В своей книге Буч отмечает, что похожие формулировки можно встретить у Даль, Дейкстры и Хоара [6], Шоу [7], Берниса, Грея, Наумана [8] и др.
Отметим одну из особенностей этих определений: они объясняют назначение абстракции, но при этом никак не поясняют, что именно является абстракцией.
Ещё одно определение даёт Барбара Лисков в книге [9]:
«The process of abstraction can be seen as application of many-to-one
mapping».
Однако она не поясняет ни область значений, ни область определения такого отображения, ни саму природу отображения «многие-к-одному».
В настоящей статье мы предлагаем формальное определение абстракции, иллюстрируем его применение на нескольких примерах и формулируем несколько ограничений, связанных с абстракцией, в виде утверждений. Публикуемые результаты были представлены на конференции [10].
1. Некоторые базовые определения
Нам потребуются базовые понятия теории формальных языков. Для удобства читателя приведём их в этой статье.
Начнём с символа, или буквы. Как и водится с исходными понятиями, мы не можем дать точное определение символа, а лишь попытаемся пояснить его смысл. Итак, символ - это некий знак, который рассматривается как неделимое единое целое. Чаще всего мы будем обозначать символы латинскими буквами a, Ь, с.
Все, что мы можем сказать про два произвольных символа, — это одинаковы они или нет. Причём одинаковость символов может трактоваться по-разному, в зависимости от ситуации. Например, следует ли считать одинаковыми буквы а и А латинского алфавита — зависит от того, хотите ли вы различать написание слов в верхнем и нижнем регистрах. Или одинаковые при написании буквы а кириллицы и буквы а латинского алфавита все же являются различными символами.
Тогда алфавит — это произвольное непустое конечное множество символов. Мы будем обозначать алфавит буквой £.
Словом в алфавите £ называется произвольная конечная последовательность букв а\а2 .. .ап, где а» G £,i Е (1, 2,... ,п).
Подсловом слова w = а\а2 ...ап, где а» G £,i Е (1, 2,...,п) в алфавите £ называется любая подпоследовательность aiai+\.. .aj, где г ^ 1, г ^ j,j ^ п.
На множестве слов определена операция конкатенации слов.
Формальным языком над алфавитом £ называется произвольное подмножество конечных слов в алфавите £.
Пример 1. Рассмотрим язык C++. Процедура
void f() {
for(int i = 0; i < 10; ++i)
{
std::cout << i;
}
}
является словом языка C++, а лексемы void {}(),:: = ; for и т. д. — символвами алфавита. Среди всех подслов данного слова будут
void f() void f
std::cout << i;
for(int i = 0; i < 10; ++i) {
std::cout << i;
}
int i = 0; i=0 =0 < 10; ++
Пусть L — формальный язык над некоторым алфавитом £. Будем обозначать L — множество всех подслов каждого слова языка L.
Предложение 1. Для любого алфавита £ множество £* всех конечных слов в этом алфавите счётно.
Доказательство. Это хорошо известный факт из стандартного курса математической логики. ■
2. Определение
Определение 1 (Формальное определение абстракции). Пусть £ - произвольный алфавит символов, А с £* - произвольное подмножество множества всех слов в алфавите £,Х - некоторое множество. Тогда сюръективное отображение Р : X ^ А называется абстрагированием множества X над алфавитом £, или, кратко, абстрагированием множества X, если это не вызывает разночтений. При этом элементы множества X будем называть сущностями, а элементы множества А - абстракциями.
Предлагаемое определение не привязано ни к какой методологии разработки программного обеспечения, и лишь отражает необходимость переноса сущностей предметной области на конструкции используемого языка программирования.
Пример 2 (Десятичная запись целого числа). Рассмотрим алфавит
£ = {-0123456789} и подмножество ИН всех цепочек £* вида:
... д,п,
где п ^ 1,ё,1 е {12 3 456 78 9},& е {0 1 2 3456789}, 2 ^ г ^ п, или вида:
—^1^2 ... dm,
где m ^ Mi G {123456789},dj G {0123456789}, 2 ^ j ^ m, либо цепочку
0.
Тогда отображение IntD : Z ^ DR, которое сопоставляет каждому целому числу его запись в десятичной системе счисления является абстрагированием.
Пример 3 (Двоичная запись целого числа в Java). Рассмотрим алфавит £ = {— b01} и подмножество BR всех цепочек £* вида:
0bd1d2.. .dn,
где n ^ 1,di G {0 1}, 1 ^ i ^ п, или вида:
-0bd1d2... dm,
где m ^ 1,dj G {0 1}, 1 ^ г ^ т, либо
060.
Тогда отображение IntB : Z — BR, которое сопоставляет каждому положительному целому числу строку символов вида 06[запись числа в двоичной системе счисления], отрицательному целому числу строку символов вида —06[запись модуля числа в двоичной системе счисления], 0 - 060, является абстрагированием.
Определение 2. Пусть L с £* - формальный язык над алфавитом £, F : X —у Abs — некоторое абстрагирование множества X над алфавитом £. Тогда абстрагирование F применимо к языку L тогда и только тогда, когда Ух G F (X) : ж G L.
Пример 4. Абстрагирование IntD из примера 2 применимо к языкам C++, Java, PHP, Python и многим другим, а IntB из примера 3 применимо к языку Java, начиная с версии 7.
Как видно из последних примеров, образы одной и той же сущности предметной области могут отличаться относительно разных абстрагирований. Но может быть и обратная ситуация, когда образы нескольких сущностей относительно разных абстрагирований совпадают. В тексте программы представлены только абстракции. Значит, для понимания программного кода и предметной области необходимо по абстракциям восстановить набор использованных абстрагирований. В некоторых случаях, например, магические константы (в программе используются числовые константы без пояснения смысла), это сделать довольно сложно. Именованные константы, говорящие названия переменных и методов — это встраивание информации для простого и быстрого восстановления информации об абстрагированиях. Сравните:
2 и int maxPlayers = 2;
int f (int a, int b); и int sum(int aryl, int ary2);
3. Иерархия абстракций
Хорошо известный факт (классификация Хомского), что каждый формальный язык можно описать с помощью формальной грамматики. Формальная грамматика - это частный случай исчисления. Следовательно, используя правила вывода соответствующего исчисления - правила формальной грамматики -можно одни подслова и слова выводить из других.
Определение 3. Пусть Ь - произвольный формальный язык над некоторым алфавитом £, Сг(Ь) - исчисление, в котором выводимы все слова языка Ь. Определим на множестве всех его подслов Ь отношение Нг следующим образом:
Уи, т е Ь : (и,ь) е Нг ^^ ..., чип,
где п ^ 1, - вывод в исчислении Сг(Ь), такой что тп = т, 3] е (1, 2,...п) : 'Шу = и, причём и встречается только один раз среди Wj, последовательность т1,... ^з^,™]^,... ,-шп выводом не является. Отношение Нг называется отношением иерархии на множестве всех подслов Ь, заданного с помощью исчисления Сг(Ь), или, кратко, если это не вызывает разночтений, отношением иерархии.
Предложение 2. Пусть Ь - произвольный формальный язык над некоторым алфавитом £, Сг(Ь) - исчисление, в котором выводимы все слова языка Ь. Отношение иерархии Нг на множестве всех подслов Ь, заданного с помощью исчисления Сг(Ь), является: рефлекисвным, транзитивным.
Доказательство. Следует непосредственно из определения отношения иерархии и понятия выводимости в исчислении. ■
Определение 4. Пусть Ь - произвольный формальный язык над некоторым алфавитом £, Сг(Ь) - исчисление, в котором выводимы все слова языка Ь, Нг - отношение иерархии на множестве всех подслов Ь, заданного с помощью исчисления Сг(Ь). Предположим, что и,т - две абстракции, которые определены с помощью некоторых абстрагирований, применимых к языку Ь. Тогда и называется низкоуровневой абстракцией по отношению к т, а т -высокоуровневой абстракцией по отношению к т тогда и только тогда, когда (и, у) е Нг.
4. Барьер абстракции и обобщение
С абстракцией связывают понятие барьера абстракции, когда в силу ограниченного числа выделенных характеристик одна и та же абстракция может сразу соответствовать нескольким сущностям предметной области, другими словами, эти сущности становятся неразличимыми. С точки зрения данного
нами определения существование барьера — это утверждение о том, что не всякая абстракция F обязательно является инъективным отображением.
Пример 5. Рассмотрим абстракцию
class Person {
std::string lastname;
std::string firstname;
};
Эта абстракция не позволяет различать людей, которые являются тезками.
Предложение 3. Пусть L - произвольный формальный язык над некоторым алфавитом £. Существует такой набор сущностей X, что для любого абстрагирования F существует сущность х g X, для которой
1. либо F(x) не определена,
2. либо Зу G X : F(х) = F(у).
Доказательство. Согласно утверждению 1 множество £* счётно. Рассмотрим множество действительных чисел R и произвольное абстрагирование F : R ^ А, где А с £*.
Предположим, что Vx1,x2 Е R : F(ж1) = F(х2), то есть F - инъективно. Тогда F определено на всем множестве и получаем взаимнооднозначное отображение R и А, но в таком случае R не более чем счётно, либо F определено не на всем множестве R.
Предположим, что F определено на всем множестве R. Тогда F не может быть инъективным, иначе получим опять взаимнооднозначное отображение R и А. ■
Определение 5. Пусть £ - произвольный алфавит символов. Рассмотрим F : X ^ А, где А с £*, - некоторое абстрагирование множества X над алфавитом £. Будем говорить, что F является абстрагированием с обобщением, если и только если
Зх,у G X : F(х) = F(у).
Определение 6. Пусть £ - произвольный алфавит символов. Рассмотрим F : X ^ А, где А с £*, - некоторое абстрагирование множества X над алфавитом £. Будем говорить, что абстракция а, а Е А, обобщает сущности х,у G X, если и только если
F (ж) = F (у) = а.
Утверждение 3 показывает, что есть такие наборы сущностей, для которых абстрагирование будет либо определённым частично, либо абстрагированием с обобщением. Возникает естественный вопрос: как часто встречаются такие наборы сущностей?
Предложение 4. Пусть £ - произвольный алфавит символов, 'ш - некоторое слово в этом алфавите, Р : X л А, где А с £*, - некоторое абстрагирование множества X над алфавитом £. Предположим, что слово т содержит все абстракции множества А в качестве подслов. Тогда:
• либо Р является абстрагированием с обобщением,
• либо X - конечное множество,
• либо Р определено частично на множестве X.
Доказательство. Конечность множества А вытекает из предположения, что слово т содержит все абстракции множества А в качестве подслов, а любое слово конечно. По определению абстрагирования Р - сюръективное отображение, а, следовательно, |Х| ^ |А|.
Если Р является инъективным, то Р - взаимнооднозначное отображение, и тогда IX| = |А|.
Если X не является конечным множеством, то либо Р определено частично, в этом случае оно может быть инъективным на своей области определения, либо будет абстрагированием с обобщением, то есть не будет инъективным.
Если Р определено на всем множестве X, то либо Р инъективно, а значит Р взаимнооднозначно и |Х| = |А|, либо Р - абстрагирование с обобщением. ■
Практический смысл данного утверждения заключается в том, что программисту приходится постоянно иметь дело либо с обобщением, либо соглашаться с тем, что его программа определена только для неполного набора сущностей. На конечность множества сущностей рассчитывать не приходится, так как разработка программы - процесс, развивающийся во времени. А с течением времени часто наше понимание об исходных сущностях либо меняется само по себе, либо под воздействием внешних факторов. Например, множество способов оплаты в магазине постоянно меняется, потому что магазины придумывают разные способы привлечения клиента: бонусы, подарочные сертификаты и т. д., появляются новые технологии, например, ЫРС. Другими словами, имея на данный момент конечный набор сущностей, нельзя быть уверенным, что он не поменяется в будущем.
Предложение 5. Пусть £ - произвольный алфавит символов, Р : X л А, где А с £*, - некоторое абстрагирование с обобщением множества X над алфавитом £, причём |A| > 1. Предположим, что У - множество такое, что \У | > 1, 1(1: У л АУ - взаимнооднозначное абстрагирование множества У над алфавитом £. Тогда существует такое отображение С : X л У, для которого не существует д : А л АУ, чтобы следующая диаграмма была коммутативной:
X Л А С | | д
у 4 ау
Доказательство. Проведём построением примера. Поскольку абстрагирование с обобщением, причём |А| > 1, то существуют такие различные
Xi,X2,X3 G X : F(xi) = F(^2) = F(х3).
Поскольку \Y| > 1, то найдутся два различных у1,у2 G Y. Определим действие G : X ^ Y на х1 как G(x1) = у1, а G(x2) = у2. По условию id(y1) = id(y2). Поскольку F(ж1) = F(х2), то Уд : А ^ AY : g(F(ж1)) = g(F(х2)), но, по построению функции G, имеем id(G(x1)) = id(G(x2)). ■
Практическое значение этого утверждения заключается в том, что какое бы множество абстракций размерности больше одного программист не выбрал, найдётся функция, отличная от константной, которая не может быть реализована с помощью этого набора абстракций. То есть не существует «универсальных» абстракций, подходящих на все случаи жизни. Есть конструкции языков программирования, например, if-else, оператор множественного выбора switch требуют явного перечисления всех вариантов, а значит поощряют создание множеств абстракций размерности не менее, чем два. То есть реализация новых бизнес-требований может потребовать правок программного кода (соот-вествующих абстракций), а это, в свою очередь, как показано в [11], может приводить к снижению скорости разработки программного продукта.
5. Некоторые свойства и ограничения абстрагирований
Широко известный факт из университетского курса математической логики - образ любого отображения задаёт отношение эквивалентности на области определения. Следовательно,
Замечание 1. Пусть £ - некоторый алфавит символов, F : X ^ А, где А с £*, - произвольное абстрагирование множества X над алфавитом £. Множество абстракций А определяет отношение эквивалентности на множестве сущностей X.
Более того, в условиях предыдущего замечания,
Замечание 2. Если множество X является носителем какой-либо алгебраической системы, то абстрагирование F может оказаться конгруэнцией.
Замечание 3. Если множества X и А являются носителями каких-либо алгебраических систем, то абстрагирование F может оказаться морфизмом.
Предложение 6. Пусть £ - произвольный алфавит символов. Множество всех возможных абстрагирований над алфавитом £ несчётно.
Доказательство. Согласно утверждению 1 множество £* счётно. Рассмотрим все различные множества Ха = {а}, где а е К, состоящие из одного действительного числа. Таких множеств несчётно. Тогда и абстрагирований вида Ра : Ха л А, где А = {а}, а е £*, — множество абстракций А состоит из одного слова. Множество все абстрагирований Ра, где а е К, будет несчётным. ■
Предложение 7. Пусть £ - произвольный алфавит символов. Задача построения произвольного абстрагирования алгоритмически не разрешима.
Доказательство. Следует из факта существования универсальной машины Тьюринга и утверждения 6. ■
6. Интерпретация абстракций
Сами по себе слова формального языка - это лишь конечные цепочки символов. Тем не менее, они несут смысловую нагрузку, которую можно определить с помощью понятия интерпретации.
Определение 7. Пусть £ - некоторый алфавит, Ь - формальный язык над алфавитом £. Тогда отображение I : Ь Л У, где У - некоторое множество, будем называть интерпретацией языка Ь на множестве У.
Замечание 4. Скорее всего, интерпретация будет определена частично на множестве Ь.
Например, для пустого оператора языка С++
который значит «ничего не делать», может не существовать интерпретации, или, для выражения
5+5+
Замечание 5. Для определения интерпретации можно использовать отношение иерархии Нг (см. определение 3) на множестве всех подслов L, заданного с помощью исчисления Gr(L).
Пример 6. Рассмотрим формальный язык Fs, который описывает множество арифметических формул над кольцом целых чисел Z. Определим формальную грамматику для данного языка. Множество терминальных символов
Т = {0123456789 + -()}.
Начальный нетерминальный символ - это «Formula». Грамматика будет учитывать приоритет операций.
Formula ::= Formula + Add | Formula - Add | Add Add ::= -Number | Number | (Formula)
Number ::= Number 0 | Number 1 | Number 2 | Number 3 | Number 4 |
| Number 5 | Number 6 | Number 7 | Number 8 | Number 9 Number ::=0|1|2|3|4|5|6|7|8|9
Множество нетерминальных символов составляет
N = {Formula Add Number}.
Определим теперь интерпретацию I для языка Fs в кольцо целых чисел Z. Для того чтобы отличать записи слов языка Fs и элементы в Z, будем к числам из Z добавлять индекс z.
Рассмотрим произвольное слово w Е Fs и восходящий вывод этого слова с помощью определённой выше грамматики:
W1,W2, . . . ,Wn,
где w1 = w, wn = Formula, n Е N. Определим теперь серию функций
Vi(N,N) ^ Z,
где i G (1, 2,... ,n), индукцией по номеру г. Пусть г =1. Тогда функция V1(N, N) = 0.
Предположим, что все функции Vi с номерами i < М,М > 1,М G N, уже определены. Построим определение функции Vm.
Если М > п, тогда V1(N, N) = 0. Иначе, рассмотрим слово wm. Запишем слово wm как uRv, где R - нетерминальный символ, который получился в результате применения одного из правил. Обозначим как г позицию нетерминального символа R в слове wm, а количество символов в правой части правила, в результате которого получился R, как с. Рассмотрим произвольный нетерминальный символ А, входящий в запись слова wm. Пусть р - его позиция в записи этого слова.
Если р < г, то определим Vm(р,А) = Vm-1(р,А). Если р> г, тогда Vm(р, А) = Vm-1(р - с + 1, А).
Смысл последних двух выражений — значение функции не меняется для тех нетерминальных символов, которые не были затронуты применением последнего правила. Рассмотрим случай, когда р = г. То есть случай, когда А = R. Для того чтобы определить значение Vm(R), необходимо рассмотреть все варианты правил.
• Правило Number ::= 0, тогда
Vm (г, Number) = 0. Здесь 0 - это целое число. Аналогично поступаем в случае правил
Number ::= 1,... , Number ::= 9.
• Правило Number ::= Number 0, тогда
Vm(г, number) = Vm-1 (r, Number) * 10 + 0. Аналогично поступаем в случае правил
Number ::= Number 1,..., Number ::= Number 9.
• Правило Add ::= Number, тогда
Vm(r, Add) = Vm-1(r, Number) mod 232.
Сравнение по модулю 232 связано с тем, что в вычислительных машинах имеется ограниченное число разрядов для представления данных. В данном примере предполагаем, что строим интерпретацию для 32-разрядной машины.
• Правило Add ::= —Number, тогда
VM (г, Add) = VM-1(r + 1, Number) mod 232.
• Правило Add ::= (Formula), тогда
Vm(r, Add) = Vm-1(r + 1, Formula).
• Правило Formula ::= Formula + Add, тогда
Vm(r, Formula) = Vm-1(r, Formula) + Vm-1(r + 2, Add) mod 232.
• Правило Formula ::= Formula + Add, тогда
Vm(r, Formula) = Vm-1(r, Formula) — Vm-1(r + 2, Add) mod 232.
Во всех остальных случаях отображение Vm равно 0.
Тогда интерпретацией слова w будем считать значение Vn(1, Formula).
Одно и тоже слово может иметь несколько выводов, а значит и интерпретация такого слова может быть различной в зависимости от того, какой вывод был использован для её вычисления. Здесь возможно несколько вариантов.
Доказать, что значение интерпретации не зависит от выбранного вывода. Пример 6 — как раз такой случай. В статье это не сделано, так как пример нужен только, чтобы показать, как интерпретация строится, и обозначить проблему разных выводов.
• Указать какой-либо способ выбора применяемых правил, чтобы ограничиться только одним возможным выводом. Например, левосторонний вывод в ЬЬ(1)-грамматиках.
• Исключить из языка слова, которые допускают неоднозначность интерпретации. Например, следующая запись считается ошибочной в C++: f(++i, ++i);
Заметим, что в примере 6 абстрагирование ЯпЬЯ : Z Л ЯЯ из примера 2 продолжается до гомоморфизма аддитивной группы Z и аддитивной группы Z232 : I о 1пЮ : Z Л Z232. Этот факт в программировании известен как переполнение при арифметических операциях над целыми числами. Если же вместо абстрагирования 1пЮ : Z л ЯЯ взять построенное по аналогии 1пЮ32 : Z232 л ЯЯ, то его можно продолжить до автоморфизма аддитивной группы Z232 : I о 1пЮ32 : Z232 Л Z232.
Этот факт позволяет использовать следующие эквивалентности
4294967295 = -1(то^ 4294967296) 4294967294 = -2(тоА 4294967296)
2147483648 = -21474836478(то^ 4294967296)
для представления отрицательных чисел в виде дополнительного кода и сэкономить на транзисторах для операции вычитания при разработке процессора — вместо неё используется сумматор.
Если попробовать построить по аналогии абстрагирование для вещественных чисел на множество чисел с плавающей точкой, то такое абстрагирование не будет морфизмом вообще. То есть если взять два вещественных числа, например, 5.2 и 3, и перемножить, то получим 15.6, тогда как для чисел с плавающей точкой равенство 5.2 * 3 = 15.6 окажется неверным. Это связано с тем, что любой интервал вещественных чисел содержит несчётное число чисел, а чисел с плавающей точкой — только лишь конечное число, поэтому при абстрагировании вещественных чисел числами с плавающей точкой возникает проблема округления — представление вещественного числа ближайшим к нему числом с плавающей точкой. Из-за этого вместо операции равенства используется сравнение модуля разности чисел с некоторым маленьким числом е, а в математике возникло целое направление — вычислительные методы, которое занимается изучением вычислений с плавающей точкой, чтобы их результат был максимально близок к вычислениям в вещественных числах.
Ещё один момент, который необходимо иметь ввиду при построении абстрагирований: интерпретация может меняться, например, из-за изменения архитектуры процессора.
Пример 7. Выражение 65535 + 1 == 0 будет истинным на 16-разрядной архитектуре, но ложным на 32-разрядной.
Определение 8. Пусть £ - некоторый алфавит, Ь - формальный язык над алфавитом £. Тогда абстрагирование Я : X л А, где А с Ь, называется устойчивым относительно интерпретаций 11 : Ь Л У и 12 : Ь Л У, где У - некоторое множество, если и только если
Ух е X : 11 о Я (ж) = 12 о Я (х).
Замечание 6. Устойчивость абстракции транзитивна.
Литература
1. Aho A., Ulman J. Foundations of Computer Science: C Edition (Principles of Computer Science Series). URL: http://i.stanford.edu/~ullman/focs.html (дата обращения: 01.10.17).
2. Hazzan O. Reflections On Teahcing Abstraction and other Soft Ideas ACM SIGCSE Bulletin. 2008. Vol. 40(2). P. 40-43.
3. Буч Г., Максимчук Р., Энгл М., Янг Б., Коннален Дж., Хьюстон К. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. М. : «И.Д. Вильямс», 2008. 720 с.
4. С.А. Орлов. Технологии разработки программного обеспечения: учебник для вузов. СПб. : Питер, 2004. 527 c.
5. Рапаков Г.Г., Ржеуцкая С.Ю. Программирование на языке Pascal. СПб. : БХВ-Петербург, 2004. 480 c.
6. Dahl O., Dijkstra E., Hoare C. Structured Programming. London : Academic Press. 1972. P. 83.
7. Shaw M. Abstraction Techniques in Modern Programming Languages // IEEE Software. 1984. Vol. 1(4). P. 10.
8. Berzins V, Gray M., Naumann D. Abstraction-Based Software Development // Communications of the ACM. 1984. Vol. 29(5). P. 403.
9. Liskov B., Guttag J. Program Development in Java: Abstraction, Specification, and Object-Oriented Design. Pearson Education, 2000. 464 p.
10. Тюменцев Е.А. Формальное определение абстракции. С. 36-38.
11. Тюменцев Е.А. О формализации процесса разработки программного обеспечения // Математические структуры и моделирование. 2017. № 3(43). С. 96-107.
12. The Liskov Substitution Principle. URL: http://www.objectmentor.com/ resources/articles/lsp.pdf (дата обращения: 01.12.12).
ABOUT FORMAL DEFINITION OF AN ABSTRACTION
E.A. Tyumentsev
CEO, e-mail: [email protected]
LLC Hello World! Technologies, Omsk, Russia
Abstract. The article proposes a formal definition of abstraction as a mapping of a set of entities into a set of subwords of all words of some alphabet, a hierarchy of abstractions as relations on the set of subwords of a language and interpretation. Also received a number of limitations, which has an abstraction mechanism.
Keywords: abstraction, abstarction barrier, inheritance, Grady Booch, Barbara Liskov, Robert Martin.
Дата поступления в редакцию: 31.01.2018