0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p><strong>Абстракции позволяют нам моделировать необходимую предметную область.</strong>Попробуем понять это утверждение на конкретном примере. Допустим, мы хотим сделать программу-каталог для управления коллекцией книг. Вы можете сразу кинуться писать код, но так делать не стоит :)</p>
1
<p><strong>Абстракции позволяют нам моделировать необходимую предметную область.</strong>Попробуем понять это утверждение на конкретном примере. Допустим, мы хотим сделать программу-каталог для управления коллекцией книг. Вы можете сразу кинуться писать код, но так делать не стоит :)</p>
2
<p>В первую очередь необходимо проанализировать предметную область (книги + каталоги) и сформировать базовую модель. Нужно начать с определения сущностей и операций над ними. В случае нашего каталога у нас есть по крайней мере две сущности: книга и коллекция. Базовыми операциями сделаем добавление книги в коллекцию и удаление её из коллекции.</p>
2
<p>В первую очередь необходимо проанализировать предметную область (книги + каталоги) и сформировать базовую модель. Нужно начать с определения сущностей и операций над ними. В случае нашего каталога у нас есть по крайней мере две сущности: книга и коллекция. Базовыми операциями сделаем добавление книги в коллекцию и удаление её из коллекции.</p>
3
<p>Напишем код операции для добавления сущности в коллекцию:</p>
3
<p>Напишем код операции для добавления сущности в коллекцию:</p>
4
<p>Мы создаём две книги, одну коллекцию и добавляем эти книги в коллекцию. Что значит "создали книгу"? Что такое "книга"? Книга - это сущность, которая ведёт себя как книга. Что это значит?</p>
4
<p>Мы создаём две книги, одну коллекцию и добавляем эти книги в коллекцию. Что значит "создали книгу"? Что такое "книга"? Книга - это сущность, которая ведёт себя как книга. Что это значит?</p>
5
<p>Так как мы работаем с языком программирования, то конструктор makeBook, создающий книгу, возвращает какие-то данные: примитивные (число, строку) или составные, используя пары. Главное - нам<strong>не важно</strong>, как они устроены.</p>
5
<p>Так как мы работаем с языком программирования, то конструктор makeBook, создающий книгу, возвращает какие-то данные: примитивные (число, строку) или составные, используя пары. Главное - нам<strong>не важно</strong>, как они устроены.</p>
6
<p>Организовать эти данные можно тысячью разных способов, и конкретный способ зависит от разработчика, его предпочтений и данных, которые необходимо хранить. То, что книга является книгой, определяется не её внутренним устройством, а тем, что к ней применим набор операций, созданный для книг. Например, операция "получить имя книги". Сами операции знают, как устроены данные, иначе они не смогли бы ими манипулировать. Запомните: это детали реализации. Не заглянув внутрь операций, мы не узнаем, как они устроены, но нам это и не нужно.</p>
6
<p>Организовать эти данные можно тысячью разных способов, и конкретный способ зависит от разработчика, его предпочтений и данных, которые необходимо хранить. То, что книга является книгой, определяется не её внутренним устройством, а тем, что к ней применим набор операций, созданный для книг. Например, операция "получить имя книги". Сами операции знают, как устроены данные, иначе они не смогли бы ими манипулировать. Запомните: это детали реализации. Не заглянув внутрь операций, мы не узнаем, как они устроены, но нам это и не нужно.</p>
7
<p>В этом и заключается вся суть абстракции. Мы знаем, как создать сущность и какие операции к ней применимы. Обычно это и называется дизайном кода, а сами операции + конструктор - это API или интерфейс модуля/пакета/библиотеки.</p>
7
<p>В этом и заключается вся суть абстракции. Мы знаем, как создать сущность и какие операции к ней применимы. Обычно это и называется дизайном кода, а сами операции + конструктор - это API или интерфейс модуля/пакета/библиотеки.</p>
8
<p>Получаем следующий алгоритм:</p>
8
<p>Получаем следующий алгоритм:</p>
9
<ol><li>Анализируем предметную область. Выделяем сущности.</li>
9
<ol><li>Анализируем предметную область. Выделяем сущности.</li>
10
<li>Реализуем конструктор. Внутреннее представление сущностей выбираем на основе того, что мы планируем в них хранить.</li>
10
<li>Реализуем конструктор. Внутреннее представление сущностей выбираем на основе того, что мы планируем в них хранить.</li>
11
<li>Реализуем необходимые операции.</li>
11
<li>Реализуем необходимые операции.</li>
12
</ol><p>В примере с книгами видно, что мы храним только название. А это значит, что нам достаточно хранить одну строчку.</p>
12
</ol><p>В примере с книгами видно, что мы храним только название. А это значит, что нам достаточно хранить одну строчку.</p>
13
<p>Тогда реализация конструктора будет такой:</p>
13
<p>Тогда реализация конструктора будет такой:</p>
14
<p>А что, если мы захотим дополнительно хранить версию издания книги? Тогда мы можем использовать пары для хранения составных данных, и у нас уже появляются<strong>составные данные</strong>, так как нужно хранить два параметра.</p>
14
<p>А что, если мы захотим дополнительно хранить версию издания книги? Тогда мы можем использовать пары для хранения составных данных, и у нас уже появляются<strong>составные данные</strong>, так как нужно хранить два параметра.</p>
15
<p>Поменяется ли клиентский код, использующий нашу библиотеку, при изменении внутренней структуры? Как видно из примеров выше, ничего не поменяется, кроме вызова конструкторов. Это и есть хорошая абстракция, при которой наш код не рассыпается в случае любых изменений внутренней реализации.</p>
15
<p>Поменяется ли клиентский код, использующий нашу библиотеку, при изменении внутренней структуры? Как видно из примеров выше, ничего не поменяется, кроме вызова конструкторов. Это и есть хорошая абстракция, при которой наш код не рассыпается в случае любых изменений внутренней реализации.</p>
16
<h2>Примеры других абстракций</h2>
16
<h2>Примеры других абстракций</h2>
17
<p>Пример с книгами - это всего лишь один из многих вариантов. Программисты в своей работе постоянно перекладывают сущности реального мира на код, создавая всевозможные абстракции данных. Давайте попробуем пофантазировать и накидать ещё вариантов. Я добавлю только три, а ещё три додумайте сами. В реальной жизни абстракции будут сложнее, так как должны включать больше данных, но суть от этого не поменяется.</p>
17
<p>Пример с книгами - это всего лишь один из многих вариантов. Программисты в своей работе постоянно перекладывают сущности реального мира на код, создавая всевозможные абстракции данных. Давайте попробуем пофантазировать и накидать ещё вариантов. Я добавлю только три, а ещё три додумайте сами. В реальной жизни абстракции будут сложнее, так как должны включать больше данных, но суть от этого не поменяется.</p>
18
<ol><li><p><strong>Товар</strong>. Всё, что продаётся и покупается. Предположим, что нам интересны только два параметра: цена и название. Саму сущность можно назвать product. Тогда наша абстракция будет содержать как минимум три следующих функции:</p>
18
<ol><li><p><strong>Товар</strong>. Всё, что продаётся и покупается. Предположим, что нам интересны только два параметра: цена и название. Саму сущность можно назвать product. Тогда наша абстракция будет содержать как минимум три следующих функции:</p>
19
</li>
19
</li>
20
<li><p><strong>Текстовый документ</strong>. Например, как в Google Docs. В нашем примере он будет состоять из названия и содержимого.</p>
20
<li><p><strong>Текстовый документ</strong>. Например, как в Google Docs. В нашем примере он будет состоять из названия и содержимого.</p>
21
</li>
21
</li>
22
<li><p>А вот пример, в котором нужно хранить не два значения, а три. Это<strong>точка в пространстве</strong>.</p>
22
<li><p>А вот пример, в котором нужно хранить не два значения, а три. Это<strong>точка в пространстве</strong>.</p>
23
</li>
23
</li>
24
</ol><p>И теперь самое интересное.<strong>Любая абстракция, построенная таким образом, может выступать в роли строительных блоков в другой абстракции</strong>.</p>
24
</ol><p>И теперь самое интересное.<strong>Любая абстракция, построенная таким образом, может выступать в роли строительных блоков в другой абстракции</strong>.</p>
25
<p>Предположим, что мы продаём документы как продукты:</p>
25
<p>Предположим, что мы продаём документы как продукты:</p>
26
<p>А дальше всё по аналогии.</p>
26
<p>А дальше всё по аналогии.</p>