Репозиторий: что это и как с ним работать
Репозиторий — часть системы Git, которая позволяет программистам совместно работать над проектами. Этот инструмент облегчает жизнь IT-специалистам: с ним можно безопасно вносить изменения в программный код.
Что такое Git, как работает и для чего нужен репозиторий — рассказываем в статье.
Что такое репозиторий простыми словами
Репозиторий — это хранилище всех версий кода. Он бывает трех видов:
- Локальный — расположен на одном компьютере, и работать с ним может только один человек.
- Централизованный — расположен на сервере, куда имеют доступ сразу несколько программистов.
- Распределенный — самый удобный вариант с облачным хранилищем. Главный репозиторий хранится в облаке, а его локальные копии — у разработчиков на компьютерах. Когда программист вносит правки в локальную версию, ее можно синхронизировать с удаленной. Получается, что в облаке всегда актуальный код.
Для работы с распределенными репозиториями нужен удобный сервис. Самые популярные — GitHub, GitLab и Bitbucket. У них понятный интерфейс, в котором можно управлять проектом, добавлять новые объекты и искать общедоступные репозитории.
Видео #28. Пакеты, репозитории и другие термины
Git — это система, которая позволяет контролировать версии приложения. Она сохраняет все подтвержденные изменения кода. Поэтому в любой момент можно отменить правки или исключить ненужные части кода.
Git-сервисы позволяют переключаться между ветками кода и просматривать коммиты. Объясним, что такое ветка и коммит, на примере сервиса GitLab.
Пример репозитория в GitLab — структура такая же, как в обычном файловом менеджере
Чтобы изменения отправились в репозиторий проекта, их нужно «закоммитить». Так называется отправка данных в репозиторий. Это действие нужно, чтобы в репозитории была четкая структура версий.
Коммит подтверждает, что изменения в коде финальные и их можно применять.
Пример коммита в системе GitLab. Сразу видно, кто, когда и какие изменения внес в репозиторий
В репозиториях существуют « ветки » — это важная особенность Git-систем. Ветка позволяет менять отдельные элементы кода, не вмешиваясь в основной код. Главная ветка называется master, дополнительные можно называть по-своему.
Так выглядит раздел с ветками в GitLab — они разделяются на активные и устаревшие. В меню можно посмотреть название, скачать или удалить всю ветку
Внутри ветки видно весь ход изменений. Например, что конкретно и в каких файлах изменили
Как работать с системой распределенных репозиториев
Системы распределенных репозиториев GitHub, GitLab и Bitbucket удобны по нескольким причинам:
- Через них легко координировать разработку, проводить и публиковать тесты.
- В них можно размещать открытый исходный код, чтобы разработчики скачивали его копии и по-своему изменяли. Благодаря таким энтузиастам появляются новые версии программ.
- Это полезный ресурс для программистов при трудоустройстве. Сервис заменяет «портфолио» разработчика: человек может дать доступ к своему репозиторию и показать примеры хорошего кода.
Как создать репозиторий
Разберемся на примере GitLab .
Что такое репозитории и как ими пользоваться. 3.2. Курс «Git для начинающих»
Для начала работы нужно создать аккаунт. Это можно сделать на главной странице сайта: достаточно ввести имя, контактную почту и придумать пароль.
Доступна регистрация по одному клику через действующие аккаунты в Google, GitHub, Twitter, Bitbucket и Salesforce
После регистрации открывается окно с доступными действиями. Здесь можно создать новый проект или группу для совместной работы, отправиться изучать проекты других участников или узнать больше о работе GitLab.
У сервиса минималистичный интерфейс, в котором можно быстро разобраться
В новом окне нужно выбрать действие с проектом:
- Создать новый: подходящий вариант для нового репозитория. Останется задать имя и адрес, описание, доступность и конфигурацию проекта.
- Создать по готовому шаблону: достаточно выбрать цель проекта, и сервис создаст репозиторий с нужными настройками. Например, для работы с Android- или iOS-приложениями.
- Импортировать готовый с GitHub или Bitbucket.
- Подключить внешний репозиторий к GitLab CI/CD.
CI/CD — это «непрерывная интеграция и непрерывная поставка». При таком подходе в код вносят частые небольшие изменения, чтобы ускорить процесс коллективной работы.
Продвинутые пользователи могут создать проект через командную строку — это базовый инструмент работы с Git
После ввода основных параметров проекта остается нажать Create project, и репозиторий готов.
Для тех, кто не знает, как добавить репозиторий к уже существующим: нужно нажать на знак плюса в верхней части страницы и выбрать New project/repository.
По клику откроется меню с выбором, какой проект нужно создать
Как создать SSH-ключ
Как подключить репозиторий к облаку: для этого нужен SSH-ключ. Он позволяет не вводить данные пользователя при каждом коммите. Чтобы создать ключ, нужно:
- Скачать на компьютер Git-клиент .
- После установки клиента запустить его и ввести ssh-keygen в командной строке.
- Придумать имя для файла с ключом и запомнить путь сохранения. По умолчанию для Windows это ваша пользовательская папка.
- Придумать пароль для файла. Если пароль не нужен, пропустите шаг, нажав клавишу Enter.
- Получить два файла с ключом. Один — локальный только для вас, второй — публичный, для копирования. Git создает их автоматически.
Git записывает все ваши действия. Так можно проверить, какое имя файла вы задали и куда сохранили
Следующим шагом надо найти в вашей папке публичный ключ. У него будет расширение .pub — следует открыть его в текстовом редакторе и скопировать весь текст.
Далее нужно перейти к настройкам пользователя GitLab и выбрать раздел SSH Keys. Здесь нужно вставить скопированный текст в поле Key, задать имя и срок действия ключа и нажать Add key.
Новый SSH-ключ готов. Теперь с его помощью можно связать локальный репозиторий на компьютере с облачным в GitLab
Как клонировать репозиторий
Это действие нужно, чтобы подключить ключ. Чтобы клонировать репозиторий в GitLab:
- Откройте репозиторий.
- Нажмите кнопку Clone.
- Скопируйте ссылку Clone with SSH.
Эти данные нужно будет ввести в Git-клиент на компьютере.
Выводы
Репозиторий — функциональное средство для работы с кодом. Работа с Git-репозиторием в программировании не позволит потерять или безвозвратно испортить код. Любые правки всегда можно отменить.
Для работы с системой контроля репозиториев потребуется Git-клиент на компьютере — через него отправляют пакеты с кодом в облачное хранилище. Он бесплатный и доступен для разных операционных систем: Windows, Linux и macOS. Также во всех современных редакторах кода типа VS Code или Atom есть инструменты для работы с репозиториями и Git-платформами. Это может быть встроенная возможность или плагины.
Источник: dzen.ru
Что такое репозитории Linux и как устанавливать программы из них и пакетов!
Приветствую Всех! В прошлой статье мы разобрались как установить обновления и дополнительные программы из официальных репозиториев Linux Ubuntu Как установить обновления и дополнительные программы для Linux Ubuntu! Что же такое Linux репозитории.
Репозито́рий Linux, хранилище — место, где хранятся и поддерживаются какие-либо данные. Чаще всего данные в репозитории хранятся в виде файлов, доступных для дальнейшего распространения по сети. Кроме официальных существует множество репозиториев Linux от авторов программ и от тех, кто не поленился собрать из исходников пакет и поделиться им с другими.
Launchpad предлагает создавать PPA-репозитории — Personal Package Archive. Это обычно небольшой репозиторий Linux, в который его хозяин складывает исходники, а пользователи на выходе получают уже готовый deb-пакет. Поскольку репозитории Linux расположены в интернете, существует вероятность подмены репозитория злоумышленником на свой, содержащий модифицированные пакеты.
Многие репозитории имеют защиту от подмены. Защита реализована при помощи сверки цифровых подписей Linux репозитория и клиента. Доверенными Linux репозиториями считаются репозитории, которые имеет цифровую подпись, а пользовательский компьютер содержит открытый ключ для этого репозитория.
В Linux Ubuntu по умолчанию доверенными являются репозитории на установочных дисках и основные интернет репозитории — archive.ubuntu.com. При наличии на компьютере нескольких подключенных Linux репозиториев, предпочтение отдается доверенным. При подключении Linux репозитория, защищенного цифровой подписью, нужно скачать открытый ключ и добавить его в систему.
Иногда для скачивания предоставляется доступный для установки пакет, который при своей установке сам прописывает ключ репозитория. Если вы скачиваете ключ с сайта репозитория Linux, то вы получите обычный файл с расширением .key, .gpg или другим. Для закрепления теории рассмотрим на практике добавление дополнительного Linux репозитория на примере бесплатной кроссплатформенной виртуальной машине Oracle VirtualBox версии 5.0 Открываем терминал для работы в командной строке ( рассматривали здесь ) Для редактирования файла /etc/apt/sources.list в командной строке набираем (mcedit-текстовый редактор, как его установить смотрите здесь) sudo mcedit /etc/apt/sources.list и нажимаем на клавиатуре клавишу «Enter». Для получения дополнительных привилегий необходимо ввести пароль пользователя и нажать на клавиатуре клавишу «Enter».
В конец файла добавляем строку
deb http://download.virtualbox.org/virtualbox/debian trusty contrib

