JuniorJava Developer > Java Core > Spring
Короткий ответ IoC (Inversion of Control) — принцип, по которому управление созданием и жизненным циклом объектов передаётся контейнеру. DI (Dependency Injection) — паттерн внедрения зависимостей и один из способов реализации IoC: контейнер сам предоставляет объекту его зависимости. Как это работает подробнее В Spring инверсию контроля реализует IoC-контейнер — базовый BeanFactory или расширенный ApplicationContext. Он создаёт бины, связывает их и управляет их временем жизни, поэтому приложение не вызывает new, а лишь описывает нужные ему объекты. Именно поэтому подход называется инверсией контроля: контроль над созданием объектов переходит от кода приложения к контейнеру. IoC шире, чем DI: IoC — общий принцип инверсии управления, а DI — конкретная техника, один из способов его реализации. Способы DI: внедрение через конструктор, через сеттер и напрямую в поле (field injection). Для запоминания: «Spring создаёт бин» — это IoC, а «Spring внедряет один бин в другой» — это DI. Пример кода Что использовать на пра
containerdependency-injection
JuniorJava Developer > Java Core > SQL и БД
Короткий ответ JOIN — операция объединения строк двух или более таблиц на основе условия соответствия, обычно по ключам. INNER JOIN возвращает только совпавшие строки; LEFT JOIN — все строки левой таблицы, а при отсутствии совпадения поля правой заполняются NULL; RIGHT JOIN — зеркальный вариант для правой таблицы; FULL JOIN возвращает все строки обеих таблиц, заполняя NULL стороны без пары. Как это работает подробнее Подзапрос (subquery) — это запрос, вложенный в другой запрос: он используется в WHERE через IN, EXISTS или сравнение со значением, а также в списке выборки для фильтрации и вычислений. Главное отличие от JOIN — в результате: JOIN «расширяет» выборку колонками второй таблицы, а подзапрос вычисляет отдельный результат, который внешний запрос использует как условие или источник данных. Объём результата: INNER JOIN — пересечение; LEFT и RIGHT JOIN — все строки одной стороны с NULL на другой; FULL JOIN — все строки обеих таблиц. Подзапрос: коррелированный подзапрос выполняется для каждой строки внешне
databasejoin
JuniorJava Developer > Java Core > JVM и память
Короткий ответ JVM — виртуальная машина Java, которая исполняет байт-код и обеспечивает переносимость программ. JRE — среда выполнения: JVM плюс стандартные библиотеки, нужна только для запуска приложений. JDK — комплект разработчика: всё из JRE плюс компилятор javac, утилиты и отладчик. Отношение вложенности: JDK содержит JRE, JRE содержит JVM. Как это работает подробнее Компоненты различаются составом и назначением, но работают вместе: вы пишете код, инструменты JDK превращают его в байт-код, а JVM внутри JRE исполняет этот байт-код на конкретной платформе. JVM. Загружает и проверяет class-файлы, интерпретирует инструкции байт-кода, а горячие участки компилирует JIT-компилятором в машинный код. Существует отдельная реализация под каждую платформу: Windows, Linux, macOS. JRE. Содержит JVM и стандартные библиотеки классов (java.lang, java.util и другие). Достаточна пользователю, который только запускает готовое приложение. JDK. Нужен разработчику: включает компилятор javac, утилиты java, jar, javadoc и отладч
bytecodejava
JuniorPython Developer > Основы Python > Функции и области видимости
Короткий ответ lambda — это способ создать анонимную функцию: функцию без имени, состоящую из одного выражения. Синтаксис выглядит как lambda аргументы: выражение, а результат выражения автоматически становится возвращаемым значением. Как это работает подробнее Лямбда может принимать любое количество аргументов, но её тело ограничено одним выражением, поэтому в нём не может быть операторов. Одно выражение. В отличие от def, в lambda нельзя разместить if-блок, цикл или явный return — значение вычисляется из единственного выражения. Функциональный объект. Выражение создаёт новый объект функции, который сразу возвращается и может быть сохранён в переменную или передан как аргумент. Место применения. Чаще всего лямбды передают в функции высшего порядка — map(), filter(), sorted() через параметр key — когда функция нужна один раз. Ограничения. В лямбде нет аннотаций типов и операторов, поэтому для сложной логики она не подходит. Пример кода Что использовать на практике Функции высшего порядка. Используй лямбду, ко
anonymous-functionsfunctional-programming
MiddlePython Developer > Основы Python > Тестирование кода
Короткий ответ Pytest — это open-source фреймворк для тестирования Python-кода, который ценят за простой синтаксис на assert и автоматическое обнаружение тестов. Он масштабируется от простых unit-тестов до сложных функциональных, устанавливается командой pip install pytest и запускается командой pytest. Как это работает подробнее Установка. Фреймворк устанавливается командой pip install pytest. Обнаружение тестов. pytest распознаёт файлы, имя которых начинается с test_ или заканчивается на _test, а внутри них — функции и методы с именами, начинающимися с test. Проверки. Утверждения записываются обычными выражениями assert: при ложном условии тест останавливается, а в отчёте появляется AssertionError со сравнёнными значениями. Запуск. Тесты выполняются командой pytest или py.test в каталоге проекта, конкретный файл — как pytest test_sample1.py. Отбор и метки. Подстрока имени выбирается флагом -k, группы — декоратором @pytest.mark и флагом -m, пропуски — skip, ожидаемые падения — xfail. Пример кода Что использо
assertionspytest
MiddleJava Developer > Java Core > Multithreading
Короткий ответ Состояние гонки — это ситуация, когда результат многопоточной программы зависит от порядка и скорости выполнения потоков и становится непредсказуемым. Гонка возникает, когда несколько потоков без синхронизации обращаются к одним и тем же разделяемым данным и хотя бы один из них выполняет запись; итог зависит от того, какой поток «добежал» первым. Как это работает подробнее Типичный пример — несколько потоков увеличивают общий счётчик. Операция count++ состоит из трёх шагов: прочитать текущее значение, прибавить единицу, записать результат обратно. Два потока могут прочитать одно и то же значение, каждый вычислит следующее число, и в поле будет записано то же значение — одно увеличение потеряно (lost update). Гонка коварна тем, что проявляется не сразу: она часто «выстреливает» только под нагрузкой или на другом железе, из-за чего баги нерегулярно воспроизводятся. Три основных способа борьбы: атомарные классы (AtomicInteger) для одной составной операции; synchronized или Lock для более крупной к
atomicjava
JuniorJava Developer > Java Core > REST API
Короткий ответ REST (REpresentational State Transfer) — архитектурный стиль, основанный на веб-стандартах: он использует протокол HTTP для обмена данными. Всё содержимое рассматривается как ресурсы: каждый ресурс идентифицируется URI и доступен через единый интерфейс HTTP-методов, а клиент получает его представление — обычно JSON или XML. Веб-сервисы, построенные по этому стилю, называют RESTful; ключевой принцип — отсутствие состояния на сервере (statelessness). Как это работает подробнее Идемпотентность означает, что повторное выполнение одной и той же операции даёт тот же результат: состояние ресурса не меняется от количества вызовов. Статус-коды HTTP сообщают клиенту об исходе запроса. Методы: GET — получение ресурса (безопасный); POST — создание или добавление данных; PUT — полная замена или обновление; DELETE — удаление; PATCH — частичное обновление; также есть OPTIONS и HEAD. Идемпотентны: GET, PUT и DELETE. POST не идемпотентен: повторный POST может создать несколько ресурсов. Статус-коды: 200 OK; 201
apihttp
MiddleJava Developer > Java Core > Collections
LinkedHashMap хранит дополнительный двусвязный список, который задает порядок обхода элементов.
Collections
MiddlePython Developer > Основы Python > Генераторы и итераторы
Короткий ответ [x for x in y] — списковое включение: все элементы вычисляются сразу и складываются в список в памяти. (x for x in y) — генераторное выражение: значения вычисляются лениво, по одному, когда они запрашиваются. Как это работает подробнее Выражения различаются моментом вычисления элементов и тем, что именно хранится в памяти. Материализация. Списковое включение строит весь список сразу, поэтому занимает память пропорционально числу элементов. Ленивость. Генератор хранит только текущее состояние и вычисляет очередное значение в момент запроса, например в цикле for или функцией next(). Одноразовость. По генератору можно пройтись только один раз; элементы нельзя получить повторно или обратиться к ним по индексу. Опускание скобок. Если генераторное выражение — единственный аргумент функции, вторые круглые скобки не нужны, например sum(x * x for x in range(5)). Пример кода Что использовать на практике Нужен список. Когда требуется хранить результат целиком или обращаться по индексу, бери списковое вклю
generator-expressionslazy-evaluation
MiddlePython Developer > Основы Python > Объектно-ориентированное программирование
Короткий ответ Методы экземпляра первым аргументом получают self, методы класса — cls, а статические методы не получают ни того ни другого. Выбор зависит от того, какие данные нужны методу: экземпляра, класса или никакие. Как это работает подробнее Метод экземпляра. Первым параметром принимает self — ссылку на конкретный объект — и может читать и менять атрибуты этого экземпляра. Метод класса. Помечается @classmethod, первым параметром получает cls — сам класс — и работает с данными уровня класса. Альтернативный конструктор. Метод класса может возвращать экземпляры класса и вызывается как от самого класса, так и от экземпляра, в обоих случаях получая правильный класс. Статический метод. @staticmethod не принимает ни self, ни cls — это функция, логически связанная с предметной областью класса, для утилитарных операций. Пример кода Что использовать на практике Альтернативные конструкторы. Через @classmethod добавляй удобные способы создания экземпляров, например из строки или словаря. Утилиты. Вспомогательные ф
classmethodmethods