Что обеспечивает абстрагирование методов взаимодействия с файлами

Обновлено: 04.07.2024

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

Для этого я постарался на более-менее живых примерах объяснить базовые понятия ООП (класс, объект, интерфейс, абстракция, инкапсуляция, наследование и полиморфизм).

Первая часть посвящена классам, объектам и интерфейсам.
Вторая часть, представленная ниже, иллюстрирует инкапсуляцию, полиморфизм и наследование

Инкапсуляция

Представим на минутку, что мы оказались в конце позапрошлого века, когда Генри Форд ещё не придумал конвейер, а первые попытки создать автомобиль сталкивались с критикой властей по поводу того, что эти коптящие монстры загрязняют воздух и пугают лошадей. Представим, что для управления первым паровым автомобилем необходимо было знать, как устроен паровой котёл, постоянно подбрасывать уголь, следить за температурой, уровнем воды. При этом для поворота колёс использовать два рычага, каждый из которых поворачивает одно колесо в отдельности. Думаю, можно согласиться с тем, что вождение автомобиля того времени было весьма неудобным и трудным занятием.

Теперь вернёмся в сегодняшний день к современным чудесам автопрома с коробкой-автоматом. На самом деле, по сути, ничего не изменилось. Бензонасос всё так же поставляет бензин в двигатель, дифференциалы обеспечивают поворот колёс на различающиеся углы, коленвал превращает поступательное движение поршня во вращательное движение колёс. Прогресс в другом. Сейчас все эти действия скрыты от пользователя и позволяют ему крутить руль и нажимать на педаль газа, не задумываясь, что в это время происходит с инжектором, дроссельной заслонкой и распредвалом. Именно сокрытие внутренних процессов, происходящих в автомобиле, позволяет эффективно его использовать даже тем, кто не является профессионалом-автомехаником с двадцатилетним стажем. Это сокрытие в ООП носит название инкапсуляции.

Инкапсуляция – это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали
реализации от пользователя.

Инкапсуляция неразрывно связана с понятием интерфейса класса. По сути, всё то, что не входит в интерфейс, инкапсулируется в классе.

Абстракция

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

Абстрагирование – это способ выделить набор значимых характеристик объекта, исключая из рассмотрения незначимые. Соответственно, абстракция – это набор всех таких характеристик.

Если бы для моделирования поведения автомобиля приходилось учитывать химический состав краски кузова и удельную теплоёмкость лампочки подсветки номеров, мы никогда бы не узнали, что такое NFS.

Полиморфизм

Любое обучение вождению не имело бы смысла, если бы человек, научившийся водить, скажем, ВАЗ 2106 не мог потом водить ВАЗ 2110 или BMW X3. С другой стороны, трудно представить человека, который смог бы нормально управлять автомобилем, в котором педаль газа находится левее педали тормоза, а вместо руля – джойстик.

Всё дело в том, что основные элементы управления автомобиля имеют одну и ту же конструкцию и принцип действия. Водитель точно знает, что для того, чтобы повернуть налево, он должен повернуть руль, независимо от того, есть там гидроусилитель или нет.
Если человеку надо доехать с работы до дома, то он сядет за руль автомобиля и будет выполнять одни и те же действия, независимо от того, какой именно тип автомобиля он использует. По сути, можно сказать, что все автомобили имеют один и тот же интерфейс, а водитель, абстрагируясь от сущности автомобиля, работает именно с этим интерфейсом. Если водителю предстоит ехать по немецкому автобану, он, вероятно выберет быстрый автомобиль с низкой посадкой, а если предстоит возвращаться из отдалённого маральника в Горном Алтае после дождя, скорее всего, будет выбран УАЗ с армейскими мостами. Но, независимо от того, каким образом будет реализовываться движение и внутреннее функционирование машины, интерфейс останется прежним.

Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

Например, если вы читаете данные из файла, то, очевидно, в классе, реализующем файловый поток, будет присутствовать метод похожий на следующий: byte[] readBytes( int n );
Предположим теперь, что вам необходимо считывать те же данные из сокета. В классе, реализующем сокет, также будет присутствовать метод readBytes. Достаточно заменить в вашей системе объект одного класса на объект другого класса, и результат будет достигнут.