Для сохранения внесенных изменений нажимаем на клавиатуре клавишу «F2» и подтверждаем перезапись файла нажав кнопку «Сохранить».

Для возвращения в командную строку выйдем из файла, нажав на клавиатуре клавишу «F10».
Следующим шагом скачаем открытый ключ и добавим его к себе в систему.
Для этого копируем следующую строку sudo wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add — и нажимаем на клавиатуре клавишу «Enter».

После добавления ключа получаем ответ, что все хорошо.

Мы рассмотрели как добавить новый Linux репозиторий и открытый ключ. В дальнейшем вы сможете добавлять новые репозитории Linux самостоятельно. Всю необходимую информацию Вы сможете найти на сайте разработчика этого программного обеспечения.
Для того чтобы установить VirtualBox версии 5.0. необходимо обновить списки пакетов (как это сделать смотрите здесь) и только после этого запустить установку (как это сделать смотрите здесь)
В командной строке необходимо набрать следующую строку
sudo apt-get install virtualbox-5.0
и нажать на клавиатуре клавишу «Enter». Для того чтобы запустить программу virtualbox-5.0. нажимаем на значок в левом верхнем углу экрана «Поиск на компьютере. »
В поисковой строке вводим «virt»
И выбираем программу «Oracle VM VirtualBox» кликнув левой кнопки мыши.

