Деякі аспекти автоматизованого впровадження залежностей у мові РНР

Аналіз і розгляд загальних проблем і перспектив використання принципу впровадження залежностей під час розробки вебзастосунків мовою РНР. Особливість розв’язання деяких проблем інверсії управління на основі шаблону під час проектування вебзастосунків.

Рубрика Программирование, компьютеры и кибернетика
Вид статья
Язык украинский
Дата добавления 03.02.2023
Размер файла 825,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Державний університет інфраструктури та технологій

Деякі аспекти автоматизованого впровадження залежностей у мові РНР

Ткаченко Ольга, кандидат фізико-математичних наук, доцент кафедри інформаційних технологій та дизайну,

Русаков Микита, магістрант, кафедра інформаційних технологій та дизайну

Київ, Україна

Анотація

Метою статті є дослідження, аналіз і розгляд загальних проблем і перспектив використання принципу впровадження залежностей під час розробки вебзастосунків мовою РНР.

Методами дослідження є методи семантичного аналізу основних понять цієї предметної сфери (вебтехнології та вебзастосунки). У статті розглянуто відомі підходи до інверсії управління на основі використання шаблону впровадження залежностей.

Новизною проведеного дослідження є розв'язання проблем інверсії управління на основі шаблону під час проєктування вебзастосунків.

Висновки. Проаналізовано наявні проблеми та перспективи застосування принципу впровадження залежностей у вебзастосунках, що мають програмний код, написаний мовою РНР. Враховуючи результати проведеного аналізу, розроблено систему автоматизації впровадження залежностей, яка має важливе значення для розв'язання проблем підвищення ефективності процесів розробки вебзастосунків мовою РНР.

Ключові слова: вебзастосунок; проєктування вебзастосунків; упровадження залежностей; РНР; ECMAScript; JavaScript.

Abstract

Tkachenko Olha,

PhD in Physical and Mathematical Sciences,

Associate Professor, Department of Information Technologies and Design,

State University of Infrastructure and Technology,

Kyiv, Ukraine

Rusakov Mykyta,

Master's student,

Department of Information Technologies and Design,

State University of Infrastructure and Technology,

Kyiv, Ukraine

SOME ASPECTS OF AUTOMATED IMPLEMENTATION OF DEPENDENCIES IN PHP LANGUAGE

The purpose of the article is to research, analyze and consider the general problems and prospects of using the principle of implementing dependencies in the development of web applications in the PHP language.

Research methods are methods of semantic analysis of the basic concepts of this subject area (web technologies and web applications). The article considers the existing approaches to control inversion based on the use of the dependency implementation template.

The novelty of the research is to solve the control inversion problems based on a template when designing web applications.

The conclusion of the research conducted in the article is that the existing problems and prospects for the application of the principle of dependency implementation in web applications with program code written in PHP have been analyzed. Taking into account the results of the analysis, the authors have developed a system for automating the implementation of dependencies, which is important for solving problems of improving the efficiency of web application development processes in PHP.

Keywords: web application; web application design; dependency implementation; PHP; ECMAScript; JavaScript.

Аннотация

Ткаченко Ольга,

кандидат физико-математических наук,

доцент кафедры информационных технологий и дизайна,

Государственный университет инфраструктуры и технологий,

Киев, Украина

Русаков Никита,

магистрант, кафедра информационных технологий и дизайна,

Государственный университет инфраструктуры и технологий,

Киев, Украина

НЕКОТОРЫЕ АСПЕКТЫ АВТОМАТИЗИРОВАННОГО ВНЕДРЕНИЯ ЗАВИСИМОСТЕЙ В ЯЗЫКЕ РНР

Целью статьи является исследование, анализ и рассмотрение общих проблем и перспектив использования принципа внедрения зависимостей при разработке веб-приложений на языке РНР.

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

Новизной проведенного исследования является решение проблем инверсии управления на основе шаблона при проектировании веб-приложений.

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

Ключевые слова: веб-приложение; проектирование веб-приложений; внедрение зависимостей; РНР; ECMAScript; JavaScript.

Вступ. Розвиток вебтехнологій зумовлює розв'язання складних і комплексних проблем як на сервері, так і на фронт-енді. У першому випадку для реалізації є багато рішень (наприклад, JavaScript). Крім того почали розвиватися мови програмування для розробки вебзастосунків, з'явилися нові специфікації ECMAScript (Kulkarni).