При этом логика системы может быть реализована независимо от того, будут ли данные прочитаны из файла или получены по сети. Таким образом, мы абстрагируемся от конкретной специализации получения данных и работаем на уровне интерфейса. Единственное требование при этом – чтобы каждый используемый объект имел метод readBytes.

Наследование

Представим себя, на минуту, инженерами автомобильного завода. Нашей задачей является разработка современного автомобиля. У нас уже есть предыдущая модель, которая отлично зарекомендовала себя в течение многолетнего использования. Всё бы хорошо, но времена и технологии меняются, а наш современный завод должен стремиться повышать удобство и комфорт выпускаемой продукции и соответствовать современным стандартам.

Нам необходимо выпустить целый модельный ряд автомобилей: седан, универсал и малолитражный хэтч-бэк. Очевидно, что мы не собираемся проектировать новый автомобиль с нуля, а, взяв за основу предыдущее поколение, внесём ряд конструктивных изменений. Например, добавим гидроусилитель руля и уменьшим зазоры между крыльями и крышкой капота, поставим противотуманные фонари. Кроме того, в каждой модели будет изменена форма кузова.

Очевидно, что все три модификации будут иметь большинство свойств прежней модели (старый добрый двигатель 1970 года, непробиваемая ходовая часть, зарекомендовавшая себя отличным образом на отечественных дорогах, коробку передач и т.д.). При этом каждая из моделей будет реализовать некоторую новую функциональность или конструктивную особенность. В данном случае, мы имеем дело с наследованием.
Наследование – это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым или родительским. Новый класс – потомком, наследником или производным классом.

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

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

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

Уайнбергером было введено понятие "тип файловой системы" для объяснения механизма работы принадлежавшей ему сетевой файловой системы (см. краткое описание этого механизма в [Killian 84]) и в позднейшей версии системы V поддерживаются основополагающие принципы его схемы. Наличие типа файловой системы дает ядру возможность поддерживать одновременно множество файловых систем, таких как сетевые файловые системы (глава 13) или даже файловые системы из других операционных систем. Процессы пользуются для обращения к файлам обычными функциями системы UNIX, а ядро устанавливает соответствие между общим набором файловых операций и операциями, специфичными для каждого типа файловой системы.

Рисунок 5.34. Индексы для файловых систем различных типов

Индекс выступает интерфейсом между абстрактной файловой системой и отдельной файловой системой. Общая копия индекса в памяти содержит информацию, не зависящую от отдельной файловой системы, а также указатель на частный индекс файловой системы, который уже содержит информацию, специфичную для нее. Частный индекс файловой системы содержит такую информацию, как права доступа и расположение блоков, а общий индекс содержит номер устройства, номер индекса на диске, тип файла, размер, информацию о владельце и счетчик ссылок. Другая частная информация, описывающая отдельную файловую систему, содержится в суперблоке и структуре каталогов. На Рисунке 5.34 изображены таблица общих индексов в памяти и две таблицы частных индексов отдельных файловых систем, одна для структур файловой системы версии V, а другая для индекса удаленной (сетевой) системы. Предполагается, что последний индекс содержит достаточно информации для того, чтобы идентифицировать файл, находящийся в удаленной системе. У файловой системы может отсутствовать структура, подобная индексу; но исходный текст программ отдельной файловой системы позволяет создать объектный код, удовлетворяющий семантическим требованиям файловой системы UNIX и назначающий свой "индекс", который соответствует общему индексу, назначаемому ядром.

Файловая система каждого типа имеет некую структуру, в которой хранятся адреса функций, реализующих абстрактные действия. Когда ядру нужно обратиться к файлу, оно вызывает косвенную функцию в зависимости от типа файловой системы и абстрактного действия (см. Рисунок 5.34). Примерами абстрактных действий являются: открытие и закрытие файла, чтение и запись данных, возвращение индекса для компоненты имени файла (подобно namei и iget), освобождение индекса (подобно iput), коррекция индекса, проверка прав доступа, установка атрибутов файла (прав доступа к нему), а также монтирование и демонтирование файловых систем. В главе 13 будет проиллюстрировано использование системных абстракций при рассмотрении распределенной файловой системы.