Для того, чтобы посмотреть версию установленной программы, в верхней панели выбираем «Справка», «О программе»

Видим, что у нас установлена программа VirtualBox Версия 5.10 r104061

О том, как работать с VirtualBox мы рассматривали в статье
Установка и настройка программы для работы с виртуальными машинами – Oracle VirtualBox) Для того, чтобы каждый раз не искать необходимую программу, мы можем закрепить ее на панели. Для этого щелкаем правой кнопкой мыши на значке и выбираем «Закрепить на панели»

После закрытия программы значок остается на панели.

Данным способом вы можете закреплять на панели необходимые вам программы. Теперь рассмотрим, как устанавливать программы из пакетов.
Программу VirtualBox можно также установить и из пакета, скачав его с официального сайта. Минус данного способа, что все дальнейшие обновления нам придется также устанавливать вручную, пока не добавим к себе в систему Linux репозиторий VirtualBox. Но не у всех программ есть репозиторий Linux. И эти программы можно устанавливать и обновлять только вручную. Ярким примером является Skype.
Для установки скачиваем пакет с официального сайта. Так как нет пакета для нашей версии 14.04, то выбираем ближайший 12.04.
Соглашаемся и сохраняем файл.
Выбираем загруженный файл и указываем открыть папку со скачанным файлом.
Обычно все загруженные файлы сохраняются в домашней директории пользователя в папке «Загрузки».
Щелкаем правой кнопкой мыши на значке и выбираем «Открыть с помощью «Центр приложений»».
Откроется центр приложений. Для установки пакета нажимаем кнопку «Установить».
Начнется процесс установки. Об этом нам сообщает центр приложений Linux Ubuntu в верхней части окна и слева в виде шкалы загрузки.
Для установки дополнительных программ для Linux Ubuntu нам потребуются дополнительные привилегии.
Для их получения система просит нас ввести наш пароль. Вводим его и нажимает кнопку «Аутентифицировать»
После окончания установки откроем Skype. Нажимаем на значок в левом верхнем углу экрана «Поиск на компьютере. »
В поисковой строке введем «sky»
И выберем программу «Skype» кликнув левой кнопки мыши.
Соглашаемся с условиями использования.
Откроется окно «Skype». И если у Вас уже есть учетная запись, то вы можете их ввести и начать работу с этим приложением.
А как пользоваться Skype мы рассматривали в статье Как настроить и пользоваться программой Skype! Настройка Skype в Windows и Linux немного отличаются, но я думаю, что настройка не вызовет у вас каких-то сложностей, если вы будете руководствоваться вышеуказанной статьей. Но если они все-таки возникнут, то вы всегда можете задать мне вопрос.
Мы рассмотрели как добавить дополнительные Linux репозитории и установить программу из пакета. Теперь вы сможете сами устанавливать требуемые вам программы в Linux Ubuntu. И если остались непонятные вопросы по данной теме и есть предложения, то прошу их писать в комментариях. Всем пока!
Сделай репост – выиграй ноутбук!
- Нажми на одну из кнопок соц. сетей
- Получи персональный купон
- Выиграй ноутбук LENOVO или HP
Источник: serfery.ru
Репозиторий — это. Установка программ из репозитория и добавление новых репозиториев
Всевозможные программы или же обновления, которые на сегодняшний день используются в Ubuntu, устанавливаются исключительно из репозиториев. При этом многие пользователи даже не знают, что это такое и в чем заключается его основное предназначение.
Что это такое?
Репозиторий – это специальное место, из которого пользователь операционной системы Ubunty может устанавливать всевозможные обновления или же программы. Если вы раньше пользовались операционными системами Mac и Windows, то вы, наверное, уже успели привыкнуть к тому, что программное обеспечение представляет собой какой-нибудь один или же несколько установочных файлов, которые пользователю предоставляются на определенных носителях или же могут скачиваться через Интернет. Для операционной системы Ubuntu также предусматривается такой вариант распространения программного обеспечения, но относится это больше к специализированным закрытым или же проприетарным программам.
Репозиторий как универсальное хранилище Ubuntu
Однако, видя такие файлы, многие пользователи могут даже не знать о том, что представляет собой репозиторий. Это специализированный сервер-хранилище, на котором располагаются такие файлы. Другими словами, репозитории можно назвать своеобразным источником приложений, так как пользователи со своих компьютеров подключаются к ним через Сеть или же Интернет, используя специализированные утилиты, после чего могут увидеть, какие пакеты на данный момент уже есть на компьютере, а какие можно будет установить. Стоит отметить, что преимущественное большинство утилит поддерживает процедуру простого поиска по ключевым словам, а также может разбивать пакеты на несколько групп по категориям.
Применение связки «программа-репозиторий» – это возможность использования достаточно простог, и в то же время централизованного метода установки или же удаления различного софта, а также для пользователей таким образом гораздо легче выкладываются различные обновления. В свежеустановленной операционной системе уже могут находиться требуемые репозитории, но при этом никто не запрещает применять также сторонние хранилища данных.
Репозитории Ubuntu содержат в себе огромнейшее количество самого разного программного обеспечения, поэтому зачастую нет ничего сложного в том, чтобы найти в них интересующую вас утилиту. Конечно, вы можете просто из Интернета скачать какой-нибудь пакет файлов .deb или даже попробовать самостоятельно собрать программу из исходников, но при этом вы должны понимать, что этот вариант является более трудоемким и далеко не всегда в конечном итоге оказывается действенным.
Как искать и устанавливать различные программы?
Изначально, используя репозитории Ubuntu, вам следует исходить из того, что есть определенная задача, которая должна быть решена при помощи утилиты, но при этом вы можете даже не знать, существует ли таковая и как она называется. Однако вполне вероятно, что вы знаете программы-аналоги, которые используются в других операционных системах.
Используя какой-нибудь интернет-поисковик, вы находите интересующие вас варианты нужной программы, к примеру, набирая название аналогичной утилиты в Windows, но дописывая в запрос «для Ubuntu». В преимущественном большинстве случаев поисковик выдаст вам несколько названий программ, при этом стоит отметить тот факт, что они могут быть представлены в достаточно большом количестве, но выбрать наиболее оптимальную вы сможете по отзывам тех пользователей, которые уже успели ею воспользоваться. Практически каждая современная утилита имеет собственную страничку в Интернете, на которой можно будет ознакомиться с дополнительными характеристиками или же просмотреть скриншоты.
Где скачать программу?
После того как вы определитесь с названием интересующей вас программы, нужно будет запустить центр приложений Ubuntu, после чего найти ее в доступном списке. Скорее всего, вам удастся отыскать ее и установить в достаточно короткие сроки. Помимо этого, вполне вероятно, что у разработчиков присутствуют собственные репозитории для iOS 7 или других операционных систем. В преимущественном большинстве случаев в таких репозиториях находятся наиболее свежие версии интересующей вас программы, поэтому, если вас интересует максимальная продуктивность, то стоит внимательно осмотреть сайт, а также воспользоваться поиском.
Только в том случае, если вам не удалось найти нужную программу, используя репозитории для iOS 7 или других ОС, вам стоит пробовать другие варианты установки. Зачастую случается так, что те версии программного обеспечения, которые находятся в репозиториях, представляют собой устаревшие варианты, но при этом на самом деле бывают часто и такие ситуации, когда именно они являются лучше интегрированными в Ubuntu, а в определенных ситуациях отличаются также более стабильной работой.
Секции
В Ubuntu лучшие репозитории подразделяются на четыре секции, которые называются компонентами и предназначаются для того, чтобы отразить страницу как в лицензии, так и в уровне доступной пользователю поддержки. Пакеты подразделяются по компонентам следующим образом:
- Main – абсолютно свободное программное обеспечение, которое поддерживается компанией Canonical.
- Restricter – проприетарное программное обеспечение, которое включает в себя в основном различные драйверы устройств. Все утилиты также поддерживаются компанией Canonical.
- Universe – также свободное программное обеспечение, которое официально не поддерживается Canonical, но при этом контролируется сообществом пользователей операционной системы.
- Multiverse – проприетарное ПО, не имеющее поддержки компании Canonical.
Типы репозиториев
Также существует 5 основных репозиториев:
- Release – пакеты, которые были выпущены на момент выхода релиза.
- Release-security – пакеты, в которых присутствуют какие-то критические обновления безопасности.
- Release-updates – пакеты, содержащие в себе обновления системы, включая также различные более современные версии программного обеспечения, которые были выпущены после официального релиза.
- Release-backports – всевозможные бэкпорты, принадлежащие к новым версиям определенного ПО, которое является доступным исключительно в нестабильных версиях операционной системы Ubuntu.
- Partner – репозиторий, в котором содержится различное программное обеспечение компаний, являющихся партнерами Canonical.
Стоит отметить, что, помимо официальных, существуют также и другие репозитории для iOS 8 и других операционных систем. Они могут создаваться авторами тех или иных утилит, а также людьми, которые просто решили из исходников собрать полноценный пакет, после чего выпустить его в открытом доступе для других пользователей.
Добавление через Launchpad
Если вы не знаете, как добавить репозиторий, в этом вам поможет Launchpad, предоставляющий возможность создания РРА-репозиториев. Эти хранилища представляют собой относительно небольшие пакеты, в которые владелец складывает различные исходники, а пользователям на выходе предоставляется полноценный deb-документ.
Как подключить?
Если человек не находит интересующую его утилиту, он может самостоятельно разобраться, как добавить репозиторий, после чего загрузить в него нужное программное обеспечение. Ведь достаточно часто случается так, что в репозиториях Ubuntu попросту отсутствуют различные утилиты, которые могут понадобиться для решения тех или иных задач. Именно по этой причине есть достаточно большое количество сторонних репозиториев, при подключении которых можно получить доступ к необходимому ПО. Это можно сделать как с использованием графического интерфейса, так и через консоль.
Сразу стоит отметить тот факт, что в некоторых репозиториях, помимо тех пакетов, которые вам нужны, могут находиться также всевозможные экспериментальные сборки разного программного обеспечения, включая также ядра, которые содержат в себе Linux-репозитории. Так как версия таких пакетов в преимущественном большинстве случаев выше по сравнению с теми, которые используете вы, «Менеджер обновлений» может попробовать самостоятельно обновить систему. Он сделает это через бесплатные репозитории, что может нанести повреждения вашей системе. Именно по этой причине вам нужно в любом случае внимательно читать описания подключаемого хранилища, а также ту информацию, которая находится в «Менеджере обновлений».
При помощи графического интерфейса
В данном случае репозитории для iOS 8 и других ОС подключаются следующим образом:
- Открывается центр приложений Ubuntu.
- Далее переходим в пункт «Правка» / «Источники приложений».
- В новом окне выбираем вкладку «Другое программное обеспечение», после чего нажимаем на кнопку «Добавить».
- В новом окне заполняем поле «Строка АРТ:», нажимаем кнопку «Добавить источник».
- Теперь источник добавлен и включен, можно закрывать окно.
Так как вы подключили новый источник программного обеспечения, вам нужно будет произвести обновление информации о пакетах. В преимущественном большинстве случаев после подключения появляется окно, в котором пользователю предлагают обновить эти данные. В окне нужно просто нажать на кнопку «Обновить».
После того как вами будет обновлена вся информация о пакетах, окно «Источники приложения» будет закрыто, и, скорее всего, у вас появится ошибка о том, что источник приложения является неподписанным. Однако вы сможете устанавливать интересующие вас утилиты, которые содержатся в подключенном вами репозитории, при помощи стандартных средств. Чтобы устранить ошибку неподписанного репозитория, вам следует разбираться уже в системе защиты.
При помощи консоли
Данный вариант является наиболее оптимальным из всех существующих способов. Лучше всего добавить локальный репозиторий или же другие виды хранилищ при помощи консоли. Делается это достаточно просто, ведь хранилище добавляется всего лишь одной командой, такой как, например: sudo apt-add-repository ppa:ripps818/coreavc.
В случае необходимости можно точно так же через консоль и удалить репозиторий.
Система защиты
Так как в преимущественном большинстве случаев репозитории располагаются в Интернете, есть вероятность того, что злоумышленники могут подменить репозиторий на собственный, в котором содержатся различные модифицированные пакеты. Таким образом, устанавливая на свой компьютер модифицированное программное обеспечение, пользователь может поставить свою систему под реальную угрозу. Однако во многих репозиториях предусматривается защита от подмены. Такой вариант защиты реализовывается путем сравнения цифровых подписей клиента и репозитория. В том случае, если у хранилища имеется цифровая подпись, на пользовательском компьютере присутствует ключ, который является открытым для данного репозитория.
В Ubuntu стандартно доверенными являются хранилища, находящиеся на установочных дисках. Если на пользовательском компьютере одновременно несколько подключенных репозиториев, предпочтительными будут именно доверенные хранилища.
Как добавить ключ?
Подключая хранилище, которое находится под защитой цифровой подписи, вам необходимо будет скачать специализированный открытый ключ, который должен быть добавлен в систему. Достаточно часто для скачивания может быть предоставлен пакет, доступный для установки, который полностью самостоятельно будет прописывать ключ репозитория. Если вы будете скачивать ключ непосредственно с сайта репозитория, то в таком случае вам будет предоставлен обычный файл с расширением .gpg, .key или же каким-нибудь другим. Добавить данный файл в систему можно будет при помощи консольной команды sudo apt-key add repo.key, но вместо .key указывается тот ключ репозитория, который был вами получен.
Добавление ключа через сервер
Наиболее оптимальным вариантом является добавление ключа через специализированный сервер, находящийся под защитой. Достаточно часто, если речь идет о ключе, дается его буквенно-цифровой идентификатор, который пользователю на первый взгляд может быть абсолютно непонятным, но это уникальное имя. Такие ключи располагаются на специальных серверах, откуда получить их может любой человек.
Источник: fb.ru
Паттерн «Репозиторий». Основы и разъяснения
Вот как Википедия описывает репозиторий. Так уж случилось, что в отличие от некоторых других жаргонных словечек, с которыми мы имеем дело, этот термин прекрасно передает свою суть. Репозиторий представляет собой концепцию хранения коллекции для сущностей определенного типа.
Репозиторий как коллекция
Вероятно, наиболее важным отличием репозиториев является то, что они представляют собой коллекции объектов. Они не описывают хранение в базах данных или кэширование или решение любой другой технической проблемы. Репозитории представляют коллекции. Как вы храните эти коллекции — это просто деталь реализации.
Я хочу внести ясность в этот вопрос. Репозиторий — это коллекция. Коллекция, которая содержит сущности и может фильтровать и возвращать результат обратно в зависимости от требований вашего приложения. Где и как он хранит эти объекты является ДЕТАЛЬЮ РЕАЛИЗАЦИИ.
В мире PHP мы привыкли к циклу запрос/ответ, который оканчивается смертью процесса. Все, что пришло извне и не сохранилось — ушло навсегда, в этой точке. Так вот, не все платформы работают именно так.
Хорошим способом понять как работают репозитории является представление вашего приложения постоянно работающим, в этом случае все объекты остаются в памяти. Вероятность критических сбоев и реакцию на них в этом эксперименте можно пренебречь. Представьте, что у вас есть Singleton-экземпляр репозитория для сущностей Member , MemberRepository .
Затем создайте новый объект Member и добавьте его в репозиторий. Позже, вы запросите у репозитория все элементы, хранящиеся в нем, таким образом вы получите коллекцию, которая содержит этот объект внутри. Возможно вы захотите получить какой-то конкретный объект по его ID, это также возможно. Очень легко представить себе, что внутри репозитория эти объекты хранятся в массиве или, что еще лучше, в объекте-коллекции.
Проще говоря, репозиторий — это особый вид надежных коллекций, которые вы будете использовать снова и снова, чтобы хранить и фильтровать сущности.
Взаимодействие с Репозиторием
Представьте, что мы создаем сущность Member . Мы приводим объект к необходимому состоянию, затем запрос заканчивается и объект исчезает. Пользователь пытается авторизоваться в нашем приложении и не может. Очевидно, что нам необходимо сделать этот объект доступным и для других частей приложения.
$member = Member::register($email, $password); $memberRepository->save($member);
Теперь мы можем получить доступ к объекту позже. Примерно так:
$member = $memberRepository->findByEmail($email); // or $members = $memberRepository->getAll();
Мы можем хранить объекты в одной части нашего приложения, а затем извлекать их из другой.
Должны ли репозитории создавать сущности?
Вы можете встретить такие примеры:
$member = $memberRepository->create($email, $password);
Я видел множество аргументов приводящихся в пользу этого, но совершенно не заинтересован в подобном подходе.
Прежде всего, репозитории — это коллекции. Я не уверен в том, зачем коллекция должна быть коллекцией и фабрикой. Я слышал аргументы вроде «если обращаться удобнее так, то почему бы не повесить обработчик на подобные действия»?
На мой взгляд, это анти-паттерн. Почему бы не позволить классу Member , иметь свое собственное понимание как и зачем создается объект или почему бы не сделать отдельную фабрику для создания более сложных объектов?
Если мы относимся к нашим репозиториям как к простым коллекциям, так значит и не нужно нагружать их лишним функционалом. Я не хочу классов коллекций, которые ведут себя как фабрики.
В чем выгода использования репозиториев?
Основное преимущество репозиториев — это абстрактный механизм хранения для коллекций сущностей.
Предоставляя интерфейс MemberRepository мы развязываем руки разработчику, который уже сам решит как и где хранить данные.
interface MemberRepository
class ArrayMemberRepository implements MemberRepository < private $members = []; public function save(Member $member) < $this->members[(string)$member->getId()] = $member; > public function getAll() < return $this->members; > public function findById(MemberId $memberId) < if (isset($this->members[(string)$memberId])) < return $this->members[(string)$memberId]; > > >
class RedisMemberRepository implements MemberRepository < public function save(Member $member) < // . >// you get the point >
Таким образом, большинство наших приложений знает только абстрактное понятие MemberRepository и его использование может быть отделено от фактической реализации. Это очень раскрепощает.
К чему относятся репозитории: Domain или Application Service Layer?
Итак, вот интересный вопрос. Во-первых, давайте определим, что Application Service Layer — это многоуровневая архитектура, которая отвечает за специфические детали реализации приложения, такие как целостность базы данных, и различные реализации работы с интернет-протоколами (отправка электронной почты, API) и др.
Определим термин Domain Layer как слой многоуровневой архитектуры, которая отвечает за бизнес-правила и бизнес-логику.
Куда же попадет репозиторий при таком подходе?
Давайте посмотрим на нашем примере. Вот код, написанный ранее.
class ArrayMemberRepository implements MemberRepository < private $members = []; public function save(Member $member) < $this->members[(string) $member->getId()] = $member; > public function getAll() < return $this->members; > public function findById(MemberId $memberId) < if (isset($this->members[(string)$memberId])) < return $this->members[(string)$memberId]; > > >
В этом примере я вижу много деталей реализации. Они, несомненно, должны входить в слой приложения
А теперь давайте удалим все детали реализации из этого класса…
class ArrayMemberRepository implements MemberRepository < public function save(Member $member) < >public function getAll() < >public function findById(MemberId $memberId) < >>
Хм… это начинает выглядеть знакомо… Что же мы забыли?
Возможно, получившийся код напоминает вам это?
interface MemberRepository
Это означает, что интерфейс находится на границе слоев. и на самом деле может содержать доменно-специфические концепты, но сама реализация не должна этого делать.
Интерфейсы репозиториев принадлежат к слою домена. Реализация же относятся к слою приложения. Это означает, что мы свободны при построении архитектуры на уровне доменного слоя без необходимости зависеть от слоя сервиса.
Свобода смены хранилищ данных
Всякий раз, когда вы слышите чей-то разговор о концепции объектно-ориентированного дизайна, вы, наверное, могли слышать что-то вроде «… и у вас есть возможность поменять одну реализацию хранения данных на другую в будущем. «
По-моему, это не совсем правда… я бы даже сказал, что это очень плохой аргумент. Самой большой проблемой объяснения концепции репозиториев является то, что сразу напрашивается вопрос «вы действительно хотите это делать?». Я НЕ хочу чтобы подобные вопросы влияли на использование паттерна репозитория.
Любое достаточно хорошо спроектированное объектно-ориентированное приложение автоматически подходит под приведенное преемущество. Центральной концепцией ООП является инкапсуляция. Вы можете предоставить доступ к API и скрыть реализацию.
Ведь вы же на самом деле не будете переключаться с одного ORM на другой и обратно. Но даже если вы захотите так делать, то, по крайней мере, у вас будет возможность сделать это. Однако, замена реализации репозитория будет огромным плюсом при тестировании.
Тестирование при использовании паттерна «Репозиторий»
Ну, тут все просто. Давайте предположим, что у вас есть объект, который обрабатывает что-то вроде регистрации участников…
class RegisterMemberHandler < private $members; public function __construct(MemberRepository $members) < $this->members = $members; > public function handle(RegisterMember $command) < $member = Member::register($command->email, $command->password); $this->members->save($member); > >
Во время очередной операции, я могу взять экземпляр DoctrineMemberRepository . Однако, во время тестирования легко можно заменить его на экземпляр ArrayMemberRepository. Они оба реализуют один и тот же интерфейс.
Упрощенный пример теста может выглядеть примерно так…
В этом примере мы тестируем обработчик. Нам не нужно проверять корректность хранения данных репозитория в БД (или еще где). Мы тестируем конкретное поведение этого объекта: регистрируем пользователя на основе данных формы, а затем передаем их в репозиторий.
Коллекция или Состояние
В книге Implementing Domain-Driven Design Vaughn Vernon делает различие между типами репозиториев. Идея коллекцио-ориентированного репозитория (ориг. — collection-oriented repository) в том, что работа с репозиторием идет в памяти, как с массивом. Репозиторий, ориентированный на хранение состояний (ориг. — persistence-oriented repository) содержит в себе идею, что в нем будет какая-то более глубокая и продуманная система хранения. По сути различия лишь в названиях.
// collection-oriented $memberRepository->add($member); // vs persistence-oriented $memberRepository->save($member);
Замечу, что это лишь мое мнение и пока что я придерживаюсь именно его в вопросах использования репозиториев. Однако, хотел бы предупредить, что возможно могу передумать. В конце-концов, я сосредотачиваюсь на них как на коллекциях объектов с теми же обязанностями, что и у любого другого объекта-коллекции.
Дополнительная информация
everzet создал проект на Github о репозиториях на который, безусловно, стоит посмотреть. Внутри вы найдете примеры работы с хранением в памяти и файлах.
Итоги
- … важно дать репозиториям сингулярную задачу функционировать как коллекция объектов.
- … мы не должны использовать репозитории для создания новых экземпляров объектов.
- … мы должны избегать использования репозиториев как способа перехода от одной технологии к другой, так как они имеют очень много преимуществ, от которых трудно отказаться.
Если у вас есть вопросы или если ваше мнение отличается от моего, пожалуйста, пишите комментарии ниже.
Как всегда, я намерен обновлять статью, чтобы синхронизировать ее с моим текущим мнением.
Источник: habr.com