#полезное
😊 TwigStan — статический анализатор для Twig'а
Это статический анализатор для шаблонов Twig, основанный на PHPStan. Он предназначен для выявления ошибок в шаблонах Twig на этапе разработки, что способствует повышению качества и надежности кода. Инструмент компилирует шаблоны Twig в PHP-код, оптимизирует его для лучшего анализа и сообщает об ошибках, указывая исходный шаблон и номер строки, где возникла проблема.
Гитхаб
👉 Новости 👉 Платформа
Это статический анализатор для шаблонов Twig, основанный на PHPStan. Он предназначен для выявления ошибок в шаблонах Twig на этапе разработки, что способствует повышению качества и надежности кода. Инструмент компилирует шаблоны Twig в PHP-код, оптимизирует его для лучшего анализа и сообщает об ошибках, указывая исходный шаблон и номер строки, где возникла проблема.
Гитхаб
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Как РНР обрабатывает отчёты об ошибках?
PHP обрабатывает ошибки с помощью функции
👉 Новости 👉 Платформа
PHP обрабатывает ошибки с помощью функции
error_reporting()
, которая задаёт уровень отчётности, и директивы display_errors
, контролирующей вывод ошибок. Для логирования ошибок используется log_errors
. Для кастомной обработки ошибок можно использовать функции set_error_handler()
и set_exception_handler()
. В производственной среде рекомендуется отключать вывод ошибок и включать логирование.Please open Telegram to view this post
VIEW IN TELEGRAM
YeaHub
YeaHub — тренажер собеседований по IT
5000+ вопросов для подготовки к интервью. Фильтры, квизы, статистика!
#вакансии
👨💻 Junior php-разработчик
Удаленно (Москва)
Motivity — это HR-tech сервис с готовой методологией.
Требования
🟠 Ты хорошо понимаешь ООП;
🟠 У тебя есть понимание и практика применения SOLID;
🟠 Хорошее знание PHP 8.1+;
🟠 Хорошее знание Symfony 5.4+ (Forms, Validator, Security, DI, EventDispatcher, Messenger, Console, Serrialization, Cache, Doctrine, Twig).
Подробнее о вакансии
👉 Новости 👉 Платформа
Удаленно (Москва)
Motivity — это HR-tech сервис с готовой методологией.
Требования
Подробнее о вакансии
Please open Telegram to view this post
VIEW IN TELEGRAM
Habr
Вакансия «Junior php-разработчик (symfony)», удаленно, работа в компании «Motivity» — Хабр Карьера
Вакансия «Junior php-разработчик (symfony)», удаленно, работа в компании «Motivity». Полная занятость. Можно удаленно.
Когда-нибудь приходилось ограничивать частоту выполнения задач?
Будь то защита API от перегрузки или ограничение количества задач для пользователей бесплатного тарифа, Laravel позволяет легко задавать лимиты и использовать их прямо из коробки
Please open Telegram to view this post
VIEW IN TELEGRAM
#статьи
🥺 Секреты стройности монолита: подходы по снятию нагрузки с БД
Статья описывает, как команда Яндекс Еды оптимизировала свой монолитный PHP-сервис, снизив нагрузку на MySQL
Основные проблемы включали высокую загрузку CPU и памяти, сложность управления изменениями в структуре базы данных и срабатывание механизма Flow Control в Galera Cluster, что приводило к задержкам и сбоям в обслуживании запросов.
Для решения этих проблем команда распределила ответственность за таблицы между командами, анализировала медленные запросы с помощью утилиты pt-query-digest и внедрила различные оптимизации, включая использование кэширования и денормализацию данных
В результате удалось значительно снизить нагрузку на базу данных и улучшить производительность системы
Читать статью
👉 Новости 👉 Платформа
Статья описывает, как команда Яндекс Еды оптимизировала свой монолитный PHP-сервис, снизив нагрузку на MySQL
Основные проблемы включали высокую загрузку CPU и памяти, сложность управления изменениями в структуре базы данных и срабатывание механизма Flow Control в Galera Cluster, что приводило к задержкам и сбоям в обслуживании запросов.
Для решения этих проблем команда распределила ответственность за таблицы между командами, анализировала медленные запросы с помощью утилиты pt-query-digest и внедрила различные оптимизации, включая использование кэширования и денормализацию данных
В результате удалось значительно снизить нагрузку на базу данных и улучшить производительность системы
Читать статью
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Как описать паттерн Наблюдатель (Observer) ?
Паттерн Наблюдатель - это поведенческий паттерн проектирования, в котором объект (субъект) уведомляет другие объекты (наблюдатели) о изменении своего состояния. Это полезно для реализации систем обработки событий. В РНР паттерн Наблюдатель может быть реализован с помощью интерфейсов
👉 Новости 👉 Платформа
Паттерн Наблюдатель - это поведенческий паттерн проектирования, в котором объект (субъект) уведомляет другие объекты (наблюдатели) о изменении своего состояния. Это полезно для реализации систем обработки событий. В РНР паттерн Наблюдатель может быть реализован с помощью интерфейсов
SplObserver
и SplSubject
из стандартной библиотеки.Please open Telegram to view this post
VIEW IN TELEGRAM
#статьи
😊 Общение с умными устройствами силами PHP
Каждый день мы сталкиваемся с более новыми и умными устройствами, управляемыми через интернет или Wi-Fi. Концепция IoT (Internet of Things) объединяет физические устройства в одну сеть для передачи данных и управления ими. И, оказывается, что интернет вещей — никакое не ограничение! Управлять устройствами в сети можно с помощью легковесного протокола MQTT.
Хабр
👉 Новости 👉 Платформа
Каждый день мы сталкиваемся с более новыми и умными устройствами, управляемыми через интернет или Wi-Fi. Концепция IoT (Internet of Things) объединяет физические устройства в одну сеть для передачи данных и управления ими. И, оказывается, что интернет вещей — никакое не ограничение! Управлять устройствами в сети можно с помощью легковесного протокола MQTT.
Хабр
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Общение с умными устройствами силами PHP
Умные устройства окружают нас повседневно и не только в быту: датчики, бытовые приборы, лампочки, розетки и другая техника. Каждый день мы сталкиваемся с более новыми и умными устройствами,...
#ЛитКод
Задача: 679. 24 Game
Дан массив целых чисел cards длиной 4. У вас есть четыре карты, каждая из которых содержит число в диапазоне от 1 до 9. Вам нужно расположить числа на этих картах в математическом выражении, используя операторы ['+', '-', '*', '/'] и скобки '(' и ')' так, чтобы получить значение 24.
Вы ограничены следующими правилами:
Оператор деления '/' представляет собой реальное деление, а не целочисленное деление.
Например, 4 / (1 - 2 / 3) = 4 / (1 / 3) = 12.
Каждая операция выполняется между двумя числами. В частности, мы не можем использовать '-' как унарный оператор.
Например, если cards = [1, 1, 1, 1], выражение "-1 - 1 - 1 - 1" не допускается.
Вы не можете объединять числа вместе.
Например, если cards = [1, 2, 1, 2], выражение "12 + 12" недопустимо.
Вернуть true, если вы можете получить такое выражение, которое оценивается в 24, и false в противном случае.
Пример:
👨💻 Алгоритм:
1⃣ Создайте функцию generatePossibleResults(a, b), которая возвращает массив результатов всех возможных математических операций над двумя числами.
2⃣ Создайте функцию checkIfResultReached(list), чтобы проверить, можем ли мы достичь результата 24, используя текущий массив list. Сначала проверьте базовые условия: если размер массива равен 1, верните true, если результат равен 24, иначе верните false.
3⃣ Если размер массива больше 1, выберите любые два числа из списка, выполните все математические операции над ними, создайте новый список с обновленными элементами и снова вызовите рекурсивную функцию с этим новым списком. Если ни одна комбинация не приводит к результату 24, верните false. Вызовите checkIfResultReached с исходным списком карт.
😎 Решение:
👉 Новости 👉 База вопросов
Задача: 679. 24 Game
Дан массив целых чисел cards длиной 4. У вас есть четыре карты, каждая из которых содержит число в диапазоне от 1 до 9. Вам нужно расположить числа на этих картах в математическом выражении, используя операторы ['+', '-', '*', '/'] и скобки '(' и ')' так, чтобы получить значение 24.
Вы ограничены следующими правилами:
Оператор деления '/' представляет собой реальное деление, а не целочисленное деление.
Например, 4 / (1 - 2 / 3) = 4 / (1 / 3) = 12.
Каждая операция выполняется между двумя числами. В частности, мы не можем использовать '-' как унарный оператор.
Например, если cards = [1, 1, 1, 1], выражение "-1 - 1 - 1 - 1" не допускается.
Вы не можете объединять числа вместе.
Например, если cards = [1, 2, 1, 2], выражение "12 + 12" недопустимо.
Вернуть true, если вы можете получить такое выражение, которое оценивается в 24, и false в противном случае.
Пример:
Input: cards = [4,1,8,7]
Output: true
Explanation: (8-4) * (7-1) = 24
class Solution {
function generatePossibleResults($a, $b) {
$res = [$a + $b, $a - $b, $b - $a, $a * $b];
if ($a != 0) $res[] = $b / $a;
if ($b != 0) $res[] = $a / $b;
return $res;
}
function checkIfResultReached($list) {
if (count($list) == 1) return abs($list[0] - 24) <= 0.1;
for ($i = 0; $i < count($list); $i++) {
for ($j = $i + 1; $j < count($list); $j++) {
$newList = [];
for ($k = 0; $k < count($list); $k++) {
if ($k != $i && $k != $j) $newList[] = $list[$k];
}
foreach ($this->generatePossibleResults($list[$i], $list[$j]) as $res) {
$newList[] = $res;
if ($this->checkIfResultReached($newList)) return true;
array_pop($newList);
}
}
}
return false;
}
function judgePoint24($cards) {
return $this->checkIfResultReached(array_map('floatval', $cards));
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 Общие табличные выражения (CTE) в MySQL позволяют писать более чистые и удобные для поддержки запросы, создавая временные именованные наборы результатов.
Вместо вложенных подзапросов CTE можно использовать во многих случаях
👉 Новости 👉 База вопросов
Вместо вложенных подзапросов CTE можно использовать во многих случаях
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Как реализовать RESTful API в РНР?
RESTful API строится на основе НТТР-методов (GET, POST, PUT, DELETE) и позволяет управлять ресурсами с помощью URI. В PHP обработка запросов осуществляется через маршруты, где каждый маршрут привязан к определенному ресурсу и методу. Для обеспечения безопасности используются токены, а ответы обычно возвращаются в формате JSON.
👉 Новости 👉 Платформа
RESTful API строится на основе НТТР-методов (GET, POST, PUT, DELETE) и позволяет управлять ресурсами с помощью URI. В PHP обработка запросов осуществляется через маршруты, где каждый маршрут привязан к определенному ресурсу и методу. Для обеспечения безопасности используются токены, а ответы обычно возвращаются в формате JSON.
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 Использование Laravel Tinker в Chrome DevTools
Статья о том, как интегрировать Laravel Tinker с Chrome DevTools для более удобной отладки и тестирования кода прямо в браузере.
Это позволяет быстрее проверять и экспериментировать с кодом Laravel, используя привычные инструменты Chrome.
Читать статью
👉 Новости 👉 База вопросов
Статья о том, как интегрировать Laravel Tinker с Chrome DevTools для более удобной отладки и тестирования кода прямо в браузере.
Это позволяет быстрее проверять и экспериментировать с кодом Laravel, используя привычные инструменты Chrome.
Читать статью
Please open Telegram to view this post
VIEW IN TELEGRAM
#вакансии
👨💻 PHP Developer (Middle/Senior)
200 000 — 400 000 ₽
Удаленно (Москва)
Marfatech — компания, которая разрабатывает собственные высокотехнологичные продукты в сфере Digital-маркетинга, Data Science и BI-аналитики.
Требования
🔵 Знание ООП, PHP, MySQL.
🔵 Опыт работы с Symfony желателен.
🔵 Уверенное владение паттернами проектирования.
🔵 Использование систем контроля версий (Git).
Подробнее о вакансии
👉 Новости 👉 База вопросов
200 000 — 400 000 ₽
Удаленно (Москва)
Marfatech — компания, которая разрабатывает собственные высокотехнологичные продукты в сфере Digital-маркетинга, Data Science и BI-аналитики.
Требования
Подробнее о вакансии
Please open Telegram to view this post
VIEW IN TELEGRAM
getmatch.ru
Вакансия PHP Developer, работа в Marfatech, удалённо, в Москве — getmatch
Вакансия PHP Developer, работа в компании Marfatech, Москва (офис или гибрид) или полная удаленка — на выбор. Зарплата: 200 000 — 400 000 ₽/мес на руки. Дата публикации: 19.06.2025.
#полезное
😊 Новый тренажёр по SQL
Разработчик создал SQL Noir — интерактивную детективную игру, где расследования ведутся с помощью SQL-запросов.
Погружаешься в сюжет и решаешь загадки с реальными SQL-запросами.
Ссылка
👉 Новости 👉 База вопросов
Разработчик создал SQL Noir — интерактивную детективную игру, где расследования ведутся с помощью SQL-запросов.
Погружаешься в сюжет и решаешь загадки с реальными SQL-запросами.
Ссылка
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Как использовать filter_var в РНР?
👉 Новости 👉 Платформа
filter_var
- это универсальная функция для проверки и фильтрации данных. С её помощью можно валидировать email, URL или IP-адреса, а также очищать строки или числа. Это упрощает защиту приложения от некорректных данных и снижает риск атак.Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 Psl
Современный, централизованный, хорошо типизированный, неблокируемый набор API
Библиотека представляет собой современную, согласованную, централизованную и строго типизированную стандартную библиотеку для PHP. Ее цель — предоставить разработчикам PHP набор неблокирующих API, которые упрощают и стандартизируют выполнение общих задач, таких как работа со строками, массивами, генерация случайных чисел и другие операции.
Использование этой библиотеки может поспособствовать повышению качества и читаемости кода, обеспечивая единообразие и надежность при решении повседневных задач.
Гитхаб
👉 Новости 👉 База вопросов
Современный, централизованный, хорошо типизированный, неблокируемый набор API
Библиотека представляет собой современную, согласованную, централизованную и строго типизированную стандартную библиотеку для PHP. Ее цель — предоставить разработчикам PHP набор неблокирующих API, которые упрощают и стандартизируют выполнение общих задач, таких как работа со строками, массивами, генерация случайных чисел и другие операции.
Использование этой библиотеки может поспособствовать повышению качества и читаемости кода, обеспечивая единообразие и надежность при решении повседневных задач.
Гитхаб
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
👍 Использование хелперов даты в конструкторе запросов Laravel
В Laravel версии 11.42 были добавлены новые методы построителя запросов(Query Builder), позволяющие работать с относительными датами. Эти методы повышают читаемость и упрощают написание условий, связанных с датами, в ваших моделях.
Ранее, для фильтрации записей по дате, приходилось явно указывать операторы сравнения и использовать функции, такие как
Новые методы, такие как
Официальный сайт
👉 Новости 👉 База вопросов
В Laravel версии 11.42 были добавлены новые методы построителя запросов(Query Builder), позволяющие работать с относительными датами. Эти методы повышают читаемость и упрощают написание условий, связанных с датами, в ваших моделях.
Ранее, для фильтрации записей по дате, приходилось явно указывать операторы сравнения и использовать функции, такие как
now()
. Это могло приводить к менее читаемому и более громоздкому коду.Новые методы, такие как
whereNowOrPast
, whereFuture
, whereAfterToday
, orWhereBeforeToday
и другие, позволяют писать более лаконичный и понятный код для работы с датами. Они инкапсулируют логику сравнения дат, делая код более выразительным и легким для понимания.Официальный сайт
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
🤯 Mago
Комплексная цепочка инструментов для PHP, которая помогает разработчикам писать более качественный код.
Вдохновленный экосистемой Rust, Mago привносит удобство, надежность и уникальный опыт разработчиков в PHP-проекты любого размера.
Фишки
🟠 Анализ и подсветка: выявление проблем в коде с помощью настраиваемых правил и плагинов.
🟠 Автоматические исправления: Применяйте исправления к проблемам, связанным с линтингом, для поддержания чистоты кодовой базы.
🟠 Последовательное форматирование: Стандартизируйте стиль кода с помощью мощных инструментов форматирования.
🟠 Семантические проверки: Убедитесь в корректности кода с помощью надежного семантического анализа.
🟠 Визуализация AST: Изучите структуру кода с помощью разбора абстрактного синтаксического дерева (AST).
Установка через curl в одну строку:
Гитхаб
👉 Новости 👉 База вопросов
Комплексная цепочка инструментов для PHP, которая помогает разработчикам писать более качественный код.
Вдохновленный экосистемой Rust, Mago привносит удобство, надежность и уникальный опыт разработчиков в PHP-проекты любого размера.
Фишки
Установка через curl в одну строку:
curl --proto '=https' --tlsv1.2 -sSf https://carthage.software/mago.sh | bash
Гитхаб
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - carthage-software/mago: Mago is a toolchain for PHP that aims to provide a set of tools to help developers write better…
Mago is a toolchain for PHP that aims to provide a set of tools to help developers write better code. - carthage-software/mago
#Собес
🤔 Что такое Composer и как его использовать?
Composer - это менеджер зависимостей для РНР, позволяющий добавлять библиотеки в проект и управлять их версиями. Он автоматически загружает нужные пакеты и создаёт автозагрузчик для их использования.
👉 Новости 👉 Платформа
Composer - это менеджер зависимостей для РНР, позволяющий добавлять библиотеки в проект и управлять их версиями. Он автоматически загружает нужные пакеты и создаёт автозагрузчик для их использования.
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЛитКод
Задача: 437. Path Sum III
Дан корень бинарного дерева и целое число targetSum, вернуть количество путей, где сумма значений вдоль пути равна targetSum.
Путь не обязательно должен начинаться или заканчиваться в корне или на листе, но он должен идти вниз (т.е. перемещаться только от родительских узлов к дочерним).
Пример:
👨💻 Алгоритм:
1⃣ Инициализируем счетчик путей в дереве count = 0 и хеш-таблицу h, где ключ - это префиксная сумма, а значение - сколько раз она встречалась. Выполним рекурсивный обход дерева в порядке preorder: узел -> левый -> правый. Функция preorder(node: TreeNode, curr_sum: int) принимает два аргумента: узел дерева и префиксную сумму перед этим узлом. Чтобы запустить рекурсию, вызовем preorder(root, 0).
2⃣ Сначала обновим текущую префиксную сумму, добавив значение текущего узла: curr_sum += node.val. Теперь можно обновить счетчик. Рассмотрим две ситуации. В первой ситуации путь в дереве с целевой суммой начинается с корня. Это означает, что текущая префиксная сумма равна целевой сумме curr_sum == k, поэтому увеличиваем счетчик на 1: count += 1. Во второй ситуации путь с целевой суммой начинается где-то ниже. Это означает, что нужно добавить к счетчику количество раз, когда мы видели префиксную сумму curr_sum - target: count += h[curr_sum - target].
3⃣ Логика проста: текущая префиксная сумма - это curr_sum, а несколько элементов назад префиксная сумма была curr_sum - target. Все элементы между ними суммируются до curr_sum - (curr_sum - target) = target. Теперь обновим хеш-таблицу: h[curr_sum] += 1. Проанализируем левое и правое поддеревья: preorder(node.left, curr_sum), preorder(node.right, curr_sum). После обработки текущего поддерева удалим текущую префиксную сумму из хеш-таблицы, чтобы не смешивать параллельные поддеревья: h[curr_sum] -= 1. Когда обход в порядке preorder завершен, счетчик обновлен. Вернем его.
😎 Решение:
👉 Новости 👉 База вопросов
Задача: 437. Path Sum III
Дан корень бинарного дерева и целое число targetSum, вернуть количество путей, где сумма значений вдоль пути равна targetSum.
Путь не обязательно должен начинаться или заканчиваться в корне или на листе, но он должен идти вниз (т.е. перемещаться только от родительских узлов к дочерним).
Пример:
Input: root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
Output: 3
Explanation: The paths that sum to 8 are shown.
class Solution {
function pathSum($root, $sum) {
$count = 0;
$k = $sum;
$h = [];
$preorder = function($node, $curr_sum) use (&$preorder, &$count, &$h, $k) {
if (!$node) return;
$curr_sum += $node->val;
if ($curr_sum == $k) {
$count++;
}
$count += $h[$curr_sum - $k] ?? 0;
$h[$curr_sum] = ($h[$curr_sum] ?? 0) + 1;
$preorder($node->left, $curr_sum);
$preorder($node->right, $curr_sum);
$h[$curr_sum]--;
};
$preorder($root, 0);
return $count;
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
#статьи
😬 Как организовать структуру приложения
Структура кода — это не просто способ организации файлов и папок в проекте, это фундаментальный аспект разработки, который влияет на её эффективность, качество, и долгосрочную поддержку. Красиво организованный код облегчает понимание, упрощает внедрение новых функций и снижает вероятность ошибок. Независимо от масштаба проекта, будь то небольшое приложение или сложная система, структурированный подход к организации кода способствует снижению рисков, связанных с техническим долгом, и повышает продуктивность команды разработчиков. Однако не все разработчики осознают, насколько велика разница между проектами с хорошо продуманной структурой и хаотично организованной.
В этой статье разбирается, что значит «понятная структура кода», и почему её наличие столь важно для успешной разработки.
Читать статью
👉 Новости 👉 База вопросов
Структура кода — это не просто способ организации файлов и папок в проекте, это фундаментальный аспект разработки, который влияет на её эффективность, качество, и долгосрочную поддержку. Красиво организованный код облегчает понимание, упрощает внедрение новых функций и снижает вероятность ошибок. Независимо от масштаба проекта, будь то небольшое приложение или сложная система, структурированный подход к организации кода способствует снижению рисков, связанных с техническим долгом, и повышает продуктивность команды разработчиков. Однако не все разработчики осознают, насколько велика разница между проектами с хорошо продуманной структурой и хаотично организованной.
В этой статье разбирается, что значит «понятная структура кода», и почему её наличие столь важно для успешной разработки.
Читать статью
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Как организовать структуру приложения
🔔 Введение Структура кода — это не просто способ организации файлов и папок в проекте, это фундаментальный аспект разработки, который влияет на её эффективность, качество, и долгосрочную поддержку....
#статьи
😊 Упакуйте свой код правильно
В предыдущей статье «Как организовать структуру приложения» рассматривались различные подходы к организации кода, включая монолитную архитектуру, многослойную архитектуру и принципы чистой архитектуры. Особое внимание уделялось важности понятной структуры кода, способствующей упрощению его понимания, внедрению новых функций и снижению вероятности ошибок. Были рассмотрены критерии понятности, такие как чёткое назначение файлов и папок, разделение логики по модулям или функциональным зонам, использование самодокументируемых названий и соблюдение стандартов кодирования. Также поднимались проблемы, возникающие при неструктурированной организации кода, включая сложность навигации, отсутствие модульности и нарушение принципов SOLID и GRASP.
Читать полностью
👉 Новости 👉 База вопросов
В предыдущей статье «Как организовать структуру приложения» рассматривались различные подходы к организации кода, включая монолитную архитектуру, многослойную архитектуру и принципы чистой архитектуры. Особое внимание уделялось важности понятной структуры кода, способствующей упрощению его понимания, внедрению новых функций и снижению вероятности ошибок. Были рассмотрены критерии понятности, такие как чёткое назначение файлов и папок, разделение логики по модулям или функциональным зонам, использование самодокументируемых названий и соблюдение стандартов кодирования. Также поднимались проблемы, возникающие при неструктурированной организации кода, включая сложность навигации, отсутствие модульности и нарушение принципов SOLID и GRASP.
Читать полностью
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Упакуйте свой код правильно
В предыдущей статье « Как организовать структуру приложения » обсуждались различные подходы к организации кода, включая монолитную архитектуру, многослойную архитектуру и принципы чистой архитектуры....