Найти тему
🗄 Борьба за Доступ к Данным: Data Access Object (DAO) vs. Repository Совсем недавно проходил квиз(ССЫЛКА ТУТ). Там было обширное количество вопросов связанных с применением баз данных в Java для получения доступа к данных и манипуляциями над ними. Один из вопросов был посвящен Data Access Object (DAO). Но, сегодня мы бросим взгляд на DAO и идущий рядом с ним шаблон проектирования Repository. Оба шаблона проектирования применяются для управления доступом к данным в информационных системах, но между ними есть различия, что и определяют когда и почему выбрать один шаблон, а не другой. ▶️ Data Access Object (DAO) ➖Определение. DAO предоставляет абстракцию для доступа к данным, изолируя бизнес-логику от деталей доступа. ➖Основная Цель. Сосредоточиться на манипуляции с данными и скрыть детали их хранения. ➖Пример Интерфейса ``` public interface UserDAO {   User getById(long id);   void save(User user);   void update(User user);   void delete(User user); } ``` ▶️ Repository ➖Определение. Repository также служит для управления доступом к данным, но с более высокоуровневой абстракцией, ориентированной на агрегации данных. ➖Основная Цель. Предоставить интерфейс для работы с коллекцией объектов, скрывая детали хранения и запросов. ➖Пример Интерфейса ``` public interface UserRepository {   User findById(long id);   List<User> findAll();   void save(User user);   void update(User user);   void delete(User user); } ``` ▶️ Способы Взаимодействия с Объектами ➖DAO. Обычно взаимодействует с отдельными объектами или таблицами в базе данных. ➖Repository. Ориентирован на работу с коллекциями объектов, обеспечивает методы для поиска всех объектов, фильтрации и других операций с коллекцией. ▶️ Гибкость и Уровень Абстракции ➖DAO. Предоставляет более низкоуровневую абстракцию, подразумевая, что клиент может более явно управлять операциями с данными. ➖Repository. Предоставляет более высокоуровневую абстракцию для работы с коллекцией объектов, что может быть удобным для клиентского кода. ▶️ Область Применения ➖DAO. Часто используется, когда нужен более прямой и точечный доступ к данным. ➖Repository. Подходит, когда важна работа с коллекциями данных, например, при работе с агрегатами. ▶️ Производительность ➖DAO. Может быть более производительным, поскольку предоставляет более низкоуровневый доступ к данным. ➖Repository. Обеспечивает более высокоуровневую абстракцию, что может потребовать дополнительной работы для оптимизации. ▶️ Пример Комбинации ➖DAO и Repository. Иногда комбинированный подход может быть эффективен, где DAO используется для операций с отдельными объектами, а Repository для работы с коллекциями. ⬇️ А тебе когда-либо приходилось реализовывать DAO или Repository? Пиши в комментариях 👍 Поставь лайк этому посту, если тебе нравятся наш контент Заглядывай к нам в Телеграм канал и забирай полезный и актуальный контент из мира программирования
5 месяцев назад
⚙️ Оптимизация Производительности: Как конфигурировать выделяемую память для JVM Правильные настройки могут существенно повлиять на работу программы, улучшив ее производительность и эффективность. Вот некоторые способы, как этого можно достичь. 0️⃣ Размер Heap Управление кучей (Heap) - ключевой аспект. Установите оптимальные значения для -Xms (начальный размер кучи) и -Xmx (максимальный размер кучи) в зависимости от требований приложения. Это позволит избежать частых сборок мусора и улучшит общую производительность. java -Xms512m -Xmx1024m -jar your-application.jar 1️⃣ Сборка мусора (Garbage Collection) Выбор правильного алгоритма сборки мусора может значительно сказаться на производительности. Существую различные опции, такие как G1, CMS, или Parallel GC, и выберите наилучшую подходящую для вашего приложения. java -XX:+UseG1GC -jar your-application.jar 2️⃣ Мониторинг и Оптимизация Утилиты мониторинга, такие как VisualVM или Mission Control могут анализировать поведение приложения и помогают оптимизировать конфигурацию. Параметры, такие как -XX:+PrintGCDetails и -XX:+PrintGCDateStamps служать для подробного отслеживания сборок мусора. java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar your-application.jar 3️⃣ Выделение Metaspace Если приложение интенсивно использует рефлексию, можно увеличить выделенное пространство для метаданных (Metaspace) с помощью параметра -XX:MaxMetaspaceSize. java -XX:MaxMetaspaceSize=256m -jar your-application.jar 4️⃣ Оптимизация Накладных Расходов Подбирать значения конфигурационных параметров необходимо в соответствии с требованиями к приложению. Стоит избегать излишних накладных расходов, таких как слишком частая сборка мусора. Такие процессы, стоит регулировать в зависимости от характера работы приложения. java -XX:-UseBiasedLocking -XX:+OptimizeStringConcat -jar your-application.jar ⬇️ А ты часто уделяешь внимание оптимизации памяти  при работе JVM? Пиши в комментариях 👍 Поставь лайк этому посту, если тебе нравятся наш контент Заглядывай к нам в Телеграм канал и забирай полезный и актуальный контент из мира программирования
5 месяцев назад
🧑‍💻 Значение чистого кода в Python, Java и Kotlin: Ключевые преимущества и инструменты для поддержания порядка Привет, всем! Макс вещает 😼 Все мы умеем писать “говнокод”, все из нас время от время этим занимаются. А те кто говорят, что так не делают, немного не договаривают или просто код перестали писать. Пробежимся мы с вами по очень популярной и никогда не теряющей актуальности теме - Clean code. Главный вопрос, зачем писать чистый код? Погнали разбираться. ▶️ Улучшение читаемости Чистый код легко читать и понимать. Это необходимо для себя и ваших коллег, особенно при совместной работе над проектом. Читаемость улучшает понимание логики и намерений автора кода. ▶️ Уменьшение количества ошибок Чистый код облегчает процесс отладки и уменьшает вероятность появления ошибок. Проект с хорошо поддерживаемым кодом требует меньше времени и усилий для обнаружения и устранения проблем. ▶️ Повышение эффективности поддержки Код написанный с соблюдением стандартов и лучших практик, делает процесс его поддержки более эффективным. Команды могут легко взаимодействовать с кодом, сокращая время на внесение изменений. Все это и даже более, давным давно изложил в серии своих книг знаменитый разработчик программного обеспечения Роберт Мартин (aka Uncle Bob). Отдельного внимания стоят его книги, которые и по сей день не теряют актуальности: 0️⃣ Clean Code: A Handbook of Agile Software Craftsmanship 1️⃣ The Clean Coder: A Code Of Conduct For Professional Programmers 2️⃣ Clean Architecture: A Craftsman's Guide to Software Structure and Design Однако, в разработке программного обеспечения есть всегда “но”. Как заставить разработчиков в команде следовать правилам чистого кода, если эти разработчики не читали подобные книги и читать не собираются. Именно тут и залетают инструменты для поддержания порядка в коде. Вот некоторые простые, но очень эффективные механизмы, которые зарекомендовали себя по всему миру: ▶️ Pylint для Python. Позволяет проводить статический анализ кода, обнаруживая проблемы стиля, ошибки и потенциальные улучшения. ▶️ Checkstyle для Java. Инструмент для анализа кода на соответствие стандартам и стилю. Предоставляет отчеты о качестве кода и возможных улучшениях. ▶️ Ktlint для Kotlin. Инструмент для анализа и форматирования кода на Kotlin в соответствии с заданными стандартами. Все это в комбинации с Continous Integration минимизирует усилия и затраты по поддержанию кода в относительно отличном состоянии. Да-да, именно в относительно. Нет измерения плохо или отлично, просто потому, что эта мера у каждого разработчика или группы разработчиков своя. Макс Добрынин Software Engineer ⬇️ А как ты поддерживаешь чистоту кода? Пиши в комментариях 👍 Поставь лайк этому посту, если тебе нравятся наш контент Заглядывай к нам в Телеграм канал и забирай полезный и актуальный контент из мира программирования
5 месяцев назад
❓ Подборка популярных вопросов с собеседования на позицию Middle Java Developer 1. Что такое Garbage Collection, и какие стратегии сборки мусора вы знаете? 2. Разница между HashMap и ConcurrentHashMap в Java. Когда бы вы использовали каждый из них? 3. Объясните принцип работы Spring IoC (Inversion of Control) и DI (Dependency Injection) в Spring Framework 4. Как работает аннотация @Transactional в Spring? В каких случаях она может привести к проблемам? 5. Расскажите о паттерне проектирования Singleton. Какие подходы к его реализации вы знаете? 6. Расскажите о работе с WeakHashMap в Java. В каких случаях использование слабых ссылок может быть полезным? 7. Как работает механизм автоупаковки (autoboxing) и автораспаковки (unboxing) в Java? В каких случаях это может привести к неожиданным результатам? 8. Что такое CompletableFuture в Java? Зачем необходим данный интерфейс? 9. Что такое Stream API и какие операции возможно выполнять с егопомощью? 10. Что такое Java Memory Model, и какие проблемы могут возникнуть при многопоточной работе с памятью? ⬇️ А какие вопросы задавали тебе на интервью? Пиши в комментариях 👍 Поставь лайк этому посту, если тебе нравятся наш контент Заглядывай к нам в Телеграм канал и забирай полезный и актуальный контент из мира программирования
5 месяцев назад
🧑‍💻 Современные стратегии развертывания приложений: Ключевые подходы к успешному внедрению изменений с использованием AWS Привет, всем! Макс вещает 😼 Давайте ка обсудим важную часть разработки современного программного обеспечения - стратегия развертывания приложений. А также рассмотрим, как Amazon Web Services (AWS) может быть важным инструментом в этом процессе. В мире постоянно меняющихся требований и высоких ожиданий пользователей выбор правильной стратегии развертывания может сделать процесс обновления вашего приложения более гладким и эффективным. И уж поверьте, когда у вас есть флот из 5-10 микросервисов, то развертывание становится той еще задачкой. Справедливости ради, 5-10 микросервисов на самом деле не так и много. Существуют системы, которые состоят из сотен микросервисов. Именно потому, нужно если не знать, то хотя бы понимать, что существуют различные стратегии развертывания. Вот некоторые в комбинации с возможностями AWS. ▶️ Canary Deployment Этот подход предполагает пошаговое внедрение изменений. В AWS вы можете использовать сервис AWS CodeDeploy для автоматизации развертывания и пошагового контроля того, какие экземпляры вашего приложения получают обновление. Цель - снизить риск развертывания новой версии, которая повлияет на рабочую нагрузку. Сервисы новой версии будут отдаваться пользователю постепенно. По мере того, как будет уверенность в стабильной рабочей нагрузке, будет происходить дальнейшая замена сервисов с новой версией, пока не произойдет окончательный переход всех необходимых сервисов на новую версию. ▶️ Blue-Green Deployment С AWS вы можете легко реализовать сине-зеленое развертывание, запуская новую версию вашего приложения на отдельной группе Amazon EC2 инстансов (зеленой инфраструктуре), а затем переключая трафик на нее с помощью Elastic Load Balancer. Таким образом, можно организовывать плавное внедрение новой версии сервиса и максимально избежать негативного опыта на стороне пользователя. В случае, если новая версия окажется нерабочей или будут встречены трудности, то без какой-либо трудности пользовательский трафик можно будет перевести в рабочую систему старой версии. ▶️ Rolling Deployment Представляют собой стратегию развертывания новой версии приложения, основной целью которой является избежание downtime. Такая стратегия реализуется путем создания одного экземпляра новой версии приложения, а затем отключения одного экземпляра старой версии до тех пор, пока все экземпляры не будут обновлены. Используя AWS Elastic Beanstalk или AWS CodeDeploy, можно реализовать плавное развертывание, обеспечивая постепенное обновление приложения на инстансах, что обеспечивает непрерывность работы системы. ▶️ Feature Toggles Deployment AWS SDKs и AWS Lambda могут быть использованы для реализации фич-тогглов, позволяя вам включать и выключать определенные функции приложения на основе условий и требований. Это становится особенно удобно, когда вы хотите внедрить новую функционал в тестовом режиме или для ограниченного количества пользователей. ▶️ Shadow Deployment Любые изменения в приложении развертываются на параллельной среде, имитирующей продакшн. Развернутые изменения не видны конечным пользователям, отсюда и термин shadow. Это скрытое развертывание позволяет наблюдать за поведением и влиянием изменений, не нарушая работу работающего приложения. С AWS Lambda и Amazon CloudWatch вы можете легко реализовать теневое развертывание, запуская новую версию функции в обход реального трафика и анализируя результаты в облаке. Конечно, AWS это просто океан возможностей. Там такое количество сервисов и может сложиться впечатление о том, что эти ребята реализовали все. Наверное так оно и есть, мир не стоит на месте, постоянно что-то новое внедряем. И как можно судить, такой важный вопрос как развертывание тоже не обошли стороной. Макс Добрынин Software Engineer ⬇️ А ты бы хотел поработать с AWS или предпочитаешь другой продукт? Пиши в комментариях 👍 Поставь лайк этому посту, если тебе нравятся наш контент Заглядывай к нам в Телеграм канал и забирай полезный и актуальный контент из мира IT
5 месяцев назад
⚙️ Кастомные операции после завершения конфигурации бина в Spring Framework: Эффективные методы и подходы Совсем недавно проходил квиз(ССЫЛКА ТУТ). Там было обширное количество вопросов связанных с деталями применения аннотаций при разработке решений с применением Spring Framework. Сегодня поговорим о важном аспекте Spring Framework - выполнение методов после завершения конфигурации бинов. Это часто бывает полезно, особенно когда есть необходимость выполнить дополнительные действия или настройки уже после того, как бин был сконфигурирован, создан и помещен в ApplicationContext. ▶️ Использование аннотации @PostConstruct Одним из наиболее простых способов является использование аннотации @PostConstruct. Необходимо пометить метод в бине этой аннотацией, и Spring выполнит этот метод после завершения конфигурации. @Component public class MyBean {   @PostConstruct   public void afterPropertiesSet() {    // Ваш код после завершения конфигурации бина   } } ▶️ Реализация нтерфейса InitializingBean Spring предоставляет интерфейс InitializingBean, который возможно реализовать для конкретного бина. Метод afterPropertiesSet() будет вызван после завершения конфигурации. @Component public class MyBean implements InitializingBean {   @Override   public void afterPropertiesSet() {    // Ваш код после завершения конфигурации бина   } } ▶️ Использование аннотации @EventListener Если есть потребность реагировать на события происходящие в приложении, которые связаны с завершением конфигурации, то можно использовать аннотацию @EventListener. Событие будет перехвачено и направлено для обработки методу, который в свою очередь ожидает это событие. @Component public class MyEventListener {   @EventListener(ContextRefreshedEvent.class)   public void handleContextRefresh() {    // Ваш код после завершения конфигурации бина   } } Это всего лишь несколько подходов. Выберите тот, который лучше всего соответствует вашим потребностям. Не забывайте делиться своим опытом и задавать вопросы! ⬇️ Какой из описанных примеров уже удалось применить тебе? Пиши в комментариях 👍 Поставь лайк этому посту, если тебе нравятся наш контент Заглядывай к нам в Телеграм канал и забирай полезный и актуальный контент из мира программирования
5 месяцев назад
⚙️ Какие CI/CD инструменты может выбрать бэкенд разработчик? Для бэкенд-разработчика важно знать различные инструменты Continuous Integration/Continuous Deployment (CI/CD), которые помогают автоматизировать процессы сборки, тестирования и развертывания приложений. Ниже приведен список некоторых популярных инструментов CI/CD: ▶️ Jenkins является одним из наиболее популярных инструментов CI/CD. Он обладает обширными возможностями настройки, поддерживает большое количество плагинов и легко интегрируется с другими инструментами. Однако, крайне сложен в освоении для разработчиков с небольшим опытом и слабой экспертизой. ▶️ GitLab CI/CD предоставляет встроенные средства CI/CD, позволяя хранить код, управлять задачами и автоматизировать пайплайны CI/CD прямо в репозитории. Становится очень мощным механизмом при использовании в комбинации с классическим GitLab репозиторием. ▶️ Travis CI это облачный сервис CI/CD, который интегрируется с репозиториями на GitHub и Bitbucket. Он легок в настройке и использовании, не требует высокого порога вхождения и посилен даже начинающему разработчику. ▶️ CircleCI это инструмент также предоставляет облачные услуги CI/CD и обеспечивает автоматизацию процесса сборки и развертывания. Относительно просто в освоении, популярен среди крупных компаний. Станет хорошим дополнение к портфолио разработчика. ▶️ TeamCity является мощным инструментом CI/CD от JetBrains. Он предоставляет широкие возможности для настройки и управления сборочными пайплайнами. Особенно удобный механизм для разработчиков, которые применяют различные решения от компании Jetbrains, например интегрированные среды для разработки, т.к. Intellij IDEA и др. ▶️ Bamboo от Atlassian интегрируется с другими продуктами этой компании, такими как Jira и Bitbucket. Он предоставляет инструменты для автоматизации сборки, тестирования и развертывания. ▶️ GitHub Actions. Если вы используете GitHub, то GitHub Actions предоставляет инструменты для создания своих собственных CI/CD пайплайнов, встроенных прямо в ваш репозиторий. Прост в освоении, стремительно набирает популярность среди мелких и средних компаний, но и не отстает в opensource проектах и просто в техническом зоопарке домашнего разработчика. Знание одного или нескольких из этих инструментов может быть полезным для бэкенд-разработчика, в зависимости от конкретных требований проекта и предпочтений команды разработки. ⬇️ А какими инструментами пользуешься ты для организации CI/CD? Пиши в комментариях 👍 Поставь лайк этому посту, если тебе нравятся наш контент
5 месяцев назад