Эргономичный код
827 subscribers
96 photos
3 videos
24 files
444 links
Канал о разработке поддерживаемых бакэндов - про классическую школу TDD, прагматичное функциональное программирование и архитектуру и немного DDD.

Группа: https://t.me/+hrqD87p0Oa

Канал в Max: https://max.ru/id544512614458_biz

https://azhidkov.pro
Download Telegram
Привет!

Предистория.

Как вы знаете, я недавно ходил в гости к javaswag. Но, возможно, вы (как и я до этой записи) не знаете, что javaswag – это не только звук, но и нарезка видео, и небольшие тексты с комментариями к ссылкам.

У меня ссылок было аж 19 штук и Дима предложил сделать развёрнутые комментарии к ссылкам.
Но внезапно оказалось, что я не умею писать комментарии к ссылкам и вместо комментариев у меня как обычно вышел небольшой пост-очерк “Что такое ООП?”.
Но пост – уже не формат для javaswag, поэтому я его представляю вам у себя.

—-

История


В книге “What every programmer should know about object-oriented design” Пейдж-Джонс на первой же странице пишет:

Термин “объектно-ориентированный”, по сути своей, бессмысленен. “Объект” — это одно из самых общих слов в английском языке. Если вы посмотрите его значение в словаре, то увидите что-то вроде:

Объект — вещь, представленная или которую можно представить чувствам [человека].

Другими словами, объект - это практически всё что угодно.

Слово “ориентированный” также не особо помогает. Опредёленное как “направленный в сторону”, оно обычно используется для превращения термина “объекто-ориентированный” в прилагательное.
Таким образом, мы имеем:

Объектно-ориентированный — направленный в сторону практически чего угодно, о чём вы можете только подумать.

Не удивительно, что наша индустрия не смогла договориться об определении термина “объектно-ориентированный”.


Наверное, если провести опрос среди разработчиков, то самым популярным ответом будет “ООП – это наследование, полиморфизм и инкапсуляция”. И последний выпуск javaswag (см. ответ на моё непопулярное мнение), кстати, это подтверждает.

Однако Алан Кей, автор термина, в одном из своих докладов заявил: “На самом деле это я придумал термин “объектно-ориентированный” и я могу сказать вам, что я не имел С++ ввиду”.
А имел он ввиду: обмен сообщениями, сокрытие состояния и экстремально позднее связывание.

И, как следствие, Джо Армстронг, создатель Erlang считает: “Erlang, возможно, является единственным объектно-ориентированным языком, потому что три принципа объектно-ориентированного программирования заключаются в передаче сообщений, изоляции между объектами и полиморфизмом. [...] ООП — это не про объекты и классы, ООП — это про сообщения”.

Для меня же объектно-ориентированный подход — это подход к разработке программ, в котором базовым блоком является объект.
А объект — это сущность, которая обладает состоянием и ограничивает пространство своих допустимых состояний.
На удивление, идею пространства состояний и его ограничения я нашёл и в книге Пейдж-Джонса спустя пару лет, после того как написал свой пост.

А что такое ООП для вас?

#oop@ergonomic_code #terminology@ergonomic_code #archeology@ergonomic_code #books@ergonomic_code
👍11
Привет!

Полезняшка.

Я вчера по своему невежеству часа два потратил на то, чтобы воткнуть в локальном окружении проксю между запущенными на хосте фронтом, который ходит на один урл и двумя бэк-сервисами, так, чтобы определённый путь уходил на один сервис, а все остальные - на другой.

В итоге всё оказалось предельно просто.
Запустил компоузом nginx с network_mode: host и собрал минимальный конфиг nginx-а.

name: my-project-nginx

services:
nginx:
image: nginx
volumes:
- ./nginx/dev.conf:/etc/nginx/conf.d/default.conf
network_mode: host


server {
listen 8081;

location ~ ^/api/(public|external)/ {
proxy_pass http://localhost:8084;
}

location / {
proxy_pass http://localhost:8082;
}
}


Не сказать, что откровение века, но может кому-то ещё пригодится.

#devx@ergonomic_code #docker@ergonomic_code #nginx@ergonomic_code
👍8
Привет!

На днях перевёл Проект Р и Trainer Advisor на Kotlin 2.1.0 и Spring Boot 3.4.0
В целом всё прошло без проблем, делюсь впечатлениями