Вот где приходит flysystem . Она обеспечивает уровень абстракции для нескольких файловых систем, что означает, что вам не нужно беспокоиться о том, где находятся файлы, как они хранятся, или вам нужно заниматься операциями ввода-вывода низкого уровня. Все, что вам нужно беспокоиться, это операции высокого уровня, такие как чтение, запись и организация в каталоги.

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

Вы можете использовать Dropbox, S3, Cloud Files, FTP или SFTP, как если бы они были локальными; сохранение файла становится тем же процессом, независимо от того, сохраняется ли он локально или передается по сети. Вы можете обращаться с zip-архивами так, как если бы они были кучей папок, не беспокоясь о тщательности создания и сжатия самих архивов.

Установка и основное использование

Теперь вы можете просто создать один или несколько экземпляров League\Flysystem\Filesystem , передав соответствующий адаптер .

Например, чтобы использовать локальный каталог:

Для использования корзины Amazon S3 требуется немного больше настроек:

Чтобы использовать Dropbox:

(Чтобы получить токен и имя приложения, создайте приложение с помощью консоли приложения Dropbox .)

Для других адаптеров, таких как обычный FTP, Predis или WebDAV, обратитесь к документации .

Чтение и запись в файловую систему

Что касается кода вашего приложения, вам просто нужно заменить вызовы, такие как file_exists() , fopen() / fclose() , fread / fwrite и mkdir() их эквивалентами flysystem.

Например, возьмите следующий устаревший код, который копирует локальный файл в корзину S3:

Используя flysystem, это может выглядеть примерно так:

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

Вот краткое изложение наиболее важных методов класса League\Flysystem\Filesystem :

Концепция операционной системы (Глава 11) Реализация файловой системы

Структура файловой системы (Структура файловой системы)

Диск предоставляет большой объем внешнего дискового пространства для поддержки файловой системы. Следующие две характеристики диска делают его удобным средством для хранения нескольких файлов.

  • ①Возможна перезапись на месте.
  • ② Возможность прямого доступа к любой информации на диске.

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

Файловая система имеет две проблемы с дизайном.

  • ①Определите интерфейс файловой системы для пользователя
  • ②Создавайте структуры данных и алгоритмы для сопоставления логической файловой системы с физическим внешним запоминающим устройством.

