Более года назад друг познакомил меня с концепцией Железнодорожного программирования (ROP). Мне понравилась идея и беглость , которая с ней связана, но это был стиль, рожденный из функционального программирования – то, что не полностью используется в Java, несмотря на введение лямбд и потоков в Java 8 .
Хотя для этого уже существовало несколько существующих библиотек Java, я подумал, что было бы неплохо написать одну самому, поскольку это была хорошая возможность для меня:
- понять, что такое ROP
- практикуйте TDD
- узнайте, как опубликовать библиотеку Java в общедоступном репозитории пакетов (например, Sonatype Nexus).
- попробуйте использовать действия GitHub для настройки конвейера и автоматической публикации библиотеки в репозитории пакетов
После пары месяцев и тонны проволочек я смог придумать что-то полезное, хотя и не готовое к производству (в любом случае это не было целью).
Ger vG/тюрьма
Программирование, ориентированное на железную дорогу, с использованием Java
Если вам интересно, вы можете получить снимок здесь .
Я планирую написать статью о том, что такое тюрьма, что она может делать и что, по моему мнению, является ее недостатками (хотя я думаю, что то, что я сделал, не является настоящим ROP). Но это не то, о чем идет речь в этом посте. А пока вот некоторые мысли и основные моменты из этого путешествия:
- Присвоение имен (все еще) сложно
- Я отстой в GitHub
- Я не думаю, что по-настоящему понимал Монады
- Спок великолепен, но он не соответствовал моим потребностям
- Варианты лицензирования с открытым исходным кодом
- Погружаю пальцы ног в действия GitHub
- Создание и утверждение моего собственного PR
- Публикация библиотеки
Присвоение имен (все еще) сложно
Как бы банально это ни звучало, но на самом деле нет ничего сложного. Я обдумывал это название почти неделю, прежде чем остановился на Jail, поскольку большинство Java-вещей либо начинаются, либо заканчиваются на “J”. Только после создания репозитория я понял, что это похоже на название Japan Rail. Но, эй, он уже создан, и я не хочу тратить еще одну неделю на то, чтобы придумать название.
Я отстой в GitHub
До этого у меня не было никаких серьезных репозиториев в моей учетной записи Github. Большинство из того, что у меня есть, больше похоже на каракули на бумаге, чем на проекты, достойные демонстрации. Так да, это довольно длинный способ сказать, что я не программирую вне работы.
Посмотрите на этот календарь взносов. Так впечатляюще/так
Мне также потребовалось смущающее количество времени, чтобы настроить мои SSH-ключи и репозиторий, что должно было занять всего несколько минут, если не секунд. Я думаю, это хорошее освежение памяти.
Я не думаю, что по-настоящему понимал Монады
И на данный момент я не думаю, что кто-то это делает.
Шутки в сторону, я действительно хотел понять лежащую в основе этого теорию. Я считаю, что опасно просто делать что-то, не понимая, почему это делается таким образом. Я помню, как потреблял много материалов по теории категорий и функциональному программированию, когда впервые взялся за этот проект, но не смог сохранить много информации (мой мозг не очень хорош).
Ближе всего я подошел к пониманию этого с помощью этого объяснения .
Поэтому я попытался объяснить это своими словами другу, потому что “лучший способ учиться – это учить”, верно? Но я не мог ответить на его вопросы, так что, возможно, я действительно не получил монады в конце концов.
Как нормальный человек, я сдался. Я могу вернуться к этому позже, если у меня когда-нибудь снова появится мотивация, но сейчас я думаю, что узнал достаточно, чтобы продолжать. Затем я переключил свое внимание на то, как я могу сделать API достаточно интуитивно понятным для использования, конечно, с помощью тестов.
Спок великолепен, но он не соответствовал моим потребностям
Вы, вероятно, слышали о фреймворке тестирования под названием Spock , который написан на Заводной . Это здорово и я люблю использовать его каждый день для работы. Поэтому я изначально написал все свои тесты, используя его.
Но я понял, что наличие динамически типизированного языка не очень помогает мне в разработке API (не очень строгие дженерики Java тоже не помогают). Я также хотел знать, каково это – использовать API, которые я создал. Поэтому, чтобы не попасть впросак, я решил вместо этого переписать тесты с помощью JUnit.
Другая причина заключается в том, что я хотел, чтобы мои тесты служили документацией или компиляцией примеров. Я написал эту библиотеку с учетом Java-разработчиков, и наличие тестов в Groovy – это своего рода шаг в другом направлении. Одним из немногих отличий является Groovy closures, где синтаксис для лямбда-выражений использует фигурные скобки вместо круглых скобок.
{ closureParameters -> statements }
Хотя это может быть не так важно для опытного разработчика, я больше не хотел добавлять никакой дополнительной когнитивной нагрузки на читателей. Написание тестов на Java сделало “примеры” более понятными и последовательными.
Варианты лицензирования с открытым исходным кодом
Почему, черт возьми, их так много? К счастью, GitHub создал https://choosealicense.com/ чтобы помочь таким нубам, как я, выбрать подходящую лицензию.
Маловероятно, что люди все равно будут этим пользоваться. Но на всякий случай я хотел дать им понять, что мне все равно, что они хотят с этим делать и я не несу ответственности за тот хаос, который они вызвали.
Погружаю пальцы ног в действия GitHub
Я впервые настраиваю свой собственный CI, и на самом деле это было проще, чем печатать весь этот пост в блоге. GitHub уже предоставил несколько шаблонов рабочих процессов, чтобы вы могли начать, так что на самом деле это всего лишь вопрос нажатия кнопки мыши. С ним также довольно легко играть, так как это просто YAML (как и большинство вещей DevOps).
Создание и утверждение моего собственного PR
Я не думаю, что мне нужно это объяснять. Это лучшая часть этого проекта
Публикация библиотеки
Это самая захватывающая, но в то же время разочаровывающая часть проекта. Мне удалось только опубликовать снимок , но я не смог подписать его должным образом. После нескольких сбоев в моем CI я решил пропустить подписание и просто опубликовать снимок. Я не хотел публиковать неподписанный пакет но мне было слишком лень продолжать. Я чувствовал, что уже сделал то, что должен был сделать, так что для меня это уже достаточное достижение.
Да, я ленивый. Я знаю.
Заключительные мысли
Строительство тюрьмы было довольно забавным занятием, несмотря на то, что я не смог его завершить. Возможно, я вернусь к нему позже, чтобы улучшить его и пересмотреть его парадигму, поскольку я не думаю, что следовал ROP. Но, честно говоря, я, вероятно, просто оставлю все как есть, потому что обычно предпочитаю держаться подальше от программирования в нерабочее время. Это просто мой собственный способ уравновесить ситуацию и найти время, чтобы насладиться другими вещами.
Тем не менее, это все еще приятное напоминание для меня, чтобы всегда практиковать основы и иногда исследовать, что еще я могу делать, кроме тех, которым я учусь на работе. Я думаю, что позаимствую некоторые принципы из ROP и применю их к нашему коду.
Дальнейшее Чтение
В случае, если вам интересно и вы хотите попробовать это или почитать самостоятельно, вот некоторые ресурсы, которые помогут вам начать:
- Программирование, ориентированное на железную дорогу Скотт Влашин. Насколько я знаю, это первоисточник идеи.
- Как опубликовать библиотеки Java с открытым исходным кодом в Maven Central по электронной почте Kirschner. Я тоже читал другие руководства но этому легче всего следовать, несмотря на то, что он написан на Kotlin
- Шпаргалка GPG
- Куча статей по функциональному программированию
- Функторы, Аппликативы И Монады В Картинках Адити Бхаргава
- Ваше простое руководство по монадам, Аппликативам и функторам Это действительно выглядит круто с его анимацией
- Этот ответ в Stackoverflow
- Теория категорий для программистов Бартош Милевский. Я еще не закончил читать эту книгу но это действительно интересно, особенно если вас интересуют абстрактные темы математики
Оригинал: “https://dev.to/gervg/my-experiences-in-writing-and-publishing-my-first-java-library-11hc”