Проект Р/Котлин 2.0.0 -> 2.1.0
1. Т.к. переходил с версии 2.0.0 так же возникла проблема с пропажей продовых зависимостей в testFixtures source sets. И со второй попытки я её определил и починил быстро
2. В паре data классов с приватными конструкторами пришлось развесить @ConsistentCopyVisibility, чтобы варнинг убрать

Проект Р/Спринг 3.3.1 -> 3.4.0
1. Тест на корс, который ломился без авторизации на закрытый урл начал валиться по 401/3 (забыл уже) - перевёл его на запрос к публичному пути - заработало

Trainer Adviser/Котлин 2.0.21 -> 2.1.0
1. Заглючила идея 2024.2 и опять на testsFixtures - гредлом всё ок собирается, в редакторе ошибок нет, но при попытке сборки проектов идеевским билд тулом (я юзаю его для разработки, так как он быстрее гредлового) - ругается что не может в коде тестов найти символ из кода фикстур. Это поличилось обновлением самой идеи до 2024.3

Trainer Advisor/Спринг 3.3.5 -> 3.4.0
1. Начало взрываться responseEntity.contentLength = storedFileInputStream.metaData.size при size = 0. Добавил if (size > 0) - завелось
2. В одном из эндпоинтов на параметр принципала не был навешан @AuthenticationPrincipal. Раньше это как-то работало, после преезда перестало, после добавления аннотации снова заработало.

—

На обновление Проекта Р у меня ушло часа три.
Львиная доля ушла на:
1. переход на обратнонесовместимый Kover 0.8.3
2. datafaker в котором задепрекейтили один из методов
3. не связанные с обновлением разборки с гредлом

Trainer Advisor вообще за час максимум обновил.

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

#kotlin@ergonomic_code #spring@ergonomic_code #projectr@ergonomic_code #trainer_advisor@ergonomic_code
👍4❤3👌1
Привет!

Новая рубрика в канале - челлендж! :)

Предыстория

Собрался я тут писать на свою вики статью "Функциональная (типизированная) обработка ошибок". Текст написал, решил сдобрить примерами. В качестве задачи решил взять парсинг строк в инты. Сначала запилил тупую императивную реализацию. Потом подумал, что это как-то не конгруэнтно и попробовал переписать в декларативном стиле. И такое ощущение, что получилось заметно хуже - и медленнее и сложнее.

История

Предлагаю вам поучаствовать в челлендже на самую понятную и эффективную реализацию функции парсинга:)

Условия:
1. Надо форкнуть репоз-фреймворк, реализовать функцию parseInt так, чтобы проходили тесты
2. Завести пуллреквест со своей реализацией. Ограничений на реализацию нет - можно писать и в императивном стиле, и в декларативном, и с помощью ии
3. Через выходные 16-ого декабря я опубликую в канале все варианты включая свои и заведу голосовалку, какой из вариантов наиболее понятен
4. Победитель получит почёт, свой код в вики эргономичного подхода и ссылки на себя в вики, репозе и канале:)
👍8🔥3
Эргономичный код
Привет! Новая рубрика в канале - челлендж! :) Предыстория Собрался я тут писать на свою вики статью "Функциональная (типизированная) обработка ошибок". Текст написал, решил сдобрить примерами. В качестве задачи решил взять парсинг строк в инты. Сначала…
Привет!

Так, ну чтош, обещанная голосовалка.

В первую очередь, спасибо всем кто отозвался и прислал варианты.

Всего вышло аш 10 вариантов - 5 моих и 5 от подписчиков.
Я решил, что корректнее будет если я не буду их выделять, поэтому варианты идут в случайном порядке.

Сейчас запилю пост с опросом - голосуем:)

Напомню, моя цель выбрать вариант, который проще всего прочитать и понять широкой аудитории.
Эргономичный код
Какой вариант вам было проще всего понять?
Привет!

Фух, вы видели эту гонку? Она была валидольной:)

Не в обиду автору второго варианта, но вчера вечером 5-ый вариант лидировал с перевесом в один (мой:)) голос. И сегодня с утра я с замиранием сердца открывал канал, потому что победа второго варианта поставила бы меня в неловкое положение.

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

Ну и да, 5ый вариант, очевидно, был одним из моих:) На самом деле первым вариантом, который я, подглядев у одного из участников, упростил заменив isNegative на sign :)

Ещё раз спасибо всем отозвавшимся - если хотите, напишете мне в личку - опубликую пост с именными благодарностями:)
👍9
А, ну и конечно спасибо всем проголосовавшим - вы помогли мне свериться с реальностью и выбрать объективно наилучший вариант для статьи:)
❤7