👑 Магия IntelliJ IDEA
Если вы часто просматриваете стек вызовов или трассируете поведение методов — попробуйте «Call Hierarchy» (Ctrl + Alt + H). Этот инструмент показывает, кто вызывает ваш метод — и кто вызывает вызывающего, до самого верхнего уровня.
🔹 Что делает
— Строит иерархию вызовов метода вверх или вниз.
— Помогает отследить влияние метода по всей кодовой базе.
— Работает даже с интерфейсами и абстрактными методами — покажет всех наследников.
🔹 Зачем это нужно
— Находит неочевидные связи между частями кода.
— Упрощает работу с легаси: видно, какие методы безопасно менять.
— Быстро определяет, как ошибка «долетела» до нужного места.
🔹 Как использовать
— Поставьте курсор на метод → нажмите Ctrl + Alt + H.
— IDEA откроет дерево вызовов (Call Hierarchy).
— Вы можете «разворачивать» цепочку вверх по стеку или вниз.
🐸 Библиотека джависта #буст
Если вы часто просматриваете стек вызовов или трассируете поведение методов — попробуйте «Call Hierarchy» (Ctrl + Alt + H). Этот инструмент показывает, кто вызывает ваш метод — и кто вызывает вызывающего, до самого верхнего уровня.
🔹 Что делает
— Строит иерархию вызовов метода вверх или вниз.
— Помогает отследить влияние метода по всей кодовой базе.
— Работает даже с интерфейсами и абстрактными методами — покажет всех наследников.
🔹 Зачем это нужно
— Находит неочевидные связи между частями кода.
— Упрощает работу с легаси: видно, какие методы безопасно менять.
— Быстро определяет, как ошибка «долетела» до нужного места.
🔹 Как использовать
— Поставьте курсор на метод → нажмите Ctrl + Alt + H.
— IDEA откроет дерево вызовов (Call Hierarchy).
— Вы можете «разворачивать» цепочку вверх по стеку или вниз.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥6❤4
Проблема: в современных распределённых системах необходимо эффективно обрабатывать большие объёмы сообщений, обеспечивая надёжность и масштабируемость. Использование синхронных методов может привести к задержкам и перегрузке системы.
Решение: в книге «Java 17 Backend Development» автор предлагает интеграцию Apache Kafka для асинхронной обработки сообщений. Это позволяет разгрузить сервисы и обеспечить высокую производительность системы.
Пример кода:
public class KafkaMessageListener {
private final KafkaConsumer<String, String> consumer;
public KafkaMessageListener(String bootstrapServers, String groupId, String topic) {
Properties properties = new Properties();
properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
properties.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
this.consumer = new KafkaConsumer<>(properties);
this.consumer.subscribe(List.of(topic));
}
public void startListening() {
while (true) {
var records = consumer.poll(Duration.ofMillis(100));
records.forEach(record -> {
System.out.println("Received message: " + record.value());
// Обработка сообщения
});
}
}
}
Преимущества:
— Лёгкая адаптация к увеличению объёмов данных.
— Гарантированная доставка сообщений.
— Возможность обработки сообщений в фоновом режиме.
Еще больше полезных книг — в нашем канале @progbook
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1❤🔥1🔥1
Автоматизация сборки, тестирования и деплоя — must-have даже для pet-проекта. Но настраивать GitLab CI или GitHub Actions вручную? Спросите AI — и получите готовый пайплайн, адаптированный под ваш стек.
📝 Промпт:
Generate a CI/CD pipeline for a Java Spring Boot application using GitLab CI.
— Include stages: build, test, integration-test, package, deploy.
— Use Gradle (or Maven) as the build tool.
— Include support for Docker image build and push to container registry.
— Run integration tests using Testcontainers.
— Use caching to speed up pipeline runs.
— Добавьте
environment-specific deployments: отдельные джобы для dev/stage/prod
с переменными окружения, secrets и условиями по веткам (only/except или rules).— Интегрируйте
notifications
в Telegram или Slack на стадии failed/success для быстрой обратной связи.— Добавьте
security scan stage
: используйте Snyk или OWASP Dependency Check для анализа уязвимостей зависимостей.— Автоматизируйте
Docker image tagging
: используйте Git tag или commit hash, чтобы образы были отслеживаемыми.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍4❤1🥱1
О принципе единственной ответственности слышали все. Конечно правильный ответ согласно книги Роберта Мартина "Чистая архитектура": SRP - это принцип единой ответственности.
Но при попытке разобраться в более дательном понимании принципа его часто трактуют слишком буквально:
Метод должен реализовывать одну задачу
Класс должен отвечать за один функционал
Да, это отчасти верно и такой принцип тоже есть, но он применяется на низшем уровне системы. SRP же применяется на более высоком уровне.
В итоге получаются сервисы, в которых вроде как всё «по SRP», но изменения в одном бизнес-сценарии ведут к каскадным правкам в десятках файлов. Это сигнал: принцип нарушен, несмотря на формальное соблюдение.
🔹 О чём на самом деле говорит SRP
В классическом изложении (по Роберту Мартину):
Модуль должен иметь только одну причину для изменения.
И под модулем понимается не метод и не даже один класс, а группа классов и интерфейсов, объединённая общим потребителем — актором.
🔹 Что это означает на практике
1. Определите акторов
Актор — это не всегда пользователь. Это может быть внешний сервис, внутренний инструмент, регламент. Важно: требования акторов не должны пересекаться. Если они меняются независимо — значит, им нужны отдельные модули.
2. Постройте модули вокруг акторов
Частая ошибка — «модуль пользователей», в котором и логика регистрации, и рассылка писем, и обработка GDPR-запросов.
Лучше разделить:
▪️ один модуль обслуживает end-user’а,
▪️ другой — юридические требования,
▪️ третий — внутреннюю админку.
3. Не дробите код ради SRP, если это нарушает целостность модуля
SRP — это не о размере, а о мотивации изменений. Метод в 100 строк, обслуживающий один сценарий, допустим. А вот класс, который реагирует на десяток независимых событий — нет.
🔹 Пример
public class OrderService {
public void placeOrder() { ... }
public void notifyCustomer() { ... }
public void saveAuditLog() { ... }
}
Этот класс изменится при любом изменении в бизнес-логике, в уведомлениях или в логировании. Три причины изменения — три актора.
▪️ OrderProcessor — отвечает за бизнес-сценарий
▪️ NotificationService — отправка сообщений
▪️ AuditService — логирование
Каждый компонент обслуживает одного актора, имеет свою причину для изменений и независимую эволюцию.
🔹 Вывод
SRP стоит понимать как инструмент для проектирования архитектуры. Его задача — отделить контексты, которые меняются по разным причинам, и тем самым минимизировать связность и ограничить зону изменений. Не методы, не классы, а контексты и акторы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤5🔥3🤔1
Когда нужно что-то быстро протестировать, написать фрагмент кода, проверить регулярку или сериализацию — не создавайте новый класс. Вместо этого используйте Scratch File (Ctrl + Alt + Shift + Insert).
🔹 Что делает
— Создаёт временный файл вне проекта
— Поддерживает Java (и другие языки), автодополнение, импорт, выполнение
— Сохраняется автоматически, можно переключаться между файлами
🔹 Зачем это нужно
— Быстрые пробы кода без засорения проекта
— Подходит для написания утилит, генерации данных, логов
— Удобно держать список SQL-запросов, curl-ов или шаблонов прямо в IDE
🔹 Как использовать
— Нажмите Ctrl + Alt + Shift + Insert → выберите язык (например, Java)
— Пишите как обычно: public static void main, System.out.println() — и запускайте
— Можно открыть менеджер Scratch-файлов через Project > Scratches and Consoles
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥5❤3
В разработке ПО ключевым фактором успеха является не только качество кода, но и способность команды эффективно решать сложные задачи. В статье рассматривается, как алгоритмическое мышление помогает разработчикам:
▪️ Оптимизировать производительность: использование алгоритмов для улучшения скорости и эффективности приложений.
▪️ Управлять сложностью: применение структур данных и алгоритмов для упрощения разработки и поддержки кода.
▪️ Повышать качество продукта: снижение количества ошибок и улучшение стабильности приложений.
Особое внимание уделяется переходу от теоретического понимания алгоритмов к их практическому применению в промышленной разработке.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1🔥1
Проблема: обеспечение безопасности приложения требует надёжной системы аутентификации и авторизации пользователей.
Решение: в книге «Java 17 Backend Development» автор предлагает процесс настройки Spring Security для реализации аутентификации с использованием JWT-токенов.
Пример кода:
public class JwtAuthenticationFilter extends OncePerRequestFilter {
private final JwtTokenProvider tokenProvider;
public JwtAuthenticationFilter(JwtTokenProvider tokenProvider) {
this.tokenProvider = tokenProvider;
}
@Override
protected void doFilterInternal(HttpServletRequest request, FilterChain chain) throws ServletException, IOException {
String token = tokenProvider.resolveToken(request);
if (token != null && tokenProvider.validateToken(token)) {
String username = tokenProvider.getUsernameFromToken(token);
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, null, null);
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
chain.doFilter(request, response);
}
}
Преимущества:
— Защита приложения от несанкционированного доступа.
— Возможность настройки различных уровней доступа.
— Лёгкая адаптация к изменениям в требованиях безопасности.
Еще больше полезных книг — в нашем канале @progbook
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍4❤2👏1👾1
Классический REST не справляется с масштабом и скоростью реакции? Пора перейти к событийной архитектуре: Kafka + Spring Boot. Спросите AI — и получите продуманный шаблон микросервиса с продюсерами, консьюмерами, сериализацией, хэндлингом ошибок и даже dead-letter-топиками.
📝 Промпт:
Generate a production-grade Java Spring Boot microservice using Apache Kafka for event-driven architecture.
— Use Spring Boot 3 and Spring Kafka.
— Implement Kafka producers and consumers for a user.created event.
— Use Avro schema for message serialization and Schema Registry for compatibility.
— Include retry logic and Dead Letter Topic (DLT) support for failed messages.
— Handle message headers and custom error handling.
— Add integration tests using Embedded Kafka and Testcontainers.
— Добавьте
Implement the outbox pattern using a transactional Kafka producer and Debezium CDC
, чтобы гарантировать доставку событий и избежать дублирования при сбоях в БД.— Добавьте
Integrate observability using Micrometer for Prometheus and OpenTelemetry for distributed tracing
, чтобы отслеживать метрики и трассировать поток сообщений сквозь микросервисы.— Добавьте
Generate Kafka topic and consumer group configuration using Terraform
, чтобы автоматизировать инфраструктуру и обеспечить консистентную настройку топиков в Dev/Stage/Prod.— Добавьте
Support dynamic partitioning and load balancing among consumers
, чтобы масштабировать консьюмеров при увеличении нагрузки.Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🔥1👏1🥱1
Многопоточность в Java — это не просто задача синхронизации потоков, а целая экосистема инструментов для эффективного и безопасного параллельного выполнения кода. Правильная настройка многопоточных процессов позволяет значительно улучшить производительность, но требует внимательного подхода.
🔹 Основы многопоточности
▪️ Thread — создание потоков вручную с использованием конструктора Thread позволяет получить максимальный контроль, но снижает гибкость. Рекомендуется использовать ExecutorService для более управляемого подхода.
▪️ ExecutorService — интерфейс для управления пулом потоков, позволяет эффективно управлять жизненным циклом потоков и управлять задачами с различными приоритетами.
▪️ Callable vs Runnable — используйте Runnable для простых задач без возврата значений и Callable для задач с возвращаемыми результатами.
▪️ ForkJoinPool — специализированный пул потоков для задач, которые могут быть разбиты на более мелкие параллельные подзадачи, например, при решении рекурсивных задач.
🔹 Синхронизация
▪️ synchronized — это простой способ синхронизации, который подходит для мелких блоков кода. Однако может привести к блокировкам и снижению производительности при интенсивной нагрузке.
▪️ ReentrantLock — предпочтительнее в сценариях с большим количеством потоков и блокировок. Она дает больше контроля, например, возможность прерывания или проверки блокировки.
▪️ ReadWriteLock — используется, когда большая часть потоков только читает данные. Это повышает производительность, так как чтение может происходить параллельно.
▪️ CountDownLatch и CyclicBarrier — удобные инструменты для координации потоков в ситуации, когда несколько потоков должны дождаться выполнения определенных задач.
🔹 Состояния потоков и их управление
▪️ Thread.join() — блокирует вызывающий поток до тех пор, пока не завершится указанный поток. Полезно для синхронизации выполнения различных частей программы.
▪️ Thread.sleep() — приостановка потока на заданный интервал. Не стоит использовать ее для ожидания условий, используйте wait() и notify() для работы с мониторами.
▪️ Thread.interrupt() — сигнализирует потоку о том, что ему нужно завершиться. Это полезно при долгих операциях или ожидающих потоках, которые могут быть отменены.
🔹 Безопасность данных
▪️ ThreadLocal — позволяет каждому потоку иметь собственную копию переменной, что минимизирует проблемы с синхронизацией.
▪️ Atomic classes — обеспечивают атомарные операции с переменными, что повышает производительность, избегая блокировок.
▪️ volatile — используется для переменных, значения которых могут быть изменены несколькими потоками. Гарантирует видимость изменений между потоками, но не синхронизирует доступ к данным.
🔹 Производительность и оптимизация
▪️ Immutable Objects — неизменяемые объекты позволяют избежать проблем синхронизации, так как они безопасны для многопоточного доступа.
▪️ ForkJoinPool — при параллельных задачах, например, при работе с большими объемами данных, используйте ForkJoinPool для более эффективного распределения нагрузки между потоками.
▪️ ExecutorService.submit() — для более высокоуровневого контроля и получения результата используйте submit() с объектом Future вместо execute().
🔹 Дополнительно
▪️ CompletableFuture — для асинхронных операций и управления результатами выполнения в будущем. Это удобный способ для работы с неблокирующими асинхронными операциями.
▪️ Parallel Streams (Java 8+) — используйте параллельные потоки для упрощения многопоточных операций. Например, при обработке коллекций используйте stream().parallel() для распараллеливания задач.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13🔥8👍6
Забудьте про System.out.println() в логике — используйте Evaluate Expression прямо во время отладки, чтобы проверить любые значения на лету.
🔹 Что делает
— Позволяет выполнять произвольные выражения прямо во время паузы
— Работает с контекстом текущего стека: переменные, поля, this
— Поддерживает сложные конструкции: myList.stream().filter(...).collect(...)
🔹 Зачем это нужно
— Позволяет быстро проверять гипотезы при отладке
— Избавляет от лишних логов или временных переменных
— Помогает исследовать поведение без изменения кода
🔹 Как использовать
— Поставьте breakpoint и запустите Debug
— Когда выполнение остановится, нажмите Alt + F8
— Введите выражение и нажмите Evaluate
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤1🔥1
JMeter — это инструмент для нагрузочного тестирования, который позволяет имитировать большое количество пользователей и запросов для оценки производительности веб-приложений и серверов.
Он идеально подходит для проверки стабильности приложения под нагрузкой, анализа времени отклика и поведения системы в условиях высоких нагрузок. JMeter можно использовать как для тестирования REST API, так и для сложных сценариев с использованием UI.
Преимущества JMeter:
— Поддержка различных типов тестирования: HTTP, FTP, баз данных и WebSocket.
— Гибкость при настройке нагрузки (параметры виртуальных пользователей, сценарии).
— Интеграция с CI/CD (Jenkins, GitLab CI).
— Расширенные отчёты с графиками и статистикой.
— Плагинная система для расширения функционала.
— Возможность интеграции с другими инструментами для мониторинга и анализа (например, Grafana).
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤3👍2
Виртуальные потоки вызывают много разногласий в кругах джавистов. Разобраться что к чему поможет Владимир Красильщик, pragmatic Java Developer, 01.tech. 30 августа он выступит на JVM Day в штаб-квартире Т-Банка. Расскажет про инженерный подход, основанный на измерениях и про реализации на платформенных и виртуальных потоках с ReentrantLock, через synchronized-секцию и на акторной модели, реализованной на vert.x
▪️На мероприятии также покажут демоверсии продуктов Т-Банка и других компаний, написанных на Java и Scala.
▪️Половина собранных средств Т-Банк планирует направить региональным вузам, которые готовят начинающих ИТ-специалистов. На сайте феста речь про КФУ (ИТИС) в Казани, УрФУ в Екатеринбурге и факультет вычислительной техники РГРТУ в Рязани. Так организаторы хотят поддержать развитие ИТ не только в столице, но и в других городах страны.
Для прохода на JVM Day необходимо заранее зарегистрироваться.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4❤1
Нужно отслеживать, кто что сделал в приложении: создал пользователя, обновил заказ или удалил файл? Реализуйте модуль аудита, который не просто логирует в консоль, а сохраняет структурированные события в базу или брокер. AI поможет с шаблоном, который можно встроить в любой микросервис.
📝 Промпт:
Generate a reusable audit logging module for a Spring Boot 3 application.
— Use Spring AOP to intercept service-layer methods annotated with @Auditable.
— Capture method name, parameters, execution time, and authenticated user details.
— Log audit events asynchronously to Kafka with a custom AuditEvent structure.
— Use JSON for message serialization and include correlation IDs in headers.
— Include fallback to local file logging in case of Kafka failure.
— Add integration with Spring Security to extract user identity from the context.
— Write unit and integration tests using JUnit 5 and Testcontainers.
— Добавьте
Implement audit event persistence to PostgreSQL using Spring Data JPA
, чтобы хранить критические события даже при сбоях брокера.— Добавьте
Include context metadata (request IP, user-agent) using ServletRequest attributes
, чтобы повысить трассируемость действий пользователя.— Добавьте
Add audit dashboard using Spring Boot Admin and Grafana
, чтобы визуализировать действия и аномалии в реальном времени.— Добавьте
Integrate OpenTelemetry spans around auditing logic
, чтобы отслеживать поток аудита между микросервисами на уровне трассировки.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2❤1
🎧 Что послушать — #подкаст
🔹 Javaswag #77
Дата выпуска: 21 мая 2025
Ведущий: Дмитрий Волыхин
Гость: Андрей Бреслав, создатель Kotlin
Продолжительность: примерно 1 час 53 минуты
В выпуске обсуждают историю создания Kotlin, его эволюцию и особенности, экосистему и проблемы, мультиплатформенный подход, влияние Java, ИИ и инновации — всё честно, без прикрас.
🔹 Ключевые темы выпуска
00:00 — История создания Kotlin
10:11 — Разработка языка
14:40 — Этапы развития языка
19:16 — Влияние Java
23:44 — Неоднозначность грамматики
30:35 — Дженерики
35:57 — Успех Kotlin
41:27 — Проблемы экосистемы
46:30 — Мультиплатформа
54:05 — Выгорание
01:01:03 — Работа с языками программирования
01:10:30 — AI и его влияние
01:18:53 — Язык программирования следующего поколения
01:20:26 — Kotlin и Java: сравнение
01:28:45 — Swing и мультиплатформа
01:31:55 — Swift и Objective‑C
01:34:41 — Непопулярное мнение
01:39:30 — Будущее AI
01:42:52 — Инновации
01:45:09 — Проблемы амбициозных идей
01:46:28 — Инновации в корпорациях и стартапах
01:50:21 — Продуктивность
🔗 Слушать выпуск
🐸 Библиотека джависта #буст
🔹 Javaswag #77
Дата выпуска: 21 мая 2025
Ведущий: Дмитрий Волыхин
Гость: Андрей Бреслав, создатель Kotlin
Продолжительность: примерно 1 час 53 минуты
В выпуске обсуждают историю создания Kotlin, его эволюцию и особенности, экосистему и проблемы, мультиплатформенный подход, влияние Java, ИИ и инновации — всё честно, без прикрас.
🔹 Ключевые темы выпуска
00:00 — История создания Kotlin
10:11 — Разработка языка
14:40 — Этапы развития языка
19:16 — Влияние Java
23:44 — Неоднозначность грамматики
30:35 — Дженерики
35:57 — Успех Kotlin
41:27 — Проблемы экосистемы
46:30 — Мультиплатформа
54:05 — Выгорание
01:01:03 — Работа с языками программирования
01:10:30 — AI и его влияние
01:18:53 — Язык программирования следующего поколения
01:20:26 — Kotlin и Java: сравнение
01:28:45 — Swing и мультиплатформа
01:31:55 — Swift и Objective‑C
01:34:41 — Непопулярное мнение
01:39:30 — Будущее AI
01:42:52 — Инновации
01:45:09 — Проблемы амбициозных идей
01:46:28 — Инновации в корпорациях и стартапах
01:50:21 — Продуктивность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2❤1
🧠 Как выжать максимум из резюме на HeadHunter
Хорошее резюме — это только начало. Даже если вы профи, в поиске работы многое решает видимость анкеты в выдаче. А вот тут начинается борьба за внимание рекрутера.
🚧 Проблема: сотни схожих резюме. Ваше может просто затеряться.
🎯 Что помогает реально продвинуть резюме вверх:
— Автоподнятие и ручные апдейты
— Правильное имя файла резюме
— Ключевые слова, которых ищут HR
— Механика «откликов + запросы»
— И даже… использование разных браузеров (да-да)
🔗 Все 9 приёмов с примерами — в статье.
🐸 Библиотека джависта #буст
Хорошее резюме — это только начало. Даже если вы профи, в поиске работы многое решает видимость анкеты в выдаче. А вот тут начинается борьба за внимание рекрутера.
🚧 Проблема: сотни схожих резюме. Ваше может просто затеряться.
🎯 Что помогает реально продвинуть резюме вверх:
— Автоподнятие и ручные апдейты
— Правильное имя файла резюме
— Ключевые слова, которых ищут HR
— Механика «откликов + запросы»
— И даже… использование разных браузеров (да-да)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍3👏1🤔1
Принципе подстановки Лискова нередко трактуют слишком формально или упрощенно. Простой ответ: LSP требует, чтобы объекты подклассов могли заменять объекты базового класса без изменения поведения программы.
Однако, давайте разберем это более подробно.
🔹 Что на самом деле означает LSP?
В классическом виде (по Барбаре Лисков):
Объекты программы должны быть заменяемы экземплярами их подтипов без изменения правильности работы программы.
Это значит, что любой класс-наследник должен вести себя так же, как и его родитель, не нарушая логики работы программы. Программа должна продолжать работать корректно, если один объект заменяется другим, даже если их реализации отличаются.
🔹 Часто встречаемые ошибки трактования LSP
1. Подмена функционала
Проблемы могут возникнуть, если подкласс значительно меняет поведение метода родительского класса. Например, если метод в подклассе требует дополнительных условий или приводит к ошибкам, это нарушает принцип.
class Bird {
void fly() { ... }
}
class Chicken extends Bird {
@Override
void fly() {
throw new UnsupportedOperationException("Chicken can't fly");
}
}
Этот пример нарушает LSP, потому что подкласс не может выполнять все действия родителя.
2. Нарушение инвариантов
Если подкласс добавляет новые ограничения или меняет условия, которые предполагались в родительском классе, это может привести к неожиданным результатам. Например, если родительский класс предполагает, что его методы могут работать в определённых диапазонах значений, а в подклассе эти значения не допустимы, это также нарушает принцип.
class Rectangle {
int width, height;
void setWidth(int width) { this.width = width; }
void setHeight(int height) { this.height = height; }
}
class Square extends Rectangle {
@Override
void setWidth(int width) {
this.width = this.height = width;
}
@Override
void setHeight(int height) {
this.height = this.width = height;
}
}
В этом примере подкласс Square изменяет логику работы с размерами, нарушая ожидаемое поведение родительского класса.
🔹 Что на практике важно понимать о LSP
— Соблюдение контракта родительского класса
Подклассы должны соблюдать контракт родительского класса, а не изменять его. Это означает, что если родительский класс предполагает выполнение определённых операций, подкласс не должен их нарушать.
— Логика не должны быть нарушена, лишь расширена
Подклассы должны только дополнять, а не изменять поведение родительского класса. Это должно обеспечивать предсказуемость программы.
— Наследование — это не просто копирование, а расширение возможностей
Правильное наследование позволяет создавать более специфичные классы без нарушения логики родительского класса.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤5🔥3
Случайно удалили строки, или вдруг не можете вспомнить, что только что меняли? Здесь на помощь приходит Local History.
🔹 Что делает
— Хранит локальные изменения файлов даже без коммитов
— Сохраняет историю редактирования на уровне IDE
— Позволяет вернуться к любой версии файла за определенный период времени
🔹 Зачем это нужно
— Спасает, если случайно удалил важные строки или сделал нежелательное изменение
— Не требует настроек или использования системы контроля версий
— Мгновенно восстанавливает состояние файла без лишних усилий
🔹 Как использовать
— Щелкните правой кнопкой на файле, выберите Local History -> Show History
— Выберите нужную версию и восстановите изменения
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍6🔥3
Хотите создать мощный инструмент мониторинга для ваших микросервисов? Используйте AI, чтобы автоматически генерировать код для сбора метрик, логирования и трассировки запросов в реальном времени. Это поможет эффективно отслеживать производительность и устранять узкие места в системе.
📝 Промпт:
Generate a monitoring system for microservices in a Spring Boot 3 application.
— Integrate Spring Actuator to expose application health metrics and endpoints.
— Use Micrometer for collecting metrics such as response time, request count, and error rates.
— Implement distributed tracing with OpenTelemetry and Zipkin for tracking requests across multiple services.
— Enable log aggregation with ELK Stack (Elasticsearch, Logstash, and Kibana) for centralized log management.
— Set up Prometheus and Grafana for visualizing real-time performance metrics on custom dashboards.
— Configure automatic health checks and alerting using Spring Boot Admin and Prometheus Alerts.
— Create custom metrics to track domain-specific application performance, such as user sign-ups or payment processing times.
— Добавьте
Integrate application performance profiling using JProfiler
для захвата и анализа подробных данных о производительности.— Добавьте
Set up integration with Datadog or New Relic
для получения дополнительных аналитических данных и обнаружения аномалий в приложении.— Добавьте
Implement circuit breaker patterns with Resilience4j
для повышения стабильности системы при высоком трафике или сбоях сервисов.— Добавьте
Enable traceability for all API calls with correlation IDs
для обеспечения сквозной трассировки запросов в распределенной системе.Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2🔥1😁1🥱1