Сама файловая система обычно состоит из разных слоев. Например, то, что вы видите на рисунке ниже, является простым примером многоуровневого дизайна.


  • Управление вводом / выводом
    • Он состоит из драйвера устройства и обработчика прерываний для передачи информации между памятью и диском.
    • Отправьте общие команды соответствующему драйверу устройства для чтения и записи физических блоков на диске
    • Знайте файл и его логические и физические блоки.
    • Менеджер свободного места
    • Метаданные управления: все структурные данные файловой системы. Без фактических данных (или содержимого файла)
    • Управляйте структурой папок в соответствии с заданным именем файла символов
    • Логический проход файловой системыБлок управления файлами (FCB)Для поддержания файловой структуры

    Типичная структура FCB показана на рисунке ниже.


    Реализация файловой системы (реализация файловой системы)

    Для реализации файловой системы используются несколько дисков и структур памяти.

    Хотя эти структуры отличаются от операционной системы и файловой системы, они все же имеют свою регулярность.

    Структура и работа файловой системы следующие:

    • Структура диска.
    • Структура файловой системы в памяти;
    • Перегородка и установка
    • Виртуальная файловая система

    Структура диска

    • Блок управления загрузкой (том) (блок управления загрузкой \ Громкость)
      • Содержит управляющую информацию для запуска ОС
      • UFS называется загрузочным блоком (boot block)
        • Обычно первый блок раздела. Предположим, что на разделе нет ОС. Тогда пусто

        Блок регулировки громкости (volume) (Блок регулировки громкости (/ volume))

        • Содержит конкретную информацию о томе, включая
          • Количество блоков и размер блоков;
          • Количество и указатель свободных блоков;
          • Номер и указатель свободных FCB.

          Структура папки

          • Используется для организации файлов
          • УФС. Содержит имя файла и соответствующий номер inode
          • NTFS, главная файловая таблица (master file table);
          • В UFS индексный узел (inode);
          • В NTFS - основная файловая таблица;
            • Принять структуру реляционной базы данных, запись / файл

            Структура файловой системы в памяти

            • Таблица установки
              • Содержит информацию обо всех установочных разделах
              • Сохраните информацию о недавно посещенной папке (для папки установочного раздела она может содержать указатель на таблицу разделов)
              • Содержит копию FCB и другую информацию о каждом открытом файле
              • Содержит указатель на соответствующую запись и другую информацию в общесистемной таблице открытых файлов.
                • Дескриптор файла (Linux / UNIX)
                • Дескриптор файла (Windows)

                На следующем рисунке показана операционная структура файловой системы.


                Перегородка и установка

                Структура диска зависит от операционной системы. Диск может быть разделен на несколько разделов или том может занимать несколько разделов на нескольких дисках.

                Перегородки могут быть «сырыми». То есть файловой системы нет, либо у «вареной» есть файловая система.

                Необработанный раздел используется там, где нет подходящей файловой системы.

                Например: область подкачки в Unix, потому что она не использует файловую систему, а использует собственный формат диска.

                Загрузочная информация может храниться в каждом разделе. И у него свой формат. Поскольку при загрузке в системе отсутствует драйвер конфигурации файловой системы, она не может интерпретировать формат файловой системы.

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

                В дополнение к информации о загрузке, включая информацию о том, как запустить определенную операционную систему. Также могут быть другие инструкции. (Например, BootManager bootstar 8.3, Linux GRUB, GRUB-GR и унифицированный загрузчик)

                Корневой раздел содержит ядро ​​операционной системы или другие системные файлы., Загружать память во время загрузки.

                В зависимости от операционной системы другие разделы могут загружаться автоматически во время загрузки или вручную после этого.

                • /root, /boot
                • Таблица монтирования файловой системы (таблица монтирования файловой системы)

                Виртуальная файловая система

                • Виртуальная файловая система (VFS) предоставляет объектно-ориентированный метод реализации файловой системы.
                • Функция VFS
                  • Разделение общей работы файловой системы и реализации путем определения интерфейса VFS;
                  • Обеспечить механизм уникального представления файла в сети (по vnode)


                  Первый уровень - это интерфейс файловой системы, в том числе. Вызовы open (), read (), write () и close () и дескрипторы описания файлов.

                  Второй уровень называется уровнем виртуальной файловой системы (VFS) и имеет две цели:

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

                  Реализация каталога

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

                  Линейный список

                  Самый простой способ реализовать папку - использовать линейный список, в котором хранятся имена файлов и указатели блоков данных (массивы, связанные списки и т. Д.). Этот метод прост в программировании, но требует больше времени для выполнения.

                  Настоящим недостатком линейного списка записей папок является использование линейного поиска для поиска конкретной записи.
                  Фактически, многие операционные системы используют кэш программного обеспечения для хранения информации о недавно использованных папках. Попадания в кэш позволяют избежать постоянного чтения информации с диска, а в отсортированных списках можно использовать двоичный поиск. И сократить среднее время поиска.

                  Хеш-таблица

                  Линейная таблица с использованием структуры данных Hash

                  • Уменьшено время поиска папки. Вставка и удаление также относительно просты.
                  • Просто нужен какой-то механизм, чтобы избежать столкновения (два имени файла хешируются в одно и то же место)
                    Самая большая сложность хеш-таблицы - это ее фиксированный размер и зависимость хеш-функции от размера.

                  Методы размещения

                  • цели
                    • Эффективное использование дискового пространства;
                    • Высокоскоростной доступ к файлам.
                    • Непрерывное размещение
                    • Назначение ссылки
                    • Распределение индекса

                    Непрерывное размещение

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

                    • Просто нужно только записать начальную позицию (номер блока) и длину файла.
                    • Доступ к файлам очень прост и требует наименьшего времени на поиск
                      • Последовательное посещение.
                      • прямое интервью.

                      • Найти место для новых файлов сложно
                        • Первый раз, лучший, худший


                        Метод отображения логического адреса на физический адрес следующий:

                          Логический адрес / размер блока = частное, остаток

                        Доступный блок = Q + начальный адрес (база)
                        позиция в блоке = R

                        Метод непрерывного размещения на основе расширения:

                        • Многие новые файловые системы используют модифицированный метод непрерывного распределения.
                        • Расширение - это непрерывный дисковый блок
                          • Когда файл выделяется, ему присваивается расширение
                          • Также есть большое сплошное пространство
                          • Файл содержит одно или несколько расширений
                          • Нужен указатель на следующее расширение

                          Связанное размещение

                          Распределение ссылок решает все проблемы непрерывного распределения.

                          Используйте размещение ссылок. Каждый файл представляет собой связанный список дисковых блоков:

                          • Дисковые блоки распределяются в любом углу диска.
                          • Каждая запись папки имеет указатель на первый блок файла.


                          • Сильные стороны:
                            • Просто начальная позиция
                            • Создание и расширение файлов легко
                            • Нет произвольного доступа
                            • Указатель ссылки между блоками должен занимать место
                              • Кластер: сгруппируйте несколько последовательных блоков в кластеры. Диски размещены в кластерах


                              Таблица размещения файлов (FAT)

                              Начало каждого раздела используется для хранения таблицы FAT.

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

                              Запись папки содержит номер блока первого блока файла.

                              Запись FAT, индексированная номером блока, содержит номер участка следующего блока файла.

                              Такая цепочка будет продолжаться до последнего блока, и значение соответствующей записи FAT этого блока будет значением конца файла. Неиспользуемые блоки представлены значением 0.

                              Выделение нового блока для файла означает просто найти первую запись FAT со значением 0. Замените предыдущее значение конца файла адресом нового блока. Замените 0 значением конца файла.

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


                              Индексированное размещение

                              • Собрать все указатели блоков данных в индексный блок
                                • I-я запись в индексном блоке указывает на i-й блок файла.


                                • У каждого файла есть индексный блок.
                                  • Массив адресов дисковых блоков
                                  • Схема ссылок: индексный блок обычно представляет собой дисковый блок. Для больших файлов. Возможность связать несколько индексных блоков.
                                  • Многоуровневый индекс: метод косвенной адресации, аналогичный памяти (первый уровень, косвенный второй уровень . )



                                  Управление свободным пространством (Управление свободным пространством)

                                  Битовый вектор (n блоков)


                                  • bit[i] = 1 → блок [i] свободное время
                                  • bit[i] = 0 → блок [i] занят

                                  Номер первого бесплатного блока:

                                  Один А слово из Кусочек номер × ценить за 0 из слово номер + Первый Один А ценить за 1 из Кусочек из Частичное сдвиг
                                  • Битовые векторы требуют дополнительного места
                                    • Пусть размер блока будет 2 12 байт
                                    • Размер диска 2 30 Байт (1 ГБ)
                                    • N = 2 30 / 2 12 = 218 (Т.е. 32 Кбайт)
                                    • Процесс распределения
                                    • Процесс переработки

                                    Свободное время


                                    Связанный список (пустой связанный список)

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

                                    Непросто получить непрерывное пространство

                                    Без траты места


                                    Группировка (групповая ссылка)

                                    • Сохраните адреса n свободных блоков в первом свободном блоке;
                                    • Последний блок содержит адреса остальных n свободных блоков.

                                    Схема групповых ссылок показана ниже.


                                    • Группировка (групповая ссылка)
                                      • Процесс размещения и восстановления
                                      • Процесс распределения
                                      • Требуемая защита
                                      • Указатель на свободный стол

                                      Требуемая защита

                                      • Битовая карта
                                        • Необходимо сохранить на диске
                                        • Копия в памяти может отличаться от копии на диске;
                                        • Для блока [i] ситуация не соответствует: бит [i] = 1 в памяти. На диске бит [i] = 0.
                                        • Установите бит [i] = 1 на диске
                                        • Выделить блок [i]
                                        • Установите бит [i] = 1 в памяти

                                        Эффективность и производительность (Efficiency and Performance)

                                        эффективность

                                        Эффективность зависит от

                                        • Алгоритм распределения дисков и папок
                                          • Предварительное выделение, кластер
                                          • Недавняя дата записи / посещения
                                          • 2 12 , 2 32 , 2 64 , 2 128

                                          спектакль

                                          Спектакль включает в себя следующие моменты:

                                          • Дисковый буфер - помещает недавно использованные блоки в память
                                          • Немедленный выпуск и последовательный доступ, оптимизированный для упреждающего чтения
                                          • Выделите часть памяти как виртуальный диск (или RAM-диск), чтобы улучшить производительность персонального компьютера.

                                          Кеш страницы

                                          • Кэширование страниц использует технологию виртуальной памяти для кэширования файловых данных в виде страниц, а не блоков, ориентированных на файловую систему.

                                          Ввод-вывод без единого буферного кеша показан на следующем рисунке.


                                          Изменяется ввод-вывод, использующий унифицированный буферный кеш. Например, следующие

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

                                          Таким образом, абстракция имеет дело именно с уровнем детализации объекта, который в настоящее время требуется в контексте текущей перспективы, и может применяться к данным, а также к управлению программой:

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

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

                                          Оглавление

                                          Основной принцип абстракции

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

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

                                          Центральная форма абстракции - абстракция языка. Например, создаются искусственные языки, которые позволяют выражать определенные аспекты систем. Языки моделирования могут помочь в планировании программных систем. Машинные языки могут обрабатываться компьютерами напрямую. Этот процесс абстракции также можно наблюдать при смене поколений языков программирования .

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

                                          Абстракция пытается скрыть сложность нижележащих уровней абстракции. Джоэл Спольски раскритиковал именно эти усилия: «Все нетривиальные абстракции в какой-то степени негерметичны».

                                          Особенности языка

                                          Языки программирования

                                          Разные языки программирования предлагают разные возможности абстракции, например:

                                          • В объектно-ориентированных языках, таких как C ++ , Object Pascal или Java , концепция абстракции была реализована в виде отдельной декларативной инструкции. После такого объявления задача программиста - реализовать класс , чтобы иметь возможность создать из него экземпляр объекта.
                                          • В функциональном программировании , например, концепции абстракции могут быть реализованы посредством лямбда-абстракции (функция превращается в переменную из терма) и функций высшего порядка (параметры функций, в свою очередь, являются функциями) .
                                          • Современные языки программирования в семействе языков Lisp , такие как Clojure и Common Lisp , допускают синтаксическую абстракцию, которая позволяет программисту исключать стандартные формулировки в коде, реализовывать новые управляющие структуры или даже разрабатывать предметно-ориентированные языки. Эти концепции позволяют повысить эффективность программирования и улучшить понимание кода.

                                          Языки спецификаций

                                          Языки спецификации обычно основываются на различных формах абстракции, поскольку спецификация программного проекта обычно происходит на очень ранней стадии и, следовательно, в гораздо более абстрактный момент времени проекта. Unified Modeling Language это язык спецификации , что позволяет, например, определить абстрактные классы. Они остаются абстрактными на протяжении всей фазы архитектуры и спецификации проекта.

                                          Абстракция данных

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

                                          Абстракция в объектно-ориентированном программировании

                                          В объектно-ориентированном программировании объекты представляют абстрактных «акторов», которые выполняют работу, изменяют свое состояние и могут взаимодействовать с другими объектами в системе. Подробная информация о точном состоянии объекта часто скрывается, что также называется сокрытием или инкапсуляцией информации . Здесь детали скрыты, чтобы не усложнять задачу.

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

                                          Различные объектно-ориентированные языки программирования предлагают сопоставимые концепции абстракции. Все они преследуют цель поддержать разнообразие объектно-ориентированного программирования.

                                          В следующем примере кода на Java показана простая модель животных на ферме. Здесь представлены различные уровни абстракции. Класс Tier представляет как состояние животного, так и функциональные возможности .

                                          С помощью этого определения можно создавать объекты типа Tier и вызывать следующие методы:

                                          В приведенном выше примере класс является Tier абстракцией и используется вместо реальных животных. Lebewesen , класс, от которого он Tier получен, является другой формой абстракции. В данном случае это обобщение класса Tier .

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

                                          Уровни абстракции

                                          Информатика очень часто говорит о разных уровнях абстракции ( уровни или слои английского языка ). Каждый уровень описывает модель одной и той же информации на разных уровнях абстракции в контексте соответствующей области.

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

                                          Системы баз данных

                                          В системах баз данных сложность очень часто снижается за счет разделения приложения на уровни абстракции:

                                          Читайте также: