Что обеспечивает абстрагирование методов взаимодействия с файлами
Объектно-ориентированный подход основывается на совокупности ряда принципов, называемой объектной моделью.
Главными принципами являются: абстрагирование, инкапсуляция, модульность, иерархичность. Главные они в том смысле, что без них модель не будет объектно-ориентированной.
Кроме главных, назовем еще три дополнительных принципа: типизация, параллелизм, сохраняемость. Называя их дополнительными, мы имеем в виду, что они полезны в объектной модели, но не обязательны.
Люди развили чрезвычайно эффективную технологию преодоления сложности. Мы абстрагируемся от нее. Если мы не в состоянии полностью воссоздать сложный объект, то приходится игнорировать не слишком важные детали. В результате мы имеем дело с обобщенной, идеализированной моделью объекта.
Например, изучая процесс фотосинтеза у растений, мы концентрируем внимание на химических реакциях в определенных клетках листа и не обращаем внимание на остальные части – черенки, жилки и т.д.
Абстракция – совокупность существенных характеристик некоторого объекта, которые отличают его от всех других видов объектов и, таким образом, четко определяют особенности данного объекта с точки зрения дальнейшего рассмотрения и анализа.
Абстрагирование – процесс выделения абстракций в предметной области задачи.
Абстрагирование концентрирует внимание на внешних особенностях объекта и позволяет отделить самые существенные особенности поведения от несущественных. Такое разделение смысла и реализации называют барьером абстракции. Установление того или иного барьера абстракции порождает множество различных абстракций для одного и того же предмета или явления реального мира. Абстрагируясь в большей или меньшей степени от различных аспектов проявления реальности, мы находимся на разных уровнях абстракции.
Для примера рассмотрим системный блок компьютера. Пользователю, использующему компьютер для набора текста, не важно, из каких частей состоит этот блок. Для него это – коробка с кнопками и возможностью подсоединения внешних запоминающих устройств. Он абстрагируется от таких понятий, как «процессор» или «оперативная память». С другой стороны, у программиста, пишущего программы на языках низкого уровня, барьер абстракции лежит намного ниже. Ему необходимо знать устройство процессора и команды, понимаемые им.
Является полезным еще один дополнительный принцип, называемый принципом наименьшего удивления. Согласно ему абстракция должна охватывать все поведение объекта, но не больше и не меньше, и не привносить сюрпризов или побочных эффектов, лежащих вне ее сферы применимости.
Все абстракции обладают как статическими, так и динамическими свойствами. Например, файл как объект требует определенного объема памяти на конкретном устройстве, имеет имя и содержимое. Эти атрибуты являются статическими свойствами. Конкретные же значения каждого из перечисленных свойств динамичны и изменяются в процессе использования объекта: файл можно увеличить или уменьшить, изменить его имя и содержимое.
Будем называть клиентом любой объект, использующий ресурсы другого объекта, называемого сервером. Мы будем характеризовать поведение объекта услугами, которые он оказывает другим объектам, и операциями, которые он выполняет над другими объектами. Этот подход концентрирует внимание на внешних проявлениях объекта и реализует так называемую контрактную модель программирования. Эта модель заключается в следующем: внешнее проявление объекта рассматривается с точки зрения его контракта с другими объектами, в соответствии с этим должно быть выполнено и его внутреннее устройство (часто – во взаимодействии с другими объектами). Контракт фиксирует все обязательства, которые объект-сервер имеет перед объектом-клиентом. Другими словами, этот контракт определяет ответственность объекта – то поведение, за которое он отвечает.
Каждая операция, предусмотренная контрактом, однозначно определяется ее сигнатурой – списком типов формальных параметров и типом возвращаемого значения (в языке С++ тип возвращаемого значения не является частью сигнатуры). Полный набор операций, которые клиент может осуществлять над другим объектом, вместе с правильным порядком, в котором эти операции вызываются, называется протоколом. Протокол отражает все возможные способы, которыми объект может действовать или подвергаться воздействию. Тем самым протокол полностью определяет внешнее поведение абстракции.
Пример. В тепличном хозяйстве, использующем гидропонику, растения выращиваются на питательном растворе без песка, гравия и другой почвы. Управление режимом работы парниковой установки – очень ответственное дело. Оно зависит как от вида выращиваемых культур, так и от стадии выращивания. Нужно контролировать целый ряд факторов: температуру, влажность, освещение, кислотность и концентрацию питательных веществ. В больших хозяйствах для решения этой задачи часто используют автоматические системы, которые контролируют и регулируют указанные факторы. Цель автоматизации состоит здесь в том, чтобы при минимальном вмешательстве человека добиться соблюдения режима выращивания.
Одна из ключевых абстракций в данной задаче – датчик. Известно несколько разновидностей датчиков. Все, что влияет на урожай, должно быть измерено. Таким образом, нужны датчики температуры воды, температуры воздуха, влажности, кислотности, освещения и концентрации питательных веществ.
С внешней точки зрения датчик температуры – это объект, который способен измерять температуру там, где он расположен. Температура – это числовой параметр, имеющий ограниченный диапазон значений и определенную точность и означающий число градусов по Цельсию.
Местоположение датчика – это некоторое однозначно определенное место в теплице, температуру в котором необходимо знать. Таких мест, вероятно, немного. Для датчика температуры при этом существенно не само местоположение, а только то, что данный датчик расположен именно в данном месте.
Рассмотрим элементы реализации нашей абстракции на языке С++.
typedef float Temperature; // Температура по Цельсию
typedef unsigned int Location; // Число, однозначно определяющее
Здесь два оператора определения типов Temperature и Location вводят удобные псевдонимы для простейших типов, и это позволяет нам выражать свои абстракции на языке предметной области. Temperature – это числовой тип данных в формате с плавающей точкой для записи температур. Значения типа Location нумеруют места, где могут располагаться температурные датчики.
Рассмотрим обязанности датчика температуры. Датчик должен знать значение температуры в своем местонахождении и сообщать ее по запросу. Клиент по отношению к датчику может выполнить такие действия: калибровать датчик и получать от него значение текущей температуры. Таким образом, объект «Датчик температуры» имеет две операции: «Калибровать» и «Текущая температура».
Temperature curTemperature; // текущая температура в
Location loc; // местонахождение датчика
void calibrate(Temperature actualTemperature); // калибровать
Temperature currentTemperature( ); // текущая температура
Данным описанием вводится новый тип TemperatureSensor. Важным здесь является то, что, во-первых, данные и функции, изменяющие их, объединены вместе в одном описании, и, во-вторых, мы не работаем непосредственно с данными, а только посредством соответствующих функций. В частности, здесь мы использовали так называемые set- и get-функции, соответственно устанавливающие и возвращающие значения переменных (calibrate – set-функция, currentTemperature – get-функция).
Объекты данного типа вводятся так же, как и переменные стандартных типов:
TemperatureSensor TSensors[100]; // массив из ста объектов типа
Функции, объявленные внутри описания, называются функциями-членами. Их можно вызывать только для переменной соответствующего типа. Например, калибровать датчик можно так:
TSensors[3].calibrate(20.); // калибруется датчик номер 3
Поскольку имя объекта, для которого вызывается функция-член, неявно ей передается, в списках аргументов функций отсутствует аргумент типа TemperatureSensor, задающий конкретный датчик, над которым производятся действия. К этому объекту внутри функции можно явно обратиться по указателю this. Например, в теле функции calibrate можно написать один из двух эквивалентных операторов
this -> curTemperature = actualTemperature;
Центральной идеей абстракции является понятие инварианта. Инвариант – это некоторое логическое условие, значение которого (истина или ложь) должно сохраняться. Для каждой операции объекта можно задать предусловия (т.е. инварианты, предполагаемые операцией) и постусловия (т.е. инварианты, которым удовлетворяет операция).
Рассмотрим инварианты, связанные с операцией currentTemperature. Предусловие включает предположение, что датчик установлен в правильном месте в теплице, а постусловие – что датчик возвращает значение температуры в градусах Цельсия.
Изменение инварианта нарушает контракт, связанный с абстракцией. Если нарушено предусловие, то клиент не соблюдает свои обязательства и сервер не может выполнить задачу правильно. Если нарушено постусловие, то свои обязательства нарушил сервер, и клиент не может ему больше доверять.
Для проверки условий язык С++ предоставляет ряд специальных средств.
С++ имеет специальный механизм обработки исключений, чувствительный к контексту. Контекстом для генерации исключения является блок try (пробный блок). Если при выполнении операторов, находящихся внутри блока try, происходит исключительная ситуация, то управление передается обработчикам исключений, которые задаются ключевым словом catch и находятся ниже блока try. Синтаксически обработчик catch выглядит подобно функции с одним аргументом без указания типа возвращаемого значения. Для одного блока try может быть задано несколько обработчиков, отличающихся типом аргумента.
catch(char * error) <. . .>// имя аргумента используется в обработчике
catch(int) <. . .>// имя аргумента не используется в обработчике
catch(…) <. . .>// обрабатываются все исключения
Исключение генерируется посредством указания ключевого слова throw с необязательным аргументом-выражением.
Исключение будет обработано посредством вызова того обработчика catch, тип параметра которого будет соответствовать типу аргумента throw. При поиске подходящего обработчика все обработчики просматриваются в порядке их записи.
При наличии вложенных блоков try (например, из-за вложенности вызовов функций) будет использован обработчик самого глубокого блока. Если обработчика, соответствующего типу аргумента throw, на данном уровне не будет найдено, будет осуществлен выход из текущей функции (с уничтожением всех локальных объектов) и поиск в блоке try с меньшей глубиной вложенности и т.д. После обработки исключения управление передается на оператор, следующий за описаниями обработчиков catch.
Пример. Рассмотрим стек, реализованный с использованием массива фиксированной длины.
int stack [100]; // не более ста элементов в стеке
int top=0; // номер доступного места для помещения элемента
void push(int el)
if(top = = 100) throw 1; // проверить на переполнение
else stack[top ++] = el; // поместить элемент в стек
if(top = = 0) throw 0; // проверить на пустоту
// (предусловие top > 0)
else return stack[--top]; // извлечь элемент из стека
if(i!=k) throw 2; // нарушено постусловие
catch(int error) <. . .>// если error = 0, то стек пуст;
// если error = 1, то стек полон; если error = 2, то стек неработоспособен
В примере аргументом throw является целое число – «номер исключения». В сложных программах разрабатываются специальные типы для исключений, позволяющие передать в обработчик исключения больше информации.
Чтение и запись файлов является неотъемлемой частью любого языка программирования, но основная реализация может сильно различаться. Например, более тонкие детали записи данных в локальную файловую систему по сравнению с загрузкой по FTP сильно отличаются – но концептуально они очень похожи.
В дополнение к старым боевым лошадям, таким как FTP, онлайн-хранилище становится все более вездесущим и недорогим – с множеством доступных сервисов, таких как Dropbox, Amazon S3 и Rackspace Cloud Files, – но все они используют слегка разные методы для чтения и записи.
Вот где приходит flysystem . Она обеспечивает уровень абстракции для нескольких файловых систем, что означает, что вам не нужно беспокоиться о том, где находятся файлы, как они хранятся, или вам нужно заниматься операциями ввода-вывода низкого уровня. Все, что вам нужно беспокоиться, это операции высокого уровня, такие как чтение, запись и организация в каталоги.
Такая абстракция также упрощает переключение с одной системы на другую без необходимости переписывать обширные фрагменты кода приложения. Он также обеспечивает логический подход к перемещению или копированию данных из одной системы хранения в другую, не беспокоясь о базовой реализации.
Вы можете использовать Dropbox, S3, Cloud Files, FTP или SFTP, как если бы они были локальными; сохранение файла становится тем же процессом, независимо от того, сохраняется ли он локально или передается по сети. Вы можете обращаться с zip-архивами так, как если бы они были кучей папок, не беспокоясь о тщательности создания и сжатия самих архивов.
веб ссылки
- SimArch Пример многоуровневой архитектуры для распределенных систем моделирования
Пример абстракции данных
Любая программа на C ++, где вы реализуете класс с общедоступными и частными членами, является примером абстракции данных. Рассмотрим следующий пример:
Когда приведенный выше код компилируется и выполняется, он производит следующий результат:
Класс выше добавляет числа вместе и возвращает сумму. Публичные участники - addNum и getTotal - это интерфейсы для внешнего мира, и пользователь должен знать их, чтобы использовать класс. Общее количество пользователей - это то, о чем пользователю не нужно знать, но необходимо, чтобы класс работал правильно.
Давайте изучим концепцию абстракции на примере
Предположим, вы хотите создать банковское приложение, и вас попросят собрать всю информацию о вашем клиенте. Есть вероятность, что вы получите следующую информацию о клиенте
Но не вся вышеуказанная информация требуется для создания банковского приложения.
Таким образом, вам нужно выбрать из этого пула только полезную информацию для вашего банковского приложения. Такие данные, как имя, адрес, налоговая информация и т. Д. Имеют смысл для банковского приложения
Поскольку мы извлекли / удалили / выбрали информацию о клиенте из большого пула, этот процесс называется абстракцией.
Однако одна и та же информация после извлечения может быть использована для широкого спектра применений. Например, вы можете использовать одни и те же данные для приложения больницы, приложения портала работы, правительственной базы данных и т. Д. Практически без изменений. Следовательно, он становится вашими основными данными. Это преимущество абстракции.
Когда использовать абстрактные методы и абстрактный класс?
Абстрактные методы в основном объявляются, когда два или более подклассов также делают одно и то же по-разному через разные реализации. Он также расширяет тот же класс Abstract и предлагает различные реализации абстрактных методов.
Абстрактные классы помогают описать универсальные типы поведения и иерархию классов объектно-ориентированного программирования. Он также описывает подклассы, чтобы предложить детали реализации абстрактного класса.
Абстракция данных означает предоставление только важной информации внешнему миру и скрытие их фоновых данных, т. е. Представление необходимой информации в программе без предоставления деталей.
Абстракция данных - это метод программирования (и проектирования), который основан на разделении интерфейса и реализации.
Возьмем один реальный пример телевизора, который вы можете включить и выключить, изменить канал, отрегулировать громкость и добавить внешние компоненты, такие как динамики, видеомагнитофоны и проигрыватели DVD, НО вы не знаете его внутренних деталей, что вы не знаете, как он получает сигналы по воздуху или по кабелю, как он их переводит, и, наконец, отображает их на экране.
Таким образом, мы можем сказать, что телевизор четко отделяет внутреннюю реализацию от внешнего интерфейса, и вы можете играть с его интерфейсами, такими как кнопка питания, сменщик каналов и регулятор громкости, не имея нулевого знания о его внутренних компонентах.
В C ++ классы обеспечивают отличный уровень абстракции данных . Они обеспечивают достаточные общественные методы внешнему миру, чтобы играть с функциональностью объекта и манипулировать объектными данными, то есть состоянием, не зная, каким образом класс был реализован внутри страны.
Например, ваша программа может сделать вызов функции sort () , не зная, какой алгоритм фактически использует функция для сортировки данных значений. Фактически, базовая реализация функции сортировки может меняться между версиями библиотеки, и пока интерфейс остается прежним, ваш вызов функции будет работать.
В C ++ мы используем классы для определения наших собственных абстрактных типов данных (ADT). Вы можете использовать объект cout класса ostream для потоковой передачи данных на стандартный вывод следующим образом:
Здесь вам не нужно понимать, как cout отображает текст на экране пользователя. Вам нужно знать только открытый интерфейс, а базовая реализация «cout» может быть изменена.
Преимущества абстракции
- Основное преимущество использования абстрактного класса состоит в том, что он позволяет группировать несколько связанных классов как братьев и сестер.
- Абстракция помогает снизить сложность процесса проектирования и внедрения программного обеспечения.
Абстрактный класс
Класс, который объявлен «абстрактным», называется абстрактным классом. Он может иметь как абстрактные методы, так и конкретные методы. Нормальный класс не может иметь абстрактных методов.
Стратегия проектирования
Абстракция разделяет код на интерфейс и реализацию. Поэтому при разработке вашего компонента вы должны поддерживать независимый интерфейс от реализации, чтобы при изменении базовой реализации интерфейс оставался неповрежденным.
В этом случае, независимо от того, какие программы используют эти интерфейсы, они не будут затронуты и просто нуждаются в перекомпиляции с последней реализацией.
Термин абстракция очень часто используется в информатике и описывает разделение между концепцией и реализацией . Структуры определяются по их значению, а подробная информация о том, как они работают, скрыта. Абстракция стремится игнорировать детали реализации и вывести общую схему решения проблемы. Таким образом, компьютерная программа может иметь разные уровни абстракции, при этом разный уровень информационного содержания раскрывается программисту на каждом уровне. Абстракция низкого уровня включает подробности об оборудовании, на котором работает программа. С другой стороны, более высокие уровни абстракции имеют дело с бизнес-логикой программного обеспечения.
Таким образом, абстракция имеет дело именно с уровнем детализации объекта, который в настоящее время требуется в контексте текущей перспективы, и может применяться к данным, а также к управлению программой:
- Абстракция управления включает в себя использование подпрограмм и концепций , таких как контрольпотока .
- Абстракция данных позволяет осмысленно обрабатывать биты данных, например, как типы данных .
Общая рекомендация использовать абстракцию всякий раз, когда она пытается избежать дублирования, называется принципом абстракции . Требование к языкам программирования предоставлять механизмы для этой рекомендации также называется этим.
Разница между абстракцией и инкапсуляцией
абстракция | Инкапсуляция |
---|---|
Абстракция решает проблемы на уровне дизайна. | Инкапсуляция решает это уровень реализации. |
Абстракция – это сокрытие ненужных деталей и отображение самой важной информации. | Инкапсуляция означает связывание кода и данных в единый блок. |
Абстракция позволяет сосредоточиться на том, что должен содержать информационный объект | Инкапсуляция означает скрытие внутренних деталей или механизмов того, как объект что-то делает из соображений безопасности. |
литература
Индивидуальные доказательства
-
Эта страница последний раз была отредактирована 21 апреля 2021 в 14:57.
Доступ к ярлыкам для выполнения абстракции
В C ++ мы используем метки доступа для определения абстрактного интерфейса для класса. Класс может содержать ноль или более ярлыков доступа -
- Члены, определенные с помощью общедоступного ярлыка, доступны для всех частей программы. Представление абстракции данных типа определяется его публичными членами.
- Члены, определенные с помощью частного ярлыка, недоступны для кода, который использует класс. Частные разделы скрывают реализацию от кода, который использует этот тип.
Нет ограничений на то, как часто может появляться метка доступа. Каждая метка доступа указывает уровень доступа следующих определений элементов. Указанный уровень доступа остается в силе до тех пор, пока не встретится следующая метка доступа или не увидит закрытие правой скобки тела класса.
Установка и основное использование
Как всегда, Composer – лучший способ установить:
Теперь вы можете просто создать один или несколько экземпляров League\Flysystem\Filesystem , передав соответствующий адаптер .
Например, чтобы использовать локальный каталог:
Для использования корзины Amazon S3 требуется немного больше настроек:
Чтобы использовать Dropbox:
(Чтобы получить токен и имя приложения, создайте приложение с помощью консоли приложения Dropbox .)
Вот пример для SFTP – вам могут не понадобиться все опции, перечисленные здесь:
Для других адаптеров, таких как обычный FTP, Predis или WebDAV, обратитесь к документации .
Языки программирования
Разные языки программирования предлагают разные возможности абстракции, например:
- В объектно-ориентированных языках, таких как C ++ , Object Pascal или Java , концепция абстракции была реализована в виде отдельной декларативной инструкции. После такого объявления задача программиста - реализовать класс , чтобы иметь возможность создать из него экземпляр объекта.
- В функциональном программировании , например, концепции абстракции могут быть реализованы посредством лямбда-абстракции (функция превращается в переменную из терма) и функций высшего порядка (параметры функций, в свою очередь, являются функциями) .
- Современные языки программирования в семействе языков Lisp , такие как Clojure и Common Lisp , допускают синтаксическую абстракцию, которая позволяет программисту исключать стандартные формулировки в коде, реализовывать новые управляющие структуры или даже разрабатывать предметно-ориентированные языки. Эти концепции позволяют повысить эффективность программирования и улучшить понимание кода.
Преимущества абстракции данных
Абстракция данных обеспечивает два важных преимущества -
- Внутренние элементы класса защищены от непреднамеренных ошибок на уровне пользователя, что может привести к повреждению состояния объекта.
- Реализация класса может развиваться со временем в ответ на изменение требований или отчетов об ошибках без изменения кода пользователя.
Определяя члены данных только в приватном разделе класса, автор класса может вносить изменения в данные. Если реализация меняется, необходимо изучить только код класса, чтобы увидеть, что может повлиять на изменение. Если данные общедоступны, то любая функция, которая напрямую обращается к элементам данных старого представления, может быть нарушена.
Основной принцип абстракции
Абстракция позволяет выделить и вывести самое важное из набора людей (вещей, наблюдений . ) с определенной точки зрения и, таким образом, является центральным средством для создания и понимания моделей.
Это помогает программисту упростить задачу, игнорируя детали. Поэтому способность мыслить абстрактно и реализовывать их - одна из важнейших основ программирования. Важность абстракции невозможно переоценить.
Центральная форма абстракции - абстракция языка. Например, создаются искусственные языки, которые позволяют выражать определенные аспекты систем. Языки моделирования могут помочь в планировании программных систем. Машинные языки могут обрабатываться компьютерами напрямую. Этот процесс абстракции также можно наблюдать при смене поколений языков программирования .
Даже в рамках языка программирования программист должен создавать новые уровни абстракции. Примеры этого - создание подпрограмм , модулей и программных компонентов. Другие формы абстракции, такие как шаблоны проектирования и архитектуры программного обеспечения, остаются скрытыми от языка программирования и связаны с проектированием системы.
Абстракция пытается скрыть сложность нижележащих уровней абстракции. Джоэл Спольски раскритиковал именно эти усилия: «Все нетривиальные абстракции в какой-то степени негерметичны».
Смотри тоже
Системы баз данных
В системах баз данных сложность очень часто снижается за счет разделения приложения на уровни абстракции:
- Физический уровень : этот уровень абстракции описывает, как данные фактически хранятся в системе. Здесь определены и подробно описаны сложные структуры данных.
- Логический уровень : следующий более высокий уровень абстракции описывает, какие данные хранятся в базе данных и какие связи существуют внутри этих данных. Пользователю на логическом уровне не нужно знать физический уровень, даже если он использует его косвенно через логический уровень.
- Уровень представления : наивысший уровень абстракции описывает только части всей базы данных, поскольку многим пользователям нужен только определенный раздел всей системы и они имеют доступ только к небольшому фрагменту базы данных. Таким образом, система может предлагать разным пользователям разные представления .
Резюме
В этой статье я представил flysystem, пакет, который обеспечивает уровень абстракции для различных форм хранения файлов. Хотя я не охватил все доступные адаптеры, документация должна помочь заполнить пробелы, представить несколько других функций и документировать любые новые адаптеры в будущем.
Абстракция – это выбор данных из большего пула, чтобы показать пользователю только соответствующие детали объекта. Абстракция «показывает» только необходимые атрибуты и «скрывает» ненужную информацию. Это помогает уменьшить сложность программирования и усилия. Это одна из самых важных концепций ООП.
Нажмите здесь, если видео не доступно
Абстракция в объектно-ориентированном программировании
В объектно-ориентированном программировании объекты представляют абстрактных «акторов», которые выполняют работу, изменяют свое состояние и могут взаимодействовать с другими объектами в системе. Подробная информация о точном состоянии объекта часто скрывается, что также называется сокрытием или инкапсуляцией информации . Здесь детали скрыты, чтобы не усложнять задачу.
Другая форма абстракции в объектно-ориентированном программировании также может быть обнаружена в ходе полиморфизма . Это разнообразие позволяет обмениваться объектами разных типов. Наследование от классов и структур является также формой абстракции , что позволяет изобразить сложную структуру отношений.
Различные объектно-ориентированные языки программирования предлагают сопоставимые концепции абстракции. Все они преследуют цель поддержать разнообразие объектно-ориентированного программирования.
В следующем примере кода на Java показана простая модель животных на ферме. Здесь представлены различные уровни абстракции. Класс Tier представляет как состояние животного, так и функциональные возможности .
С помощью этого определения можно создавать объекты типа Tier и вызывать следующие методы:
В приведенном выше примере класс является Tier абстракцией и используется вместо реальных животных. Lebewesen , класс, от которого он Tier получен, является другой формой абстракции. В данном случае это обобщение класса Tier .
Если на этом этапе потребуется дальнейшая дифференциация животных - например, дифференциация между животными, которые доставляют молоко или не дают молока, можно включить дополнительный уровень абстракции.
Абстракция данных
Абстракция данных обеспечивает четкое разделение абстрактных свойств типа данных и конкретных деталей реализации. Абстрактные свойства - это видимые извне интерфейсы. Конкретные реализации остаются полностью конфиденциальными и могут быть изменены с течением времени. Причинами этого могут быть, например, повышение эффективности. Важно, чтобы такие изменения не оказывали никакого внешнего воздействия на интерфейс, поскольку они не влияют на абстрактное поведение.
Автоматическое создание каталогов
Когда вы вызываете $filesystem->write() , он гарантирует, что каталог, в который вы пытаетесь записать, существует, а если нет, рекурсивно создает его для вас.
… в основном эквивалентно:
Кэширование
Flysystem также поддерживает ряд технологий для кэширования метаданных файлов. По умолчанию он использует кэш в памяти, но вы также можете использовать Redis или Memcached.
Вот пример использования Memcached; адаптер кеша передается конструктору Filesystem в качестве необязательного второго параметра:
Как и в случае с adpaters файловой системы, если вы хотите создать свой собственный, просто расширьте League\Flysystem\Cache\AbstractCache .
Языки спецификаций
Языки спецификации обычно основываются на различных формах абстракции, поскольку спецификация программного проекта обычно происходит на очень ранней стадии и, следовательно, в гораздо более абстрактный момент времени проекта. Unified Modeling Language это язык спецификации , что позволяет, например, определить абстрактные классы. Они остаются абстрактными на протяжении всей фазы архитектуры и спецификации проекта.
Список файлов и каталогов
Вы можете получить список всех файлов и каталогов в данном каталоге следующим образом:
Вывод будет выглядеть примерно так;
Если вы хотите включить дополнительные свойства в возвращаемый массив, вы можете использовать listWith() :
Чтобы получить рекурсивные списки каталогов, второй параметр должен быть установлен в TRUE:
null просто означает, что мы начинаем с корневого каталога.
Чтобы получить только пути:
Особенности языка
Уровни абстракции
Информатика очень часто говорит о разных уровнях абстракции ( уровни или слои английского языка ). Каждый уровень описывает модель одной и той же информации на разных уровнях абстракции в контексте соответствующей области.
Каждый более абстрактный, более высокий уровень находится на сравнительно более конкретном, более низком уровне. Например, вентили основаны на электронных схемах , двоичные интерфейсы основаны на вентилях, машинные языки основаны на двоичных интерфейсах, языки программирования основаны на машинных языках и приложениях, а операционные системы основаны на языках программирования.
Что такое абстракция в Java?
Абстракция в JAVA «показывает» только необходимые атрибуты и «скрывает» ненужные детали объекта от пользователя. В Java абстракция выполняется с использованием абстрактных классов, абстрактных методов и интерфейсов. Абстракция помогает уменьшить сложность и трудоемкость программирования.
Монтирование файловых систем
Монтирование файловых систем – это концепция, традиционно используемая в операционных системах, но она также может применяться к вашему приложению. По сути, это похоже на создание ссылок – ярлыков, в некотором смысле – на файловые системы, используя какой-то идентификатор.
Для этого Flysystem предоставляет Mount Manager. Вы можете передать один или несколько адаптеров при создании экземпляра, используя строки в качестве ключей:
Вы также можете смонтировать файловую систему позже:
Теперь вы можете использовать идентификаторы, как если бы они были протоколами в URI:
Возможно, более полезно использовать идентификаторы общего характера, например:
Чтение и запись в файловую систему
Что касается кода вашего приложения, вам просто нужно заменить вызовы, такие как file_exists() , fopen() / fclose() , fread / fwrite и mkdir() их эквивалентами flysystem.
Например, возьмите следующий устаревший код, который копирует локальный файл в корзину S3:
Используя flysystem, это может выглядеть примерно так:
Обратите внимание, как мы используем терминологию, такую как чтение и запись , локальные и удаленные абстракции высокого уровня, не беспокоясь о таких вещах, как создание и уничтожение файловых дескрипторов.
Вот краткое изложение наиболее важных методов класса League\Flysystem\Filesystem :
метод | пример |
---|---|
чтение | $filesystem->read('filename.txt') |
Письмо | $filesystem->write('filename.txt', $contents) |
обновление | $filesystem->update('filename.txt') |
Написание или обновление | $filesystem->put('filename.txt') |
Проверка существования | $filesystem->has('filename.txt') |
Удаление | $filesystem->delete('filename.txt') |
Переименование | $filesystem->rename('old.txt', 'new.txt') |
Чтение файлов | $filesystem->read('filename.txt') |
Получение информации о файле | $filesystem->getMimetype('filename.txt') |
$filesystem->getSize('filename.txt') | |
$filesystem->getTimestamp('filename.txt') | |
Создание каталогов | $filesystem->createDir('path/to/directory') |
Удаление каталогов | $filesystem->deleteDir('path/to/directory') |
Разница между абстрактным классом и интерфейсом
Абстрактный класс может иметь как абстрактные, так и неабстрактные методы.
Интерфейс может иметь только абстрактные методы.
Он не поддерживает множественное наследование.
Он поддерживает множественное наследование.
Это может обеспечить реализацию интерфейса.
Он не может обеспечить реализацию абстрактного класса.
Абстрактный класс может иметь защищенные и абстрактные публичные методы.
Интерфейс может иметь только публичные абстрактные методы.
Абстрактный класс может иметь конечную, статическую или статическую конечную переменную с любым спецификатором доступа.
Интерфейс может иметь только открытую статическую переменную final.
Абстрактный метод
Метод без тела известен как абстрактный метод. Он должен быть объявлен в абстрактном классе. Абстрактный метод никогда не будет окончательным, потому что абстрактный класс должен реализовывать все абстрактные методы.
Правила абстрактного метода
- Абстрактные методы не имеют реализации; имеет только сигнатуру метода
- Если класс использует абстрактный метод, он должен быть объявлен как абстрактный. Противоположность не может быть правдой. Это означает, что абстрактный класс не обязательно должен иметь абстрактный метод.
- Если обычный класс расширяет абстрактный класс, то этот класс должен реализовывать все абстрактные методы абстрактного родителя.
Оглавление
Управление видимостью
Видимость – то есть разрешения – могут различаться в реализации или семантике в разных механизмах хранения, но flysystem абстрагирует их как «частные» или «публичные». Таким образом, вам не нужно беспокоиться о специфике chmod , ACL-списков S3 или любой другой терминологии, которую использует конкретный механизм.
Вы можете установить видимость при вызове write() :
До 5.4 или в соответствии с предпочтениями:
Кроме того, вы можете установить видимость существующего объекта, используя setVisibility :
Вместо того, чтобы устанавливать его для каждого файла отдельно, вы можете установить видимость по умолчанию для данного экземпляра в его конструкторе:
Вы также можете использовать getVisibility для определения getVisibility к файлу:
Читайте также: