From 077379533226a86de85ce330d9a7a46d204078c8 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Mon, 4 Dec 2023 21:21:53 +0100 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 103 ++++++++++++++++-------------------------------------- 1 file changed, 31 insertions(+), 72 deletions(-) diff --git a/README.md b/README.md index 52b32ce..3ca4745 100644 --- a/README.md +++ b/README.md @@ -35,13 +35,13 @@ - [Уникальность экземпляров компонентов](#уникальность-экземпляров-компонентов) - [Дополнительная обработка компонента](#дополнительная-обработка-компонента) - [Использование контекста приложения](#использование-контекста-приложения) - - [Вынос логики регистрации желудей из точки запуска приложения](#вынос-логики-регистрации-желудей-из-точки-запуска-приложения) + - [Условная регистрация компонентов в контексте приложения](#условная-регистрация-компонентов-в-контексте-приложения) - [Инверсия управления запуском приложения](#инверсия-управления-запуском-приложения) - [Собственные аннотации](#собственные-аннотации) - [Наследование аннотаций](#наследование-аннотаций) - [Обработка аннотаций](#обработка-аннотаций) - - [Статический инициализатор контекста](#статический-инициализатор-контекста) - - [Заключение](#заключение) + - [В предыдущих сериях](#в-предыдущих-сериях) + - [Заключение](#заключение) ## Зачем мне это? @@ -66,9 +66,7 @@ Для инициализации контекста "ОСени" служит класс `Поделка`, который необходимо создать через `Новый` (один разочек можно и написать это вредное слово), а затем наполнить Желудями, Дубами и Напильниками. Нет, мы не упоролись, скоро расскажем, что тут к чему. -Инициализировать контекст можно двумя способами. - -1. Через сканирование каталога: +Инициализировать контекст можно так: ```bsl // file: main.os @@ -76,31 +74,23 @@ #Использовать autumn Поделка = Новый Поделка(); - -Поделка.ПросканироватьКаталог(ТекущийКаталог()); ``` -Сей нехитрый код заставит ОСень просканировать все `*.os` файлы в текущем каталоге (включая подкаталоги), понять, кто из них желудь, а кто дуб, и последовательно их добавить в контекст. +И... всё. - -2. Через непосредственную регистрацию: - +При создании Поделки ОСень автоматически просканирует все доступные в системе типов классы, определит, кто их них желудь, а то дуб, и последовательно добавит их в контекст. + +Вероятно, помимо загрузки собственно ОСени, вы захотите так же зарегистрировать и собственные классы. Единственное, что для этого нужно, это выполнить обычное для OneScript подключение библиотек по имени или пути: ```bsl // file: main.os #Использовать autumn +#Использовать "." Поделка = Новый Поделка(); - -Поделка - .ДобавитьЖелудь(Тип("ВерхнеуровневыйЖелудь")) - .ДобавитьЖелудь(Тип("ЖелудьНижнегоУровня")) - .ДобавитьДуб(Тип("ГлавныйДуб")); ``` -Не так красиво, как первый вариант, зато гибкости побольше, если вдруг она необходима. - ### Запуск приложения После добавления всех желудей, дубов и прочих частей в нашу поделку мы готовы к запуску приложения. @@ -237,7 +227,7 @@ В листинге выше объявляются две функции-конструктора, возвращающие желуди. Как вы видите, желудь может быть чем угодно, а что угодно (в данном случае - строка) может быть желудем. -Т. к. `Дуб` - это тоже желудь, а методы "Завязью" - это псевдо-конструкторы, то такой метод может быть скреплен пластилином с другими желудями. Плохие желуди могут даже хардкодить значения паролей, но мы закроем на это глаза. +Т. к. `Дуб` - это тоже желудь, а методы с "Завязью" - это псевдо-конструкторы, то такой метод может быть скреплен пластилином с другими желудями. Плохие желуди могут даже хардкодить значения паролей, но мы закроем на это глаза. В листинге выше `&Завязь` содержит параметр `Тип`. Он требуется, если из имени функции непонятно, что за тип она вернет. Ну, нам-то с вами понятно, что `Пароль` - это строка, но вот глупой железке надо немного помочь. @@ -286,7 +276,7 @@ > Поддержка загрузки настроек из переменных окружения и аргументов командной строки в ближайших планах разработки. Еще год-два и точно запилим, честно-честно! -Конфигурационный файл может быть в виде `json` или `yaml` файла, называется `autumn-properties.json`/`autumn-properties.yml` соответственно и ищется ОСенью в каталоге запуска приложения или в подкаталоге `src`. +Конфигурационный файл может быть в виде `json`, `yaml` или `ini` файла, называется `autumn-properties.json`/`autumn-properties.yml`/`autumn-properties.ini` соответственно и ищется ОСенью в каталоге запуска приложения или в подкаталоге `src`. ```json { @@ -300,7 +290,7 @@ А вот так их можно использовать в жёлуде: - ```bsl +```bsl // file: Классы/Обновлятор1С.os &Деталька @@ -318,7 +308,7 @@ &Желудь Процедура ПриСозданииОбъекта() КонецПроцедуры - ``` +``` Вы можете добавлять к желудю любые детальки вне зависимости от того, есть они в конфигурационном файле или нет. @@ -728,11 +718,11 @@ JSON обычно содержит вложенные объекты и масс Поэтому вам никто не запретит с помощью `Пластилина` прилепить `Поделка` в ваш `Желудь`, `Дуб` или даже `Напильник`. Главное - берегите свое ментальное здоровье. -### Вынос логики регистрации желудей из точки запуска приложения +### Условная регистрация компонентов в контексте приложения -Иногда вам может потребоваться выбирать, какие именно желуди вы хотите добавлять в свою поделку. Или их просто много, и не хочется захламлять точку запуска приложения вызовами `Поделка.ДобавитьЖелудь()`. Или по какой-то причине вам не подходит `Поделка.ПросканироватьКаталог()`. На помощь придёт объект `&Заготовка`, который можно расценивать как готовый набор желудей, добавляемый в поделку. +Иногда вам может потребоваться выбирать, какие именно классы вы хотите добавлять в свою поделку. Например, вы хотите загружать определенный класс только при выполнении какого-нибудь условия (из-за конфликта имен, к примеру). На помощь придёт объект `&Заготовка`, который можно расценивать как готовый набор желудей, добавляемый в поделку. -`&Заготовка` - это очень хитрый `&Желудь`! В отличие от обычных желудей он автоматически создается на фазе инициализации приложения, а затем у него вызывается метод `ПриИнициализацииПоделки(Поделка)`. Желудёвость заготовки позволяет пользоваться частью возможностей обычных желудей - на нем будут срабатывать `&Напильники`, добавленные в `Поделку` до `&Заготовки`, однако из всего многообразия ~~веществ~~ зависимостей ему доступны только `&Детальки` с настройками приложения. Ни тебе `&Пластилина`, ни `&Блестяшек` навесить на `&Заготовку` нельзя. +`&Заготовка` - это очень хитрый `&Желудь`! В отличие от обычных желудей он автоматически создается на фазе инициализации приложения, а затем у него вызывается метод `ПриИнициализацииПоделки(Поделка)`. Желудёвость заготовки позволяет пользоваться частью возможностей обычных желудей - на нем могут срабатывать `&Напильники`, добавленные в `Поделку` до `&Заготовки`, однако из всего многообразия ~~веществ~~ зависимостей ему доступны только `&Детальки` с настройками приложения. Ни тебе `&Пластилина`, ни `&Блестяшек` навесить на `&Заготовку` нельзя. ```bsl // file: Классы/НаборЖелудей.os @@ -745,27 +735,17 @@ JSON обычно содержит вложенные объекты и масс КонецПроцедуры Процедура ПриИнициализацииПоделки(Поделка) Экспорт - Поделка.ДобавитьЖелудь(Тип("Обновлятор1С")); - Поделка.ДобавитьЖелудь(Тип("ПроверяторВерсий"); - + + ПутьКСценарию = "./ОбычныйПроверятор.os"; + Если _ПереопределитьПроверятор Тогда - Поделка.ДобавитьЖелудь("ВерховныйПроверяторВерсий"); + ПутьКСценарию = "./НеобычныйПроверятор.os"; КонецЕсли; -КонецПроцедуры -``` - -Использовать заготовку можно так: - ```bsl -// file: main.os - -Поделка = Новый Поделка(); -Поделка - .ДобавитьЗаготовку(Тип("НаборЖелудей")) - .ЗапуститьПриложение(); - ``` + ПодключитьСценарий(ПутьКСценарию, "Проверятор"); -Лучше, чем дублировать ту же логику в `main.os`, не правда ли? +КонецПроцедуры +``` ### Инверсия управления запуском приложения @@ -773,16 +753,7 @@ JSON обычно содержит вложенные объекты и масс Вместо императивного стиля в виде поиска желудя и вызова у него нужного метода, мы можем добавить в `Поделку`... ещё один жёлудь с аннотацией `&Рогатка`. -`&Рогатка` - это специальный желудь, содержащий метод `ПриЗапускеПриложения()`, который вызовется при, кхм, запуске приложения. Если быть точным, при вызове `Поделка.ЗапуститьПриложение()`. - -```bsl -// file: main.os - -Поделка = Новый Поделка(); -Поделка - .ДобавитьРогатку(Тип("ПришедшийСМиром")) - .ЗапуститьПриложение(); -``` +`&Рогатка` - это специальный желудь, содержащий метод `ПриЗапускеПриложения()`, который вызовется при, кхм, запуске приложения. Если еще точнее, при вызове `Поделка.ЗапуститьПриложение()`. ```bsl // file: Классы/ПришедшийСМиром.os @@ -934,29 +905,17 @@ OneScript могуч. В отличие от материнской платфо Для всего остального есть модуль `РаботаСАннотациями`. -### Статический инициализатор контекста - -В некоторых случаях может понадобиться указать "ОСени" набор заготовок до/без собственно создания новой `Поделки`. Сейчас будет серьезный пример, т.к. на упоротых аналогиях объяснить такое не получается. И вообще, я птичка, мне такое сложно. +## В предыдущих сериях -В составе "ОСени" есть метод `Осень.ДобавитьЗаготовкуДляАвтоИнициализации(ИмяТипаЗаготовки)`, в который в качестве `ИмяТипаЗаготовки` можно передать *строку* с именем типа. Добавленные таким образом `&Заготовки` будут созданы и вызваны сразу же при создании `Поделки`. Особенность этого метода в том, что его можно вызывать еще до полной прогрузки классов и модулей вашего приложения или импортируемой сторонней библиотеки. - -Например, библиотека [winow](https://github.com/Nivanchenko/winow) содержит [модифицированный загрузчик библиотек](https://github.com/Nivanchenko/winow/blob/master/package-loader.os#L14), который прямо в момент `#Использовать winow` добавит в контекст `Поделки` информацию обо всех желудях, имеющихся в библиотеке, включая `&Рогатку`, которая и запустит веб-сервер, реализованный в `winow`. - -Таким образом, точка входа в приложение может быть минималистичной настолько, насколько возможно. Например, полный текст модуля запуска приложения на `winow` выглядит вот так: - -```bsl -#Использовать autumn -#Использовать winow - -Поделка = Новый Поделка; -Поделка.ЗапуститьПриложение(); -``` +В прошлых версиях библиотеки и/или документации вы могли встречать описание таких вещи как: -В коде выше сначала импортируется сама "ОСень", которая и предоставит модуль `Осень` с методом добавления заготовок, а затем загрузится `winow`, которая своим загрузчиком библиотеки наполнит "ОСень" заготовками. А уже при создании приложения и его запуске и произойдет вся магия регистрации и запуска желудей. +* методы `Поделка.ДобавитьЖелудь()`/`Поделка.ДобавитьДуб()` и другие методы добавления желудей в поделку; +* метод `Поделка.ПросканироватьКаталог()` +* модуль `Осень` и автоматическую регистрацию заготовок для запуска при создании поделки; -Такие дела. +Все это устарело и теперь либо не используется, либо просто не нужно. Да, следить за чейнджлогами полезно! -### Заключение +## Заключение Если вы думаете, что мы упоролись, то вы в чем-то даже правы. Напоследок отмечу, что среди вариантов именования аннотаций "ОСени" еще была связка Гриб/Грибница/Спора/Рецепт для Желудь/Дуб/Завязь/Напильник соответственно. Так что еще не все потеряно. Надеюсь.