Пых
Photo
?-> вместо NullObject: по следам дискуссии
Предыдущий пост бурно и полезно обсудили, расписываю основные мысли.
"За" и "против" использования
➕ самый лаконичный способ до выхода PHP 8.1 (там можно будет использовать new для значений параметров по умолчанию);
➕ обходится дешевле в рантайме, так как в null-сценарии выполняется меньше кода (сразу оговорюсь, что это вообще сомнительный аргумент, в частности, трудно себе представить приложение без логгирования в продакшне);
➖ скрытый и "ненужный"
➖ NullObject — более корректное и универсальное с точки зрения ООП решение, null-safe подход может быть уместен только в нескольких случаях;
➖ на проекте без статического анализатора вероятность ошибки выше.
Также в Пыхтелке затронули очень важную тему: зависимости редко бывают опциональными. Действительно, nullable зависимости часто сигнализируют о нарушении SRP. Необязательные поведения лучше оформлять в виде декораторов или middleware — их легко включать и выключать, не изменяя код (см. OCP).
Что касается логгирования, его не всегда можно представить в виде декоратора. Зачастую полезная для логов информация инкапсулирована в реализации и не протекает через контракт. Скорее всего, в этом случае тоже где-то нарушается SRP, но добавление абстракции исключительно ради логгирования может быть неоправданным усложнением.
И последний нюанс: зачем вообще делать логгер опциональной зависимостью, если он всегда есть в контейнере? Мой ответ простой: лень. В юнит-тестах, не тестирующих само логгирование, не хочется каждый раз писать
Итак, теперь мы знаем, что можно вот так нестандартно использовать
Предыдущий пост бурно и полезно обсудили, расписываю основные мысли.
"За" и "против" использования
?->
для опциональных зависимостей:➕ самый лаконичный способ до выхода PHP 8.1 (там можно будет использовать new для значений параметров по умолчанию);
➕ обходится дешевле в рантайме, так как в null-сценарии выполняется меньше кода (сразу оговорюсь, что это вообще сомнительный аргумент, в частности, трудно себе представить приложение без логгирования в продакшне);
➖ скрытый и "ненужный"
if
;➖ NullObject — более корректное и универсальное с точки зрения ООП решение, null-safe подход может быть уместен только в нескольких случаях;
➖ на проекте без статического анализатора вероятность ошибки выше.
Также в Пыхтелке затронули очень важную тему: зависимости редко бывают опциональными. Действительно, nullable зависимости часто сигнализируют о нарушении SRP. Необязательные поведения лучше оформлять в виде декораторов или middleware — их легко включать и выключать, не изменяя код (см. OCP).
Что касается логгирования, его не всегда можно представить в виде декоратора. Зачастую полезная для логов информация инкапсулирована в реализации и не протекает через контракт. Скорее всего, в этом случае тоже где-то нарушается SRP, но добавление абстракции исключительно ради логгирования может быть неоправданным усложнением.
И последний нюанс: зачем вообще делать логгер опциональной зависимостью, если он всегда есть в контейнере? Мой ответ простой: лень. В юнит-тестах, не тестирующих само логгирование, не хочется каждый раз писать
new Service(/** required dependencies,
*/ new NullLogger())
☺️.Итак, теперь мы знаем, что можно вот так нестандартно использовать
?->
, но что это не всегда хорошая идея. Всем спасибо за комментарии!🔴 PHP 8.1 уже в эфире, подключайтесь!
https://youtu.be/5D337gaVPa4
Репо с кодом, который я показывал: https://github.com/vudaltsov/php81.
https://youtu.be/5D337gaVPa4
Репо с кодом, который я показывал: https://github.com/vudaltsov/php81.
YouTube
Релиз PHP 8.1, запуск PHP Foundation и истории переезда на 8.0
Обсудим апдейты нового релиза и новость о создании PHP Foundation — фонда в поддержку языка. А еще послушаем, как ребята из 4 компаний проекты на 8.0 перевозили: с чем столкнулись и что советуют.
https://opencollective.com/phpfoundation — о том, как поддержать…
https://opencollective.com/phpfoundation — о том, как поддержать…
Ищу к себе в команду middle/senior разработчика!
В Happy Inc мы исследуем вовлечённость и лояльность персонала в крупных компаниях: проводим анонимные опросы, строим сложные отчёты, доставляем их клиентам в различных форматах.
У нас модульный монолит без легаси. PHP 8.1 / Symfony 6.0 / PostgreSQL 14 / OpenAPI / CQRS / Event Sourcing / Psalm / Thesis и всё, о чём я тут рассказываю. 😜
Full-time, офис и удалёнка, ЗП по результатам собеса.
Резюме мне в ЛС @vudaltsov.
В Happy Inc мы исследуем вовлечённость и лояльность персонала в крупных компаниях: проводим анонимные опросы, строим сложные отчёты, доставляем их клиентам в различных форматах.
У нас модульный монолит без легаси. PHP 8.1 / Symfony 6.0 / PostgreSQL 14 / OpenAPI / CQRS / Event Sourcing / Psalm / Thesis и всё, о чём я тут рассказываю. 😜
Full-time, офис и удалёнка, ЗП по результатам собеса.
Резюме мне в ЛС @vudaltsov.
happy-inc.ru
Экосистема digital платформ для понимания клиентов, проведения аудита компании, ее процессов, корпоративной культуры и настроя…
Опросник для персонала и клиентов со встроенными рекомендациями и инструментами для анализа. Гарантируем интересные и эффективные опросы для сотрудников - Happy Job
Ночное образовательное шоу IT Nights 3.0
Приглашаю сегодня всех в 19:00 на IT Nights. Будут спикеры из Facebook, Яндекса, JetBrains, VK, X5 Group.
Меня заинтриговал доклад Изменения — единственная константа в IT и рыцарский турнир, в котором примут участия ребята с Podlodka, Егор Толстой и Стас Цыганов.
По промокоду
Приглашаю сегодня всех в 19:00 на IT Nights. Будут спикеры из Facebook, Яндекса, JetBrains, VK, X5 Group.
Меня заинтриговал доклад Изменения — единственная константа в IT и рыцарский турнир, в котором примут участия ребята с Podlodka, Егор Толстой и Стас Цыганов.
По промокоду
phpyh
скидка 20%.Какой вариант оптимальнее по памяти? (Какая переменная меньше?)
Anonymous Quiz
45%
Первый ($toStringAsKeyMemory)
55%
Второй ($toHexAsKeyMemory)
📊 Итоги года
В контексте PHP год пролетел для меня очень быстро, думаю, вы заметили по активности. Одна из причин — много интересной работы. Зато накопил уйму идей для постов и видео — буду исправляться.
Ачивки
💡 Попробовали с Ромой новые форматы: интервью, Clubhouseчто это?, Дайджест Live. Запустили канал с мемесами PHP умирает?!
🎙 Выступил на 4 оффлайн-конференциях и митапах. PHP привёз меня в Брянск, Нижний Новгород и Ростов-на-Дону. Зовите ещё — я с удовольствием путешествую по России!
🤣 Меня показали по телеку, и там я ответил на главный вопросвека репортёра: «Скажите, за базами данных будущее?»
🧑🎨 Пых получил свой логотип.
👊 В Пыхтелке появились админы, флуда и спама стало меньше. Спасибо ребятам большое!
😳 Моё отношение к трейтам не изменилось, но я законтрибьютил один в roave/dont.
🔥 Вошёл в программный комитет PHP Russia 2022.
Фейлы
☹️ Нерелиз Thesis. Но я не отчаиваюсь!Yii3 ведь тоже не вышел. Недавно уделил либе несколько дней в отпуске и решил пару организационно-архитектурных проблем. Обещать ничего не буду, просто скажу, что идея жива и мы по-прежнему радостно используем Thesis на работе.
Всем спасибо за участие в сообществе, до встречи в 🐯 году!
Пройдите, пожалуйста, опрос — он наводит мост в 2022!
https://phpsurvey.typeform.com/to/fqX8iwnT
В контексте PHP год пролетел для меня очень быстро, думаю, вы заметили по активности. Одна из причин — много интересной работы. Зато накопил уйму идей для постов и видео — буду исправляться.
Ачивки
💡 Попробовали с Ромой новые форматы: интервью, Clubhouse
🎙 Выступил на 4 оффлайн-конференциях и митапах. PHP привёз меня в Брянск, Нижний Новгород и Ростов-на-Дону. Зовите ещё — я с удовольствием путешествую по России!
🤣 Меня показали по телеку, и там я ответил на главный вопрос
🧑🎨 Пых получил свой логотип.
👊 В Пыхтелке появились админы, флуда и спама стало меньше. Спасибо ребятам большое!
😳 Моё отношение к трейтам не изменилось, но я законтрибьютил один в roave/dont.
🔥 Вошёл в программный комитет PHP Russia 2022.
Фейлы
☹️ Нерелиз Thesis. Но я не отчаиваюсь!
Всем спасибо за участие в сообществе, до встречи в 🐯 году!
Пройдите, пожалуйста, опрос — он наводит мост в 2022!
https://phpsurvey.typeform.com/to/fqX8iwnT
Typeform
Explore Typeform | Create your own surveys, quizzes, forms
Experience a slick way of creating forms with Typeform. Try templates for quizzes, surveys, forms and more.
Организация миграций Doctrine
В Doctrine Migrations есть классный параметр
Переключиться можно в любой момент. Для этого достаточно поправить конфиг и запустить мою команду — она раскидает файлики по нужным директориям. Команда расчитана на дефолтный
https://symfony.com/bundles/DoctrineMigrationsBundle/3.2.x/index.html
https://www.doctrine-project.org/projects/doctrine-migrations/en/3.3/reference/configuration.html
В Doctrine Migrations есть классный параметр
organize_migrations
. Он позволяет группировать файлы миграций по годам (BY_YEAR
) или по годам и месяцам (BY_YEAR_AND_MONTH
). Рекомендую сразу переходить на BY_YEAR_AND_MONTH
.Переключиться можно в любой момент. Для этого достаточно поправить конфиг и запустить мою команду — она раскидает файлики по нужным директориям. Команда расчитана на дефолтный
Version{date}
нейминг миграций.https://symfony.com/bundles/DoctrineMigrationsBundle/3.2.x/index.html
https://www.doctrine-project.org/projects/doctrine-migrations/en/3.3/reference/configuration.html
Avoid FPM reloading?
На днях гулял по документации Deployer 7 и набрёл на статью Avoid PHP-FPM Reloading.
Там даётся известная рекомендация использовать при конфигурации NGINX переменную $realpath_root вместо $document_root для
У нас так и настроено, однако от мягкой перезагрузки FPM мы не можем отказаться, так как используем preloading. И поэтому в статье меня смутила фраза "...reload can lead to dropped or failed requests".
Погуглил, вроде FPM должен корректно завершать запросы, активные на момент reload. Да и мы за пару лет не видели релевантных ошибок при деплойментах. Поэтому считаю дисклеймер неверным. Также нашёл твит на Пятиминутке PHP с полезными ссылками про деплоймент и opcache.
Вот такой дискуссионный пост получился. Пишите в комментариях, что думаете!
На днях гулял по документации Deployer 7 и набрёл на статью Avoid PHP-FPM Reloading.
Там даётся известная рекомендация использовать при конфигурации NGINX переменную $realpath_root вместо $document_root для
SCRIPT_FILENAME
. Это нужно для того, чтобы в opcache попадал реальный путь вместо симлинка и не было проблем при деплойменте. То же самое можно прочитать, например, в комментариях к примерному конфигу NGINX для Symfony.У нас так и настроено, однако от мягкой перезагрузки FPM мы не можем отказаться, так как используем preloading. И поэтому в статье меня смутила фраза "...reload can lead to dropped or failed requests".
Погуглил, вроде FPM должен корректно завершать запросы, активные на момент reload. Да и мы за пару лет не видели релевантных ошибок при деплойментах. Поэтому считаю дисклеймер неверным. Также нашёл твит на Пятиминутке PHP с полезными ссылками про деплоймент и opcache.
Вот такой дискуссионный пост получился. Пишите в комментариях, что думаете!
deployer.org
Avoid PHP-FPM Reloading | Deployer
Deployer symlinks current to latest release dir.
uniqid()
Функция uniqid — простой и быстрый способ получить ±уникальную криптографически небезопасную строку.
Как она работает? Функция берёт секунды и микросекунды, прошедшие с начала эпохи Unix, и конкатенирует их в шестнадцатиричном представлении:
Таким образом, выдаваемая строка имеет длину 13 символов (как посчитать длину самому). Если требуется меньше, то отрезать нужно с конца, так как наибольшей энтропией обладают последние знаки. Например, чтобы получить 8 символов, используем выражение
Первый необязательный параметр
Второй необязательный параметр
Не стоит относиться к этой функции слишком серьёзно, но в простейших случаях, например, при именовании каких-нибудь временных штук, она избавит вас от 🚲.
Функция uniqid — простой и быстрый способ получить ±уникальную криптографически небезопасную строку.
Как она работает? Функция берёт секунды и микросекунды, прошедшие с начала эпохи Unix, и конкатенирует их в шестнадцатиричном представлении:
function uniqid(): string
{
$time = gettimeofday();
return sprintf('%x%x', $time['sec'], $time['usec']);
}
Таким образом, выдаваемая строка имеет длину 13 символов (как посчитать длину самому). Если требуется меньше, то отрезать нужно с конца, так как наибольшей энтропией обладают последние знаки. Например, чтобы получить 8 символов, используем выражение
substr(uniqid(), -8)
.Первый необязательный параметр
$prefix
эквивалентен конкатенации $prefix.uniqid()
.Второй необязательный параметр
$more_entropy
добавляет к результату псевдослучайное число, что снижает риск получить одинаковые значения в параллельных процессах. Такая строка содержит 23 символа и имеет вид 61e0e81a580527.28156047
.Не стоит относиться к этой функции слишком серьёзно, но в простейших случаях, например, при именовании каких-нибудь временных штук, она избавит вас от 🚲.
Мы перешли на PHP 8.1 😝
Тут могла бы быть история про долгий и сложный переход, но мы просто апнулись одним праздничным днём, и всё...
За это, во-первых, спасибо инструментам статического анализа — с ними мы всегда уверены в forward-совместимости кода. А во-вторых — разработчикам PHP. Минорные и мажорные обновления стали плавными и качественными — большая часть депрекаций появляется и освещается в "СМИ" заранее, а откровенных багов стало очень мало.
Также порадовали зависимости:
Короче, полёт отличный, приглашаю обновиться. Если же пока нет такой возможности, обратите внимание на Rector. Через него можно делать бэкпорт, то есть писать на 8.1, а деплоить, например, 7.4. Сам не пробовал, если кто-то использует такую схему, расскажите про свой опыт, пожалуйста, в комментариях.
____________________
🔥 Кстати, я актуализировал вакансию и жду ваши резюме!
Тут могла бы быть история про долгий и сложный переход, но мы просто апнулись одним праздничным днём, и всё...
За это, во-первых, спасибо инструментам статического анализа — с ними мы всегда уверены в forward-совместимости кода. А во-вторых — разработчикам PHP. Минорные и мажорные обновления стали плавными и качественными — большая часть депрекаций появляется и освещается в "СМИ" заранее, а откровенных багов стало очень мало.
Также порадовали зависимости:
composer why-not php ^8.1
на нашем проекте быстро стал пустым. Видимо, авторы большинства пакетов ещё в прошлый раз в require
поставили ...|^8.0
, поэтому к 8.1 они уже были готовы.Короче, полёт отличный, приглашаю обновиться. Если же пока нет такой возможности, обратите внимание на Rector. Через него можно делать бэкпорт, то есть писать на 8.1, а деплоить, например, 7.4. Сам не пробовал, если кто-то использует такую схему, расскажите про свой опыт, пожалуйста, в комментариях.
____________________
🔥 Кстати, я актуализировал вакансию и жду ваши резюме!
Telegram
Пых
Ищу к себе в команду middle/senior разработчика!
В Happy Inc мы исследуем вовлечённость и лояльность персонала в крупных компаниях: проводим анонимные опросы, строим сложные отчёты, доставляем их клиентам в различных форматах.
У нас модульный монолит без…
В Happy Inc мы исследуем вовлечённость и лояльность персонала в крупных компаниях: проводим анонимные опросы, строим сложные отчёты, доставляем их клиентам в различных форматах.
У нас модульный монолит без…
This media is not supported in your browser
VIEW IN TELEGRAM
Лето 2016-ого, «Территория Смыслов». 😅
Поиск по нескольким словам в проекте
Задача. Найти в проекте все файлы, в которых есть слова
Пишите в комментариях, как вы бы решали эту задачу. Я расскажу, как найти файлы с использованием поиска по регулярному выражению в PhpStorm.
В RegEx можно по-разному обозначить подстроку, но только lookahead и lookbehind позволяют комбинировать условия без определённого порядка. Получается следующий паттерн:
Однако в таком виде в PhpStorm паттерн не сработает, потому что в интерпертации IDE
Паттерн легко расширяется для поиска любого кол-ва слов.
Источники:
• https://stackoverflow.com/a/4389683,
• https://bit.ly/3LeMPa9.
Задача. Найти в проекте все файлы, в которых есть слова
employee
и department
(обязательно оба в любом порядке).Пишите в комментариях, как вы бы решали эту задачу. Я расскажу, как найти файлы с использованием поиска по регулярному выражению в PhpStorm.
В RegEx можно по-разному обозначить подстроку, но только lookahead и lookbehind позволяют комбинировать условия без определённого порядка. Получается следующий паттерн:
^(?=.*\bemployee\b)(?=.*\bdepartment\b).*$
(?=)
— positive lookahead, \b
— граница слова, .*
— любой символ.Однако в таком виде в PhpStorm паттерн не сработает, потому что в интерпертации IDE
.
не включает символ новой строки. Поэтому заменяем .
на [\s\S]
(любой пробельный или непробельный символ) и получаем рабочий шаблон:
^(?=[\s\S]*\bemployee\b)(?=[\s\S]*\bdepartment\b)[\s\S]*$
Паттерн легко расширяется для поиска любого кол-ва слов.
Источники:
• https://stackoverflow.com/a/4389683,
• https://bit.ly/3LeMPa9.
3000+ PHP developers cannot be wrong
Завтра вместе с Александром Макаровым и Кириллом Несмеяновым подведём итоги 2021 года на стриме!
Разыграем кучу подарков, в том числе бесплатную часовую консультацию со мной. 🎁
Начало в 11 по Москве.
https://phpcommunity.ru/2021-php
Завтра вместе с Александром Макаровым и Кириллом Несмеяновым подведём итоги 2021 года на стриме!
Разыграем кучу подарков, в том числе бесплатную часовую консультацию со мной. 🎁
Начало в 11 по Москве.
https://phpcommunity.ru/2021-php
YouTube
Чем запомнился 2021 год русскоязычному PHP-сообществу — в 3000+ ответах
Подробнее https://phpcommunity.ru/2021-php
В PHP-сообществе прошел второй ежегодный опрос. Обсудим итоги в лайве: на какой версии сидит сообщество и многие ли переехали на восьмерку (или даже на 8.1), расклад по фреймворкам, главные события 2021, планы…
В PHP-сообществе прошел второй ежегодный опрос. Обсудим итоги в лайве: на какой версии сидит сообщество и многие ли переехали на восьмерку (или даже на 8.1), расклад по фреймворкам, главные события 2021, планы…
🔴 И мы нааачииинаааееем, заходите!
https://youtu.be/Nx39a7n9KIQ
Полезные ссылки:
• Итоги 2021 для PHP-коммьюнити в цифрах и графиках,
• Что смотрели и читали по PHP в 2021: список от сообщества.
https://youtu.be/Nx39a7n9KIQ
Полезные ссылки:
• Итоги 2021 для PHP-коммьюнити в цифрах и графиках,
• Что смотрели и читали по PHP в 2021: список от сообщества.
YouTube
Чем запомнился 2021 год русскоязычному PHP-сообществу — в 3000+ ответах
Подробнее https://phpcommunity.ru/2021-php
В PHP-сообществе прошел второй ежегодный опрос. Обсудим итоги в лайве: на какой версии сидит сообщество и многие ли переехали на восьмерку (или даже на 8.1), расклад по фреймворкам, главные события 2021, планы…
В PHP-сообществе прошел второй ежегодный опрос. Обсудим итоги в лайве: на какой версии сидит сообщество и многие ли переехали на восьмерку (или даже на 8.1), расклад по фреймворкам, главные события 2021, планы…
🤝 PHP Foundation
С этого дня я ежемесячно перевожу $50 в фонд PHP.
PHP Foundation — это некоммерческая организация, миссия которой — обеспечить долгосрочное развитие PHP. Главный идеолог фонда — Роман Пронский, автор PHP Digest. Запуск проекта стал совместной инициативой JetBrains, Laravel, Symfony, Zend и других компаний.
На текущий момент фонд обработал заявки от разработчиков, которые хотят участвовать в разработке языка, и теперь решает юридические вопросы. Поэтому в графе расходов пока пусто — полноценная работа начнётся после согласования документов. Подробнее читайте в первом апдейте.
Больше о фонде:
• 216-ый выпуск PHP Дайджеста,
• стрим к выходу PHP 8.1,
• блог JetBrains,
• Twitter проекта.
https://opencollective.com/phpfoundation
С этого дня я ежемесячно перевожу $50 в фонд PHP.
PHP Foundation — это некоммерческая организация, миссия которой — обеспечить долгосрочное развитие PHP. Главный идеолог фонда — Роман Пронский, автор PHP Digest. Запуск проекта стал совместной инициативой JetBrains, Laravel, Symfony, Zend и других компаний.
На текущий момент фонд обработал заявки от разработчиков, которые хотят участвовать в разработке языка, и теперь решает юридические вопросы. Поэтому в графе расходов пока пусто — полноценная работа начнётся после согласования документов. Подробнее читайте в первом апдейте.
Больше о фонде:
• 216-ый выпуск PHP Дайджеста,
• стрим к выходу PHP 8.1,
• блог JetBrains,
• Twitter проекта.
https://opencollective.com/phpfoundation
fromName для enum
Перечисления (енамы) бывают двух типов: чистые игрязные типизированные, со скалярным эквивалентом. Типизированные енамы реализуют интерфейс BackedEnum с дополнительными методами
В этом посте мы попробуем добавить аналогичные методы
Для начала обратим внимание на любопытную фразу в документации: "Для вариантов перечисления применяются те же правила синтаксиса, что и для любой метки в PHP, смотрите Константы". По идее, это означает, что мы можем без рефлексии динамически работать с енамами как с константами. Попробуем!
Вуаля, работает! https://3v4l.org/EgBB1
Обратите внимание на комментарии @SerafimArts про нюансы использования констант и решение задачи через рефлексию.
P.S.: Задача этого поста — поиграться с перечислениями, чтобы лучше их прочувствовать. Я не призываю так делать. Если при работе с чистым енамом выясняется, что его нужно получать по имени, то лучше поменять такой енам на типизированный и использовать встроенные методы
Перечисления (енамы) бывают двух типов: чистые и
from
и tryFrom
— они позволяют получить перечисление по его скалярному эквиваленту ($value
).В этом посте мы попробуем добавить аналогичные методы
fromName
и tryFromName
для получения перечисления любого типа по его имени ($name
).Для начала обратим внимание на любопытную фразу в документации: "Для вариантов перечисления применяются те же правила синтаксиса, что и для любой метки в PHP, смотрите Константы". По идее, это означает, что мы можем без рефлексии динамически работать с енамами как с константами. Попробуем!
enum Locale
{
case ru;
case en;
public static function tryFromName(string $name): ?self
{
$constant = self::class.'::'.$name;
if (\defined($constant)) {
return \constant($constant);
}
return null;
}
public static function fromName(string $name): self
{
return self::tryFromName($name)
?? throw new \ValueError(sprintf(
'"%s" is not a valid name for enum "%s"',
$name,
self::class,
));
}
}
Вуаля, работает! https://3v4l.org/EgBB1
Обратите внимание на комментарии @SerafimArts про нюансы использования констант и решение задачи через рефлексию.
P.S.: Задача этого поста — поиграться с перечислениями, чтобы лучше их прочувствовать. Я не призываю так делать. Если при работе с чистым енамом выясняется, что его нужно получать по имени, то лучше поменять такой енам на типизированный и использовать встроенные методы
from
и tryFrom
.3v4l.org
Online PHP editor | output for EgBB1
Run your php code online; get statistics, vld output and compare output from all versions.
Ушла из жизни Юлия Insolita
Юлия — самая активная участница русского PHP-сообщества. Она контрибьютила в Open Source, возглавляла сообщество Иркутска в Telegram, помогала Роме с дайджестами, комментировала каждый стрим.
По-итальянски insolita означает "необычная", "необыкновенная". Такой Юля и была, такой мы её и запомним.
В память о Юлии предлагаю полистать её блоги на dev.to и medium.
Юлия — самая активная участница русского PHP-сообщества. Она контрибьютила в Open Source, возглавляла сообщество Иркутска в Telegram, помогала Роме с дайджестами, комментировала каждый стрим.
По-итальянски insolita означает "необычная", "необыкновенная". Такой Юля и была, такой мы её и запомним.
В память о Юлии предлагаю полистать её блоги на dev.to и medium.
Какой стиль именования лучше всего подходит для кейсов enum?
Anonymous Poll
29%
camelCase
15%
PascalCase
4%
snake_case
51%
SCREAMING_SNAKE_CASE
enum EnumNaming
{
case camelCase;
case PascalCase;
case snake_case;
case SCREAMING_SNAKE_CASE;
}
dump(
EnumNaming::camelCase,
EnumNaming::PascalCase,
EnumNaming::snake_case,
EnumNaming::SCREAMING_SNAKE_CASE,
);