HTML Diff
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>