У статті пропонуємо розглянути реалізацію принципу програмування Інверсія управління (Inversion of Control), який застосовує в процесі такий шаблон проєктування, як Впровадження залежностей (Dependency Injection). Під час реалізації такого підходу до проєктування вебзастосунків виникає багато проблем, пов'язаних як із сервером, так і з клієнтом (проблеми server, front-end, back-end).

Тому актуальність проблеми застосування принципу інверсії та впровадження залежностей не викликає сумнівів. Для розкриття вказаної вище проблеми введемо декілька визначень основних понять, які пропонуємо до розгляду.

Інверсія управління - принцип програмування, що передбачає передачу керуванням потоком (викликом команд) конкретній реалізації цього підходу (фреймворком), що є зовнішньою щодо коду вебзастосунку розробника (Kukurba, 2019; Инверсия и внедрение зависимостей, 2021).

Уживання поняття фреймворку чи каркаса обумовлено тим, що розробник використовує його під час реєстрації частини свого коду (методів, класів, модулів, процедур тощо), і цей фреймворк/каркас може визначати, коли викликати той чи той компонент програмного коду вебзастосунку.

Залежність (Dependency) - об'єкт, або будь-який програмний unit, що використовується в клієнті - іншому об'єкті / програмному unit (Kukurba, 2019; Инверсия и внедрение зависимостей, 2021). Часто такий об'єкт використовується в різних місцях ІТ-проєкту (наприклад, у вебзастосунку чи вебзастосуванні).

Упровадження залежностей - один з підходів для реалізації інверсії управління через композицію залежностей у тому чи тому залежному unit (Dependency Injection (Внедрение зависимостей); Русаков, 2017). Є декілька варіантів упровадження залежностей, зокрема через конструктор (у такому разі залежність передається як окремий параметр у відповідному методі конструктора), сеттер, інтерфейс.

Результати дослідження. Упровадження залежностей - шаблон проєктуван- ня програмного забезпечення на основі використання парадигми об'єктно-орі- єнтованого програмування (Что такое внедрение зависимостей и как это использовать в разработке?; Dependency Injection (Внедрение зависимостей)). Такий шаблон передбачає надання зовнішньої залежності програмному компоненту, використовуючи інверсію управління для отримання залежностей.

Використання цього шаблону програмування (це стосується й мови програмування PHP) можна означити за допомогою, зокрема, таких сутностей (Русаков, 2017; PHP Инъекция Зависимостей):

клас, який упроваджує сервіси;

створюваний об'єкт;

сервіси, які впроваджуються.

У створюваному об'єкті під час його проєктування слід уникати створення додаткових об'єктів напряму, натомість необхідно передати цю властивість сторонньому сервісу, який створюватиме потрібні для роботи створюваного об'єкта сервіси та передаватиме його в конструктор нового класу.

Отже, під час створення проєкту за допомогою впровадження залежності слід передбачити впровадження всіх об'єктів сервісів, які необхідні для створення нового класу (PHP Инъекция Зависимостей).

