Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
SOLID — это аббревиатура, обозначающая пять принципов дизайна, которые позволяют создавать сопровождаемое, масштабируемое и надежное ПО. Роберт К. Мартин ввел эти принципы, чтобы помочь программистам писать высококачественный код. Изначально предназначенные для объектно-ориентированного программирования, принципы
SOLID
применимы и к другим языкам, например Kotlin
. Они направлены на обеспечение чистоты кода и улучшение дизайна программного обеспечения.Вот 5 принципов SOLID:
Single Responsibility Principle (SRP) — принцип единственной ответственности.
Open-Closed Principle (OCP) — принцип открытости/закрытости.
Liskov Substitution Principle (LSP) — принцип подстановки Лисков.
Interface Segregation Principle (ISP) — принцип разделения интерфейса.
Dependency Inversion Principle (DIP) — принцип инверсии зависимостей.
Теперь рассмотрим подробнее каждый из этих принципов с примерами выполнения и нарушения.
Принцип единственной ответственности
Принцип единственной ответственности является одним из принципов SOLID в объектно-ориентированном программировании. Смысл его заключается в том, что для каждого конкретного класса должно быть определено только одно назначение. Другими словами, каждый класс должен иметь только одну обязанность или одно задание.
SRP полезен для поддержания классов и функций, поскольку позволяет сохранить их организованность и легкость их восприятия. Определяя классу несколько обязанностей, вы непреднамеренно можете повлиять на решение этим классом других задач, что приведет к неожиданному поведению, ошибкам и увеличению затрат на сопровождение.
Теперь рассмотрим ситуации нарушения и выполнения этого принципа.
Нарушение:
// Нарушение принципа единственной ответственности
// В данном примере класс System пытается одновременно обрабатывать множество различных ситуаций.
// Такой подход может привести к серьезным проблемам в будущем.
class SystemManager {
fun addUser(user: User) { }
fun deleteUser(user: User) { }
fun sendNotification(notification:String) {}
fun sendEmail(user: User, email: String) {}
}
В данном примере класс
System
пытается обработать множество различных ситуаций в одном и том же месте. Такой подход может привести к серьезным проблемам в будущем.Выполнение:
// Выполнение принципа единственной отвественности.
// Как видно из этого примера, мы разделили класс System на определенные части
// и поместили функции в соответствующие классы.
class MailManager() {
fun sendEmail(user: User, email: String) {}
}
class NotificationManager() {
fun sendNotification(notification: String) {}
}
class UserManager {
fun addUser(user: User) {}
fun deleteUser(user: User) {}
}
Как видно из этого примера, класс System разделен на определенные части и функции помещены в соответствующие классы.
Принцип открытости/закрытости
Принцип “открытости/закрытости” — это правило объектно-ориентированного программирования, согласно которому классы, модули, функции и другие программные объекты должны быть открыты для расширения, но закрыты для изменений. Это означает, что вы можете добавлять новые элементы в класс, не модифицируя его исходный код. Таким образом, вместо изменения самого класса для добавления новых возможностей можно написать новый код, использующий существующий класс. Вследствие этого, код становится более удобным для сопровождения и повторного использования.
Теперь рассмотрим ситуации нарушения и корректного выполнения этого принципа.
📌 Читать дальше
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Дайджест полезных материалов из мира Java за неделю
Почитать:
— Создание и тестирование gRPC сервиса (Spring Boot приложение)
— Вкатываемся в Java Backend, сравниваем Concurrency и Parallelism, учимся работать с Git в среде разработки и знакомимся с классом RandomAccessFile
— Я хотел сломать Java и я это сделал
— Как не стоит работать с HashSet в Java?
— Борьба с временем ответа сервиса
— Используем Elasticsearch вместе со Spring Boot
— Пишем простую интеграцию с GitHub используя feign и jsonschema2pojo maven plugin
— Книга «Грокаем функциональное программирование»
— Учимся бесплатно деплоить Java (и не только) приложения (Docker, CircleCI, Google Cloud)
— Inversion of Control(IoC) ve Dependency Injection(DI)
— What are the benefits of using Java enterprise solutions?
— Refactoring my code
— Integrating a Vaadin Web Application into External Webpages
— Hintergrundfarbe oder Hintergrundbild direkt in PDF-Dokument mit Java einstellen
— Java-Fähigkeiten: Einfügen von Text- oder Bild-Wasserzeichen in Word-Dokumente mit Java-Programmierung
— Organizing custom metrics for effective application monitoring
— PDF-Verwaltung: Vergleich von PDF-Dokumenten mit Java, um Unterschiede im Inhalt zu finden
— Streaming Queries for Real-Time Analytics in Spring Boot
— Java Design Patterns in Easy Way Series
Посмотреть:
🌐 What is an atomic variable? - Cracking the Java Coding Interview (⏱ 01:00)
🌐 What is a Record? - Cracking the Java Coding Interview (⏱ 01:00)
🌐 Generational ZGC (⏱ 01:20)
🌐 Choosing between ArrayList and LinkedList - JEP Cafe #20 (⏱ 30:50)
🌐 Как стать тестировщиком — QA лид в Европе Оксана Мельникова — Как мы попали в айти (⏱ 49:52)
Хорошего дня!
@javatg
Почитать:
— Создание и тестирование gRPC сервиса (Spring Boot приложение)
— Вкатываемся в Java Backend, сравниваем Concurrency и Parallelism, учимся работать с Git в среде разработки и знакомимся с классом RandomAccessFile
— Я хотел сломать Java и я это сделал
— Как не стоит работать с HashSet в Java?
— Борьба с временем ответа сервиса
— Используем Elasticsearch вместе со Spring Boot
— Пишем простую интеграцию с GitHub используя feign и jsonschema2pojo maven plugin
— Книга «Грокаем функциональное программирование»
— Учимся бесплатно деплоить Java (и не только) приложения (Docker, CircleCI, Google Cloud)
— Inversion of Control(IoC) ve Dependency Injection(DI)
— What are the benefits of using Java enterprise solutions?
— Refactoring my code
— Integrating a Vaadin Web Application into External Webpages
— Hintergrundfarbe oder Hintergrundbild direkt in PDF-Dokument mit Java einstellen
— Java-Fähigkeiten: Einfügen von Text- oder Bild-Wasserzeichen in Word-Dokumente mit Java-Programmierung
— Organizing custom metrics for effective application monitoring
— PDF-Verwaltung: Vergleich von PDF-Dokumenten mit Java, um Unterschiede im Inhalt zu finden
— Streaming Queries for Real-Time Analytics in Spring Boot
— Java Design Patterns in Easy Way Series
Посмотреть:
🌐 What is an atomic variable? - Cracking the Java Coding Interview (⏱ 01:00)
🌐 What is a Record? - Cracking the Java Coding Interview (⏱ 01:00)
🌐 Generational ZGC (⏱ 01:20)
🌐 Choosing between ArrayList and LinkedList - JEP Cafe #20 (⏱ 30:50)
🌐 Как стать тестировщиком — QA лид в Европе Оксана Мельникова — Как мы попали в айти (⏱ 49:52)
Хорошего дня!
@javatg
This media is not supported in your browser
VIEW IN TELEGRAM
🚀 Event-Driven Declarative Orchestrator
Бесконечно масштабируемая, событийно-ориентированная, не зависящая от языка платформ, написаная на Java, для оркестровки и планирования, позволяющая управлять миллионами рабочих процессов декларативно в коде.
Kestra - это универсальный оркестровщик с открытым исходным кодом, который позволяет легко выполнять как запланированные, так и управляемые событиями рабочие процессы. Благодаря использованию лучших практик Infrastructure as Code для оркестровки данных, процессов и микросервисов, вы можете создавать надежные рабочие процессы и уверенно управлять ими.
Всего за несколько строк кода можно создать поток прямо из пользовательского интерфейса. Благодаря декларативному интерфейсу
• Github
• Проект
@javatg
Бесконечно масштабируемая, событийно-ориентированная, не зависящая от языка платформ, написаная на Java, для оркестровки и планирования, позволяющая управлять миллионами рабочих процессов декларативно в коде.
Kestra - это универсальный оркестровщик с открытым исходным кодом, который позволяет легко выполнять как запланированные, так и управляемые событиями рабочие процессы. Благодаря использованию лучших практик Infrastructure as Code для оркестровки данных, процессов и микросервисов, вы можете создавать надежные рабочие процессы и уверенно управлять ими.
Всего за несколько строк кода можно создать поток прямо из пользовательского интерфейса. Благодаря декларативному интерфейсу
YAML
для определения логики оркестровки заинтересованные стороны бизнеса могут участвовать в процессе создания рабочего процесса.• Github
• Проект
@javatg
This media is not supported in your browser
VIEW IN TELEGRAM
Тестирование функциональности системы является одним из важнейших этапов разработки программного обеспечения и инженерных процессов.
Оно гарантирует, что система или программное приложение работает так, как ожидается, соответствует требованиям пользователей и надежно функционирует.
Здесь мы рассмотрим лучшие способы:
1. Юнит-тестирование: Обеспечивает корректную работу отдельных компонентов кода в изоляции.
2. Интеграционное тестирование: Проверяет, что различные части системы работают без сбоев.
3. Системное тестирование: Оценивает соответствие всей системы требованиям пользователя и ее производительность.
4. Нагрузочное тестирование: Проверяет способность системы справляться с высокими нагрузками и выявляет проблемы с производительностью.
5. Тестирование на ошибки: Оценивается, как программное обеспечение обрабатывает недействительные входные данные и условия ошибок.
6. Автоматизация тестирования: Автоматизирует выполнение тестовых примеров для повышения эффективности, повторяемости и уменьшения количества ошибок.
Как вы подходите к тестированию функциональности системы в своих проектах по разработке программного обеспечения, пишите в комментариях.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Анализ данных (Data analysis)
📒 GigaChat нового поколения.
Разработчики @gigachat_bot изменили подход к обучению модели, а потому практически все умения модели были улучшены. В частности, речь идет о сокращении текстов, ответов на вопросы и генерации идей.
Появился и бот GigaChat в социальной сети «ВКонтакте» — после активации, его можно использовать для самых разных целей: от создания текстов до генерации изображений (за счет интеграции с Kandinsky).
Число уникальных пользователей GigaChat достигло 1 млн.
• Попробовать
@data_analysis_ml
Разработчики @gigachat_bot изменили подход к обучению модели, а потому практически все умения модели были улучшены. В частности, речь идет о сокращении текстов, ответов на вопросы и генерации идей.
Появился и бот GigaChat в социальной сети «ВКонтакте» — после активации, его можно использовать для самых разных целей: от создания текстов до генерации изображений (за счет интеграции с Kandinsky).
Число уникальных пользователей GigaChat достигло 1 млн.
• Попробовать
@data_analysis_ml
Graph-support - это реализация инструмента graphviz на основе Java без каких-либо дополнительных зависимостей.
Graphviz невероятно полезен для быстрого создания изображений или графиков, но его часто необходимо загружать и устанавливать, что не всегда идеально, особенно в производственных средах.
С помощью этой реализации Java вы можете легко генерировать изображения для своих графиков, что значительно облегчает понимание происходящего.
GitHub ⬅️
@javatg
Graphviz невероятно полезен для быстрого создания изображений или графиков, но его часто необходимо загружать и устанавливать, что не всегда идеально, особенно в производственных средах.
С помощью этой реализации Java вы можете легко генерировать изображения для своих графиков, что значительно облегчает понимание происходящего.
GitHub ⬅️
@javatg
Полезный репозиторий, в котором представлены все основные принципы чистой архитектуры: разделение ответственности, слоев, представления и данных.
Проект написан на Kotlin с применением Jetpack Compose и Coroutines. В нём есть юнит-тесты, интеграционные и анализ качества кода.
• Github
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Дайджест полезных материалов из мира Java за неделю
Почитать:
— Как потратить дни, чтобы сэкономить секунды: продвинутые коммиты в GitLab
— Разработка децентрализованных приложений на Spring Boot: инструменты Web3 Tech
— Асинхронный API First
— Как упростить себе жизнь: удобные юнит-тесты с JUnit и AssertJ
— Набор инструментов backend reliability инженера
— Использование записей в качестве проекций в JPA
— How to Connect Java Applications to Databases with JDBC
— Improving Code Quality in Java: Best Practices and Examples
— How Java works ?
— Tech Watch #3 — October, 20, 2023
— Lista em Java Sem Valores Repetidos
— Self-validated Java Objects
— Understanding the Strategy Design Pattern with Python and Java
— [Digest] Java, Kotlin, Spring, Cloud, and More - Episode 14
— Array Methods in Java
— Leveraging Java Reflection to Improve Code Quality in Spring Boot
Посмотреть:
🌐 Java's G1 Garbage Collector (⏱ 25:55)
🌐 Java 21… and Beyond (⏱ 48:30)
🌐 Brian Goetz Answers Your Java Questions (⏱ 33:08)
🌐 How can you invoke a method using the Reflection API? - Cracking the Java Coding Interview (⏱ 00:58)
🌐 What is a ConcurrentModification Exception? - Cracking the Java Coding Interview (⏱ 00:59)
🌐 Как не забыть программирование, если ты менеджер и больше не пишешь код (⏱ 01:07:54)
Хорошего дня!
@javatg
Почитать:
— Как потратить дни, чтобы сэкономить секунды: продвинутые коммиты в GitLab
— Разработка децентрализованных приложений на Spring Boot: инструменты Web3 Tech
— Асинхронный API First
— Как упростить себе жизнь: удобные юнит-тесты с JUnit и AssertJ
— Набор инструментов backend reliability инженера
— Использование записей в качестве проекций в JPA
— How to Connect Java Applications to Databases with JDBC
— Improving Code Quality in Java: Best Practices and Examples
— How Java works ?
— Tech Watch #3 — October, 20, 2023
— Lista em Java Sem Valores Repetidos
— Self-validated Java Objects
— Understanding the Strategy Design Pattern with Python and Java
— [Digest] Java, Kotlin, Spring, Cloud, and More - Episode 14
— Array Methods in Java
— Leveraging Java Reflection to Improve Code Quality in Spring Boot
Посмотреть:
🌐 Java's G1 Garbage Collector (⏱ 25:55)
🌐 Java 21… and Beyond (⏱ 48:30)
🌐 Brian Goetz Answers Your Java Questions (⏱ 33:08)
🌐 How can you invoke a method using the Reflection API? - Cracking the Java Coding Interview (⏱ 00:58)
🌐 What is a ConcurrentModification Exception? - Cracking the Java Coding Interview (⏱ 00:59)
🌐 Как не забыть программирование, если ты менеджер и больше не пишешь код (⏱ 01:07:54)
Хорошего дня!
@javatg
Динамическое программирование - это подход, позволяющий разбивать задачи на более мелкие подзадачи.
Это полезный навык для решения задач
min change, max path sum
и других вопросов на собеседовании по кодингу.В этом бесплатном курсе вы изучите методы динамического программирования на языке Java.
📌 Video
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
В этом руководстве подробно описано, как реализовать аутентификацию на основе токенов с помощью Spring Boot, Spring Security, JWT и базы данных MySQL.
https://www.javaguides.net/2023/05/spring-boot-spring-security-jwt-mysql.html
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Условие: даны две строки, необходимо выяснить являются они идентичными после удаления символов путем использования клавиши backspace (символ #).
Если строка пустая, то backspace оставляет её пустой.
Пример:
Ввод: s = "ab#c", t = "ad#c"
Вывод: true
Объяснение: обе строки после использования удаления символов образуют сроку "ac"
Ввод: s = "ab##", t = "c#d#"
Вывод: true
Ввод: s = "a#c", t = "b"
Вывод: false
📌 Решение задачи
Пишите свое решение в комментариях👇
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
#Java #JPA #Hibernate
Совет: show-sql - это самый простой (но не самый лучший!) способ увидеть SQL запрос, сгенерированный
Совет: show-sql - это самый простой (но не самый лучший!) способ увидеть SQL запрос, сгенерированный
Hibernate
. Это вывод можно немного улучшить, включив форматирование, показав JPQL Query,
сгенерировавший запрос и включив подсветку, которая делает выходит запросы в красивом виде.Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Как устроены языки Java, C++ и Python?
▪️Java сначала компилирует исходный код в байткод, который не зависит от платформы и выполняется виртуальной машиной
▪️Компилируемые языки, такие как C++ и Go, перед выполнением преобразуют исходный код в машинный код с помощью компилятора. Скомпилированный машинный код затем может непосредственно выполняться процессором.
▪️Интерпретируемые языки, такие как Javascript и Ruby, не подвергаются компиляции. Вместо этого их код построчно обрабатывается интерпретатором во время выполнения. Однако современные движки JavaScript, такие как V8, также используют JIT-компиляцию для повышения производительности.
▪️Python представляет собой смесь двух миров. Сначала исходный код компилируется в платформонезависимый байткод, который затем построчно выполняется платформонезависимым интерпретатором. Кроме того, такие реализации, как PyPy, используют
В целом компилируемые языки обладают преимуществами в скорости, однако благодаря современным методам оптимизации грань между компилируемыми и интерпретируемыми языками становится все более размытой.
@javatg
▪️Java сначала компилирует исходный код в байткод, который не зависит от платформы и выполняется виртуальной машиной
Java
(JVM). JVM
может дополнительно повысить производительность, используя компиляцию Just-In-Time
(JIT) для преобразования байткода в машинный код во время выполнения.▪️Компилируемые языки, такие как C++ и Go, перед выполнением преобразуют исходный код в машинный код с помощью компилятора. Скомпилированный машинный код затем может непосредственно выполняться процессором.
▪️Интерпретируемые языки, такие как Javascript и Ruby, не подвергаются компиляции. Вместо этого их код построчно обрабатывается интерпретатором во время выполнения. Однако современные движки JavaScript, такие как V8, также используют JIT-компиляцию для повышения производительности.
▪️Python представляет собой смесь двух миров. Сначала исходный код компилируется в платформонезависимый байткод, который затем построчно выполняется платформонезависимым интерпретатором. Кроме того, такие реализации, как PyPy, используют
JIT-компиляцию
для повышения скорости работы.В целом компилируемые языки обладают преимуществами в скорости, однако благодаря современным методам оптимизации грань между компилируемыми и интерпретируемыми языками становится все более размытой.
@javatg