Наприклад, маємо клас А (рис. 1). Клас А має метод sayHi(), завдання якого вивести рядок «Hello World» (цей приклад часто наводиться під час опису багатьох мов об'єктно-орієнтованого програмування). Такий клас не має задекларованих методів будування необхідного рядка, але використовує сервіси B та C (рис. 2), які мають необхідні для виводу методи. Якщо викликати вищеописаний метод класу

А, то під час роботи буде отримана фатальна помилка, яка повідомлятиме, що необхідні сервіси не були включені, отже, слід продовжити проектувати систему.

Рис. 1. Код для опису класу А

Для реалізації системи впровадження залежностей треба реалізувати сервіс- упроваджувач. Назвемо цей сервіс (для прикладу, що розглядаємо) ObjectManager. Для цих класів треба ввести декілька важливих зауважень:

ObjectManager повинен мати два основних методи - get() та create();

усі методи цього сервісу мають бути доступні без використання об'єктів, отже, виклик цих методів має бути статичним;

обидва методи мають повертати готові об'єкти класів;

після створення сервісу, виконавши необхідну модифікацію, буде отримано результат, показаний на рис. 3. Сервіс має змінну $objectPull типу масив. Ця змінна необхідна для того, щоб не створювалися нові об'єкти одного й того ж самого класу.

Рис. 2. Код для опису класів B і C

Рис. 3. Простий сервіс створення об'єктів

Кожен новий об'єкт після створення заноситься до цієї змінної як елемент масиву і за нової спроби створити новий об'єкт спочатку перевіряється його наявність у системі. Уже зараз можливо побачити один з недоліків такого шаблону - якщо використовується велика кількість різних класів, наприклад більше однієї тисячі, то система буде опрацьовувати всю інформацію повільніше, але все ж таки швидше, ніж створення нових об'єктів без збереження вже наявних.

Оскільки об'єктно-орієнтоване програмування в РНР реалізовано за допомогою простору імен, то змінна $className, яку можна побачити у створених методах, під час використання буде містити рядок виду «Path\To\Class» і допомагатиме створювати нові об'єкти.

На сьогодні проєктування системи Менеджер об'єктів може створювати лише об'єкти тих класів, що не мають залежностей, тому необхідно допрацювати його методи. Для подальшого проєктування сервісу зі створення об'єктів класів буде використовуватися насамперед шаблон програмування «Однак» (англ. Singleton). Під час проєктування будь-якої системи, у тому числі й вебзастосунку, розробленого засобами мови РНР, за шаблоном «Однак» слід узяти до уваги, що вся робота із системою буде вестися за допомогою одного об'єкта класу, тобто за допомогою одного об'єкта будуть створюватися та працювати всі інші підсистеми.

Для перетворення класу ObjectManager в одинака слід додати до нього ще один метод - getInstance(). Цей метод є статичним, що сприяє його виклику без створення об'єкта; у результаті отримаємо одну змінну, яка охоплюватиме всі об'єкти, що були створені під час роботи в системі (рис. 4).

Рис. 4. Метод отримання об'єкта-одинака

Рис. 5. Зчитувач конструктора

Наступним кроком у вдосконаленні сервісу зі створення об'єктів є проектування підсистеми, яка б дала змогу отримувати зі створюваного об'єкта класу його залежності, а також їх створення. Для цього завдання треба створити так званий підсервіс, який назвемо ConstructorDefinitionReader - зчитувач залежностей з конструктора класу створюваного об'єкта (рис. 5). Для того щоб отримати аргументи конструктора класу створюваного об'єкта використовується стандартна бібліотека мови РНР «Reflection». Ця бібліотека дає змогу отримати всю інформацію про клас, обходячи інкапсуляцію. Хоча вищезгадана бібліотека охоплює значну кількість функціоналу, для створення зчитувача буде використана лише та її частина, яка дає змогу працювати з аргументами конструктора. Для отримання параметрів у зчитувачі був створений метод read(), який у результаті роботи повертатиме масив аргументів, та їхні імена класів. Після створення зчитувача треба доповнити клас ObjectManager, а саме додати в його конструктор декларацію зчитувача та впровадити цей зчитувач під час створення його об'єкта (рис. 6, рис. 7).

Рис. 6. Удосконалення конструктора

Такі вдосконалення дадуть змогу уникнути помилок під час першого створення об'єкта-одинака.

Рис. 7. Удосконалення методу getInstance()

Тепер слід доробити метод create() менеджера об'єктів, що проектується. Який на вигляд цей метод, можна побачити на рис. 3, після деяких удосконалень метод матиме такий вигляд (рис. 8).

Код, наведений на рис. 8, охоплюючи номери рядків, описує вдосконалений метод, який стає надто складним для швидкого розуміння, і тому виникає необхідність пояснення кожного рядка. На 70 рядку зчитувач конструктора перевіряє аргументи конструктора створюваного класу та повертає масив його значень. На наступному рядку створюється змінна, що являє собою стек. її використання описано нижче.

Рис. 8. Удосконалення методу створення об'єктів

На 71 рядку використовується глобальна для класу менеджера змінна $creationStack, яка є буфером для уникнення циклічної залежності.

Циклічна залежність (англ. Cyclomatic dependency) - логічна помилка, яка виникає тоді, коли серед аргументів створюваного об'єкта класу є клас, в аргументах конструктора якого перебуває залежність на створюваний клас (рис. 9). вебзастосунок інверсія шаблон

Обробка спроєктованих таким чином класів будь-яким кодом автоматичного створення об'єктів залежностей приведе до нескінченної рекурсії та врешті-решт закінчиться «зависанням» сервера через вичерпання його ресурсів.

У циклі (із 74 рядка по 80) перевіряється можливість циклічної залежності та, якщо її не виявлено, викликається метод отримання (рис. 4) об'єкта для кожного класу з аргументу конструктора.

Рис. 9. Приклад циклічної залежності

Таким чином отримується рекурсія створення нових об'єктів, які необхідні для класу, та унеможливлюється створення копій об'єктів, які вже наявні в системі. На останніх рядках виключається перевірка циклічної залежності та створюється об'єкт класу з передачею всіх необхідних аргументів. Тепер для перевірки роботи менеджера об'єктів слід створити такий набір класів:

клас HelloWorld (рис. 12), який виводитиме текст «Hello World»;

клас Writer (рис. 11), який виконує роль записувача тексту;

клас Dictionary (рис. 10), роль якого - надання необхідного тексту.

Для створення об'єкта кожного класу необхідно передати до нього попередньо створений об'єкт залежного класу.

Рис. 10. Клас словника

Рис. 11. Клас записувача тексту

Рис. 12. Основний клас перевірки

Без використання менеджера об'єктів за тим же проектуванням довелося б створювати все вручну. Тепер слід додати ще декілька рядків в основний файл сервера для перевірки дії менеджера об'єктів (рис. 13).

Рис. 13. Код перевірки роботи менеджера об'єктів

Насамкінець слід викликати метод зі створеного об'єкта й отримати результат (рис. 14).

Рис. 14. Результат тестування

Наприкінці необхідно зауважити, що як і в будь-якому шаблоні програмування у впровадженні залежностей є свої переваги та недоліки (Контейнер внедрения зависимостей (DI) в PHP). Щодо переваг, то можемо зазначити, зокрема, такі:

швидке створення комплекту об'єктів для утворення будь-якого об'єкта в системі;

зручне проєктування класів системи;

використання раніше створених об'єктів, виключаючи їх дублювання;

можливість комбінувати з майже будь-яким шаблоном.

Щодо недоліків, то можемо навести, зокрема, такі:

значні вимоги до правильності проєктування нових класів системи;

за умови неуважного використання дуже просто зробити логічну помилку;

швидкодія знижується, якщо класів, що оброблюються, стає занадто багато (наприклад, більше ніж 5000 одиниць);

можливість у разі необхідності спеціально створювати копії об'єктів.

Висновки

Проаналізовано наявні проблеми та перспективи застосування підходу до впровадження залежностей під час розробки складних систем, у тому числі й вебзастосунків.

Ураховуючи результати проведеного аналізу, розроблено систему автоматизації впровадження залежностей, яка має важливе значення для розв'язання проблем підвищення ефективності процесів розробки вебзастосунків мовою РНР.

Таким чином шаблон програмування «Впровадження залежності» (як описане вище рішення) можна інтегрувати в будь-який новий проєкт без значної зміни його логіки. З цим шаблоном зручно працювати під час розробки рішень, що на ньому базуються.

Список посилань

1. Инверсия и внедрение зависимостей, 2021. Distillery Tech, [online] 10 февраля 2021.

2. Контейнер внедрения зависимостей (DI) в PHP. Русские Блоги. [online] Доступно: <> [Дата обращения 03 октября 2021].

3. PHP Инъекция Зависимостей. CodeRoad, [online] 08 апреля 2012.

4. Русаков, М., 2017. Что такое внедрение зависимостей в PHP. MyRusakov.ru, [online] 15 августа 2017.

5. Что такое внедрение зависимостей и как это использовать в разработке? AppTractor, 12 января 2021.

6. Dependency Injection (Внедрение зависимостей). PHP Portal.

7. Kukurba, V., 2019. Dependency Injection and Inversion of Control in JavaScript. Medium, [online] 8 September 2019.

8. Kulkarni, K. ES3 ECMAScript (ES7 + ES8 + ES9 + ES10) New Features - Javascrip. Blog Post.

References

1. Chto takoe vnedrenie zavisimostei i kak eto ispolzovat v razrabotke? [What is Dependency Injection and how can I use it in development?]. AppTractor, 12 January 2021.

2. Dependency Injection (Vnedrenie zavisimostei). PHP Portal.

3. Inversiia i vnedrenie zavisimostei [Dependency Inversion and Injection], 2021. Distillery Tech, [online] 10 February 2021.

4. Konteiner vnedreniia zavisimostei (DI) v PHP [PHP Dependency Injection (DI) container]. Russian Blogs.

5. Kukurba, V., 2019. Dependency Injection and Inversion of Control in JavaScript. Medium, [online] 8 September 2019.

6. Kulkarni, K. ES3 ECMAScript (ES7 + ES8 + ES9 + ES10) New Features - Javascrip. Blog Post.

7. PHP Inektciia Zavisimostei [PHP Dependency Injection]. CodeRoad, [online] 08 April 2012.Rusakov, M., 2017. Chto takoe vnedrenie zavisimostei v PHP [What is Dependency Injection in PHP]. MyRusakov.ru, [online] 15 August 2017.

Размещено на Allbest.ru

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.