Compare commits

...

2 Commits

Author SHA1 Message Date
83f1e16f77
java update
All checks were successful
continuous-integration/drone/push Build is passing
2024-10-20 20:19:00 +03:00
ab46572c61
java update 2024-10-19 09:43:09 +03:00
43 changed files with 634 additions and 26 deletions

View File

@ -0,0 +1,33 @@
---
aliases:
- бизнес-логике
tags:
- maturity/🌱
date: 2024-10-16
zero-link:
parents:
linked:
---
Бизнес-логика — это совокупность правил, процессов и операций, которые определяют, как бизнес-приложение или [[Информационная система|система]] обрабатывает данные и выполняет свои функции в соответствии с требованиями бизнеса. Она описывает последовательность действий, условия и правила, которые управляют поведением системы при выполнении бизнес-задач.
Основные аспекты бизнес-логики:
- **Правила и ограничения**: Определяют, что можно и нельзя делать в системе.
- **Процессы и операции**: Описывают последовательность шагов для достижения определенного результата.
- **Валидация данных**: Проверяет корректность и целостность вводимых или обрабатываемых данных.
- **Взаимодействие с данными**: Определяет, как данные создаются, читаются, обновляются и удаляются.
Бизнес-логика отделена от пользовательского интерфейса и технической инфраструктуры, что позволяет легко вносить изменения в систему при изменении бизнес-требований без необходимости переписывать всю программу.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-10-16]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -17,7 +17,7 @@ linked:
- Сетевой ввод-вывод. Обычно сводится к общению с [Rеverse proxy](Rеverse%20proxy.md) прием http-запроса и ответ на него, и со всевозможными сервисами, которые хранят данные это могут быть БД, очереди, memcaсhed и т.п. - Сетевой ввод-вывод. Обычно сводится к общению с [Rеverse proxy](Rеverse%20proxy.md) прием http-запроса и ответ на него, и со всевозможными сервисами, которые хранят данные это могут быть БД, очереди, memcaсhed и т.п.
- Склеивание строк сериализовать данные в JSON, сформировать шаблон на основе html, посчитать sh1 или md5? выполнить сжатие данных. - Склеивание строк сериализовать данные в JSON, сформировать шаблон на основе html, посчитать sh1 или md5? выполнить сжатие данных.
А что такое бизнес-логика в бэкенде? Это проверки наподобие "если значение переменных больше 3-х, делай это", "если пользователь авторизован, покажи одно, если не авторизован покажи другое". Бывают, конечно, отдельные задачи, например, по изменению размера картинки, преобразования видео, но чаще всего такие задачи решаются вне бэкенда с использованием очередей, воркеров и т.д. А что такое [[бизнес-логика]] в бэкенде? Это проверки наподобие "если значение переменных больше 3-х, делай это", "если пользователь авторизован, покажи одно, если не авторизован покажи другое". Бывают, конечно, отдельные задачи, например, по изменению размера картинки, преобразования видео, но чаще всего такие задачи решаются вне бэкенда с использованием очередей, воркеров и т.д.
*** ***
## Мета информация ## Мета информация
**Область**:: [[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]] **Область**:: [[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]]

View File

@ -0,0 +1,26 @@
---
tags:
- maturity/🌱
date:
- - 2024-01-10
zero-link: []
parents:
---
```shell
openssl s_client -showcerts -connect www.example.com:443
```
Эта команда выведет сертификат в консоль. Далее нужно скопировать все, что между `-----BEGIN CERTIFICATE-----` и `-----END CERTIFICATE-----` включая эти строки.
Скопированные данные вставить в текстовый документ и сохранить с расширением `*.cer`.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Криптография|00 Криптография]]
**Родитель**::
**Источник**::
**Автор**::
**Создана**:: [[2024-01-10]]
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

43
dev/java/JDeps.md Normal file
View File

@ -0,0 +1,43 @@
---
aliases:
tags:
- maturity/🌱
date: 2024-10-15
zero-link:
parents:
linked:
---
JDeps — это инструмент для анализа зависимостей модулей и пакетов, который был введён в [[../../../../knowledge/dev/java/JDK 8|JDK 8]], ещё до появления модульной системы [[Java Platform Module System|JPMS]]. Основная задача JDeps — помочь разработчикам понять, как модули и пакеты связаны друг с другом внутри проекта.
Основные возможности:
- Показывает, какие модули используются в проекте, какие зависимости между ними существуют и какие модули вызывают друг друга.
- Позволяет анализировать, какие библиотеки и классы реально используются, что помогает очищать проект от лишних зависимостей
Пример запуска Jdeps
```bash
jdeps --multi-release 17 --ignore-missing-deps -q -recursive --print-module-deps -cp 'project-core/build/lib/boot/*':'project-core/build/lib/main/*':'project-core/build/app/*' project-core/build/app/*
Output:
jdk.zipfs,jdk.management,jdk.crypto.cryptoki,java.security.jgss,jdk.crypto.ec
```
- `--multi-release 17`: указывает на использование многоверсионного JAR-файла для JDK 17, что позволяет учитывать разные версии классов для разных версий JDK.
- `--ignore-missing-deps`: игнорирует отсутствующие зависимости, чтобы избежать ошибок при их отсутствии.
- `-q`: отключает подробный вывод, что делает команду менее «шумной» и оставляет только ключевые данные.
- `-recursive`: указывает JDeps анализировать зависимости всех модулей рекурсивно.
- `--print-module-deps`: выводит список всех модулей, которые требуются для работы проекта.
- `-cp`: указывает путь к классам и библиотекам проекта.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-10-15]]
**Автор**::
### Дополнительные материалы
- [[JLink]]
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

55
dev/java/JLink.md Normal file
View File

@ -0,0 +1,55 @@
---
aliases:
tags:
- maturity/🌱
date: 2024-10-15
zero-link:
parents:
linked:
---
JLink — это мощный инструмент, который был введён в [[../../../../knowledge/dev/java/Java 9|Java 9]] как часть модульной системы [[Java Platform Module System|JPMS]]. Его основная задача — создание кастомизированных [[JDK]], включающих только необходимые модули для работы конкретного приложения.
Благодаря исключению ненужных модулей, приложения, собранные с помощью JLink, становятся легче и быстрее загружаются. Это особенно важно для приложений, работающих в ограниченных средах, например, в микросервисной архитектуре или на встраиваемых устройствах. Меньший размер JRE снижает время старта и использование оперативной памяти, что критично в условиях ограниченных ресурсов.
Например, обычный JRE содержит десятки модулей, таких как `java.sql` или `java.xml`, которые могут быть не нужны конкретному приложению. Используя JLink, разработчик может создать минимальный набор модулей, достаточный для его проекта.
Основная команда JLink выглядит следующим образом:
```bash
jlink --module-path $JAVA_HOME/jmods --add-modules <список модулей> --output <путь_к_результирующей_JRE>
```
- `--module-path` указывает путь к модульной системе JDK, которая по умолчанию находится в папке `jmods` в вашем JDK.
- `--add-modules` определяет, какие модули будут включены в итоговую сборку JRE. Это могут быть как модули стандартной библиотеки (например, `java.base`), так и модули вашего приложения.
- `--output` указывает папку, в которую будет выведена готовая сборка JRE.
**Основные опции JLink**
- `-strip-debug`. Удаляет символы отладки из итоговой сборки JRE. Это помогает дополнительно уменьшить размер JRE, особенно когда приложение не нуждается в отладочной информации.
- `--compress`. отвечает за сжатие файлов в сборке JRE. Она поддерживает несколько уровней сжатия:
- 0 — без сжатия (по умолчанию),
- 1 — сжатие классов, но без применения дорогих методов сжатия,
- 2 — максимальное сжатие, что снижает размер сборки, но может замедлить время загрузки.
- `-strip-native-commands`. Эта опция удаляет нативные команды (например, инструменты вроде jcmd, jmap, и другие утилиты), которые не нужны в большинстве рабочих окружений.
- `--launcher`. Позволяет создавать собственные лаунчеры для вашего приложения. Это может быть полезно для упрощения запуска приложения конечными пользователями. Лаунчеры создаются в директории bin сгенерированной JRE. Пример `--launcher myapp_launcher=myapp.module/com.example.Main`
- `--bind-services`. Полезна для автоматического связывания сервисов, если приложение использует `ServiceLoader`. Эта опция необходима, когда модульная система управляет загрузкой сервисов, и их нужно зарегистрировать для запуска приложения.
- `--target`. Позволяет создавать JRE для других платформ (например, создавать сборку для Linux с машины на Windows). Пример `--target linux-x64`
[[JDeps]] анализирует зависимости приложения, автоматически определяя, какие модули используются, а JLink на основе этого анализа создаёт кастомную JRE
Пример совместного использования JDeps и JLink:
```bash
jlink --add-modules $(jdeps --multi-release 17 --ignore-missing-deps -q -recursive --print-module-deps -cp 'project-core/build/lib/boot/*':'project-core/build/lib/main/*':'project-core/build/app/*' project-core/build/app/*) --strip-debug --no-man-pages --no-header-files --compress=2 --output ./build/jdk
```
***
## Мета информация
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-10-15]]
**Автор**::
### Дополнительные материалы
- [[JDeps]]
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -0,0 +1,58 @@
---
aliases:
- модули
- модуль
- модулей
- JPMS
- модульную систему
tags:
- maturity/🌱
date: 2024-10-15
zero-link:
parents:
linked:
---
Модульная система Java (JPMS), представленная в [[../../../../knowledge/dev/java/Java 9|Java 9]], позволяет разработчикам разбивать приложения на логически обособленные блоки — модули.
> [!WARNING] Не Maven/Gradle модули
> Модули в Maven и Gradle — это структурные единицы системы сборки, которые помогают управлять зависимостями и сборкой проекта, но они не являются модулями в контексте модульной системы Java (JPMS).
Модуль - это набор пакетов, содержащих типы (классы и интерфейсы) ресурсы и другие виды статической информации.
**Какие проблемы решает?**
- Делает зависимости явными
- Улучшает [[../architecture/Инкапсуляция|инкапсуляцию]], предотвращая создание нежелательных зависимостей между модулями. Все привыкли к модификаторам доступов у классов, но у пакетов модификаторов доступа не было.
Одним из ключевых преимуществ JPMS является чёткий контроль зависимостей. В старой системе через classpath все классы и пакеты были доступны друг другу без явного указания разрешений, что часто приводило к ошибкам и некорректному использованию библиотек. С JPMS разработчики могут точно указывать, какие зависимости нужны модулю и какие его части будут видимы другим модулям.
## Дескриптор
Каждый модуль имеет дескриптор - файл `module-info.java`, который содержит описание того, какие зависимости необходимы модулю и какие пакеты он экспортирует для других.
Дескриптор описывает:
- Импортируемые, экспортируемые, транзитивно-экспортируемые пакеты.
Пример простого дескриптора:
```java title=module-info.java
module com.example.myapp {
requires java.sql;
exports com.example.myapp.service;
}
```
В этом примере модуль `com.example.myapp` использует (`requires`) модуль `java.sql` и экспортирует (`exports`) пакет `com.example.myapp.service`, который может быть использован другими модулями. Все остальные пакеты, не указанные в директиве `exports`, остаются приватными и недоступными для других модулей.
> [!NOTE] Обратная совместимость
> Модульная система разработана с учётом совместимости с предыдущими версиями JDK. Проекты, которые не перешли на JPMS, могут по-прежнему использовать старую систему через classpath.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
**Родитель**:: [[../../../../knowledge/dev/java/Устройство Java|Устройство Java]]
**Источник**::
**Создана**:: [[2024-10-15]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -0,0 +1,76 @@
---
aliases:
tags:
- maturity/🌱
date: 2024-10-19
---
#### Code block (блок кода)
Это фрагмент программы, заключенный между фигурными скобками `{}`. Он может быть частью метода, цикла, условия или других конструкций. В блоке кода содержатся операторы (statements), которые выполняются в порядке их написания.
![[../../meta/files/images/Pasted image 20241019092032.png]]
#### Statement (оператор, предложение, инструкция)
Выполняет какое-то действие, но не возвращает значения. Оператор заканчивается точкой с запятой `;`, однако сам символ `;` не является частью выражения (expression).
![[../../meta/files/images/Pasted image 20241019092300.png]]
#### Expression (выражение)
Выражение — это часть кода, которая вычисляет **значение**. Оно может включать переменные, константы, операторы и вызовы методов.
Выражение может быть использовано как часть оператора или в других контекстах, например, внутри условий.
#### Значение
Это результат вычисления выражения (исключая выражения с типом `void`). Значения могут быть сохранены в переменные, переданы в методы в качестве **аргументов**, а также приняты методами в виде **параметров**. При передаче значения в метод оно копируется - [[Передача значений в метод в Java]].
Важно отметить, что само значение **нельзя изменить**, однако переменной, которая хранит это значение, можно присвоить новое значение.
#### Имя метода
Имя метода идентифицирует конкретную функцию или действие, которое выполняет метод.
#### Аргументы метода
В Java метод всегда имеет список аргументов, даже если они отсутствуют. В таком случае используются пустые скобки `()`.
![[../../meta/files/images/Pasted image 20241019093016.png]]
#### Параметры метода
Параметры метода — это переменные, указанные в скобках при его объявлении. Эти параметры получают значения при вызове метода.
Есть есть для того, кто вызывает метод передаваемые значения называются аргументами, а уже в самом методе аргументы называются параметрами.
#### Сигнатура метода
Сигнатура метода включает его имя и список аргументов, но не возвращаемый тип. Это ключевой элемент для различения методов с одинаковыми именами, но разными параметрами.
#### Квалификатор
Это часть выражения слева от точки, указывающая на объект или класс, через который вызывается метод или поле. Квалификатор может быть необязательным и иногда отсутствовать.
![[../../meta/files/images/Pasted image 20241019092501.png]]
Например, в выражении `System.out.println()` квалификатором для метода `println` является `out`, а для `out``System`.
#### Переменная
это именованная область памяти, которая используется для хранения данных. Переменная может содержать различные типы данных, такие как числа, строки или объекты. Она позволяет программам запоминать значения и использовать их в дальнейшем.
#### Declaration (объявление)
Это процесс создания переменной, метода или другой сущности в программе с указанием её типа и имени. При объявлении переменной указывается её тип (например, `int`, `String`) и имя, но ей может не присваиваться значение сразу.
Объявление сообщает компилятору, что данная переменная или метод существует и будет использоваться в дальнейшем. Объявление может сопровождаться **инициализацией** — присвоением переменной значения при её создании.
Пример объявления переменной:
```java
int myNumber; // Объявление переменной типа int с именем myNumber
```
Пример объявления метода:
```java
void myMethod() {
// тело метода
}
```
#### Область видимости
это часть программы, в которой переменная доступна для использования. Переменные видимы и могут быть использованы только в пределах той области, где они были объявлены.
#### Локальная переменная
это переменная, объявленная внутри метода или блока кода. Она существует только в пределах этого метода или блока и недоступна за его пределами. После завершения работы метода или блока локальная переменная удаляется из памяти.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-10-19]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

36
dev/java/Куча.md Normal file
View File

@ -0,0 +1,36 @@
---
aliases:
- куче
- кучей
tags:
- maturity/🌱
date: 2024-10-19
zero-link:
parents:
linked:
---
Куча — это область памяти, используемая для динамического распределения во время выполнения программы. В отличие от стека, ==данные в куче могут существовать дольше, чем отдельные вызовы функций, а объёмы памяти, выделяемой в куче, обычно гораздо больше, чем в стеке.==
Куча идеально подходит для хранения данных, которые должны существовать дольше времени выполнения функции, или для работы с большими объёмами данных. Однако работа с кучей требует тщательного управления: ==если объекты не удаляются, когда они больше не нужны, это может привести к утечке памяти==, что, в свою очередь, может вызвать исчерпание доступной памяти.
Куча в Java — это область памяти, где создаются все объекты. Когда вы создаёте объект с помощью оператора `new`, он размещается в куче. Основное отличие стека и кучи в Java от их общего представления связано с автоматическим управлением памятью. В Java не нужно явно освобождать память в куче, так как этим занимается [[gc/Garbage Collector|сборщик мусора]].
Для наглядности представим стек и кучу. Серые объекты потеряли свою связь со стеком, и их нужно удалить, чтобы освободить память для новых объектов.
![[../../meta/files/images/Pasted image 20241019192034.png]]
> [!NOTE]
> Объекты могут содержать методы, а методы — локальные переменные. Эти локальные переменные хранятся в стеке потока, даже если сам объект, которому принадлежат методы, находится в куче.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
**Родитель**:: [[../../../../knowledge/dev/java/Устройство Java|Устройство Java]]
**Источник**::
**Создана**:: [[2024-10-19]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -0,0 +1,48 @@
---
aliases:
tags:
- maturity/🌱
date: 2024-10-19
---
Важно понимать, как происходит передача данных в методы. При передаче [[Примитивный тип|примитивных типов]] в метод, копируется **значение** переменной. Это значит, что ==любые изменения, которые вы делаете с переменной внутри метода, не влияют на оригинальную переменную.==
Однако, при передаче [[Ссылочный тип|ссылочных типов]] копируется значение ссылки на объект, а не сам объект. Это значит, что ==если изменить содержимое объекта через эту ссылку, изменения отразятся и на оригинальном объекте==.
Это часто становится причиной ошибок у новичков, поэтому представьте, что [[Примитивный тип|примитивные типы]] — это как копирование листа бумаги: вы даете кому-то копию, и он может писать на ней, но оригинал останется нетронутым. А [[Ссылочный тип|ссылочные типы]] — это как передача адреса на дом: если кто-то приедет по адресу и изменит что-то в доме, оригинальный дом изменится, даже если у каждого будет только этот “адрес”.
```java
public class Example {
public static void main(String[] args) {
int primitive = 5;
modifyPrimitive(primitive);
System.out.println("После изменения примитива: " + primitive); // Выведет 5
int[] reference = {1, 2, 3};
modifyReference(reference);
System.out.println("После изменения ссылочного типа: " + reference[0]); // Выведет 100
}
public static void modifyPrimitive(int number) {
number = 10; // Изменение копии примитива, оригинал не затронут
}
public static void modifyReference(int[] array) {
array[0] = 100; // Изменение объекта по ссылке, оригинальный массив изменится
}
}
```
- В примере с примитивным типом (int), значение переменной primitive не изменяется, потому что в метод передаётся копия значения.
- В примере с массивом (ссылочный тип), изменяется оригинальный объект, так как в метод передается ссылка на массив, и мы изменяем содержимое этого объекта через ссылку.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-10-19]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -0,0 +1,28 @@
---
aliases:
- примитивных типов
- примитивные типы
tags:
- maturity/🌱
date: 2024-10-19
zero-link:
parents:
linked:
---
- Логические: boolean - true, false
- Целочисленные: byte, short, int, long - 42, -1
- Дробные: float, double - 3.141, NaN
- Символьные (UTF-16): CHAR
***
## Мета информация
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-10-19]]
**Автор**::
### Дополнительные материалы
- [[Ссылочный тип|Ссылочный тип]]
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -0,0 +1,32 @@
---
aliases:
- ссылочных типов
- ссылочные типы
tags:
- maturity/🌱
date: 2024-10-19
zero-link:
parents:
linked:
---
Ссылочные типы позволяют работать с пользовательскими типами данных, такими как объекты классов. Однако, важно понимать, что ==переменная ссылочного типа не хранит сами данные объекта. Вместо этого переменная хранит **ссылку** на объект==, который находится в области памяти, называемой [[Куча|кучей]] (heap).
Когда вы объявляете переменную ссылочного типа, например:
```java
MyClass obj = new MyClass();
```
Переменная `obj` ==не содержит сам объект класса `MyClass`, а лишь хранит адрес этого объекта в памяти==. То есть, в самой переменной хранится ссылка на объект, а не его данные. Все операции с такой переменной выполняются через эту ссылку.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-10-19]]
**Автор**::
### Дополнительные материалы
- [[Примитивный тип|Примитивный тип]]
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -0,0 +1,34 @@
---
tags:
- maturity/🌱
date:
- - 2024-01-10
---
Первым делом необходимо [скачать сертификат сайта](../cryptography/Скачать%20сертификат%20сайта.md).
Теперь используя `keytool` добавим сертификат в JVM.
```shell
keytool -importcert -file cert_name.cer -keystore keystore_path -storepass "changeit" -noprompt -alias "alias_cert"
```
Где
- `cert_name.cer` - имя сертификата
- `keystore_path` - путь до хранилища сертификатов в JVM
- Пример: `jdk_path/lib/security/cacerts`
- `alias_cert` - алиас для сертификата
> [!WARNING]
> Возможно потребуется выход из системы, чтобы применились изменения.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]
**Родитель**::
**Источник**::
**Автор**::
**Создана**:: [[2024-01-10]]
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -0,0 +1,34 @@
---
aliases:
tags:
- maturity/🌱
- content/opinion
date: 2024-10-20
zero-link:
parents:
linked:
---
Использование var, введенное в [[../../../knowledge/dev/java/Java 10|Java 10]], может на первый взгляд показаться удобным инструментом для сокращения объема кода. Однако есть и проблемы:
Одним из основных недостатков использования `var` является то, что он скрывает тип переменной, что приводит к пониженной [[Читаемый код|читаемости кода]], особенно на этапе ревью. В коде, который разработчик может читать через несколько месяцев или передать другим коллегам, ==отсутствие явного типа затрудняет понимание происходящего==.
Например, следующий код не даёт никакой информации о том, что такое `result` и что возвращает метод `process()`.
```java
var result = process();
```
Это может привести к путанице, особенно если метод возвращает обобщённый тип или коллекцию. Без явного указания типов разработчикам придётся тратить дополнительное время на выяснение, что происходит.
***
## Мета информация
**Область**:: [[../meta/zero/00 Java разработка|00 Java разработка]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-10-20]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -0,0 +1,37 @@
---
aliases:
- читаемость кода
- читаемости кода
tags:
- maturity/🌱
- content/opinion
date: 2024-10-20
zero-link:
parents:
linked:
---
Код — это не только набор инструкций для машины, но и средство общения между разработчиками. Большую часть времени программисты проводят, читая чужой код, поэтому ==каждый фрагмент кода должен быть понятен не только автору, но и другим членам команды==. Удобство чтения и понимания кода коллегами — один из ключевых факторов успешной [[../productivity/Эффективная команда разработки|командной работы]]. Это требует от разработчиков внимательного подхода к написанию кода: важно писать не только для себя, но и для своих коллег.
Если ваш код понятен только вам и не может быть поддержан другими, это сигнал того, что вы недостаточно эффективный разработчик.
**Рекомендации**:
- **Пишите просто и ясно**. Используйте понятные и распространённые конструкции языка, которые легко читаются и понимаются коллегами.
- **Не усложняйте**. Не стремитесь использовать сложные или малоизвестные возможности языка, если они не приносят очевидной пользы. Простота всегда предпочтительнее.
- **Комментируйте важные моменты**. Там, где логика может быть неочевидной, добавьте комментарии, которые объясняют цель или обоснование ваших решений.
- **Следуйте соглашениям по стилю**. Соблюдайте единые стандарты кодирования, принятые в команде, будь то соглашения о стиле, именовании или форматировании.
- **Используйте осмысленные имена**. Переменные, функции и классы должны иметь названия, которые чётко отражают их назначение. Избегайте сокращений, если они могут быть непонятны другим.
- **Проводите регулярные ревью кода**. Обратная связь от коллег помогает выявить возможные сложности в понимании кода и улучшить его качество.
***
## Мета информация
**Область**:: [[../meta/zero/00 Разработка|00 Разработка]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-10-20]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -0,0 +1,8 @@
## Заметки созданные в этот день
<!-- QueryToSerialize: LIST WHERE "garden/ru" and (contains(date, this.file.link) or contains(Создана, this.file.link)) -->
<!-- SerializedQuery: LIST WHERE "garden/ru" and (contains(date, this.file.link) or contains(Создана, this.file.link)) -->
- [[2024-10-19 1729318046]]
- [[Семантический разрыв]]
- [[Голосарий Java]]
<!-- SerializedQuery END -->

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 446 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 731 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

View File

@ -0,0 +1 @@
d1daeba3f033bd31d7700b6e3ae83c73

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

View File

@ -0,0 +1 @@
8f7e1d3f4bffeeb715397ccc50793e50

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

View File

@ -0,0 +1 @@
b583807a29d4001779d2bcc488afe0f4

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

View File

@ -0,0 +1 @@
7e5a2e00ff0b9f306201c3081346764c

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

View File

@ -0,0 +1 @@
a4349e620be07c2424843212bb5f573d

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@ -0,0 +1 @@
d1daeba3f033bd31d7700b6e3ae83c73

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -0,0 +1 @@
8f7e1d3f4bffeeb715397ccc50793e50

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -0,0 +1 @@
b583807a29d4001779d2bcc488afe0f4

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -0,0 +1 @@
7e5a2e00ff0b9f306201c3081346764c

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

View File

@ -0,0 +1 @@
a4349e620be07c2424843212bb5f573d

View File

@ -5,6 +5,10 @@ zero-link:
- "[[00 Разработка]]" - "[[00 Разработка]]"
title: Java разработка title: Java разработка
--- ---
В коммуникациях и обучении всегда важно устранить или уменьшить [[../../../../_inbox/Семантический разрыв|семантический разрыв]] между людьми, поэтому рекомендую переодически обращаться к [[../../dev/java/Голосарий Java|голосарию Java]], чтобы использовать одни и те же термины и определения.
Основные узлы:
- [Устройство Java](Устройство%20Java.md) - [Устройство Java](Устройство%20Java.md)
- [[../../dev/java/Многопоточность в Java|Многопоточность в Java]] - [[../../dev/java/Многопоточность в Java|Многопоточность в Java]]
- Системы сборки - Системы сборки
@ -18,6 +22,23 @@ title: Java разработка
- [[../../../../knowledge/dev/java/other/Jackson|Jackson]] - [[../../../../knowledge/dev/java/other/Jackson|Jackson]]
- [Снипеты для Java](00%20Снипеты%20для%20Java.md) - [Снипеты для Java](00%20Снипеты%20для%20Java.md)
Обучение:
- [[../../dev/java/Голосарий Java|Голосарий Java]]
- Типы
- [[../../dev/java/Примитивный тип|Примитивный тип]]
- [[../../dev/java/Ссылочный тип|Ссылочный тип]]
- [[../../dev/java/Передача значений в метод в Java|Передача значений в метод в Java]]
## Версии Java
- [[Java 1]]
- [Java 7](Java%207.md)
- [[Java 8 LTS]]
- [Java 9](Java%209.md)
- [[Java 10]]
- [Java 11 LTS](Java%2011%20LTS.md)
- [Java 12](Java%2012.md)
- [[Java 15]]
- [[Java 17 LTS]]
- [[../../dev/java/Java 21 LTS|Java 21 LTS]]
## Мои образовательные статьи ## Мои образовательные статьи
- [Функциональные интерфейсы и лямбды в Java](https://struchkov.dev/blog/ru/lambda-expression-java/) - [Функциональные интерфейсы и лямбды в Java](https://struchkov.dev/blog/ru/lambda-expression-java/)
- [Основы памяти в Java: Куча и Стек](https://struchkov.dev/blog/ru/memory-in-java/) - [Основы памяти в Java: Куча и Стек](https://struchkov.dev/blog/ru/memory-in-java/)
@ -37,17 +58,7 @@ title: Java разработка
- [Не используйте @Data](../../dev/java/Не%20используйте%20@Data.md) - [Не используйте @Data](../../dev/java/Не%20используйте%20@Data.md)
- [Возвращайте пустую коллекцию вместо null](../../dev/java/Возвращайте%20пустую%20коллекцию%20вместо%20null.md) - [Возвращайте пустую коллекцию вместо null](../../dev/java/Возвращайте%20пустую%20коллекцию%20вместо%20null.md)
- [[../../dev/java/Границы применимости Tuple и Pair в разработке|Границы применимости Tuple и Pair в разработке]] - [[../../dev/java/Границы применимости Tuple и Pair в разработке|Границы применимости Tuple и Pair в разработке]]
## Версии Java - [[../../dev/Не используйте var в Java|Не используйте var в Java]]
- [[Java 1]]
- [Java 7](Java%207.md)
- [[Java 8 LTS]]
- [Java 9](Java%209.md)
- [[Java 10]]
- [Java 11 LTS](Java%2011%20LTS.md)
- [Java 12](Java%2012.md)
- [[Java 15]]
- [[Java 17 LTS]]
- [[../../dev/java/Java 21 LTS|Java 21 LTS]]
## Дополнительно ## Дополнительно
- [Нативные сборки в Java](../../dev/java/Нативные%20сборки%20в%20Java.md) - [Нативные сборки в Java](../../dev/java/Нативные%20сборки%20в%20Java.md)

View File

@ -6,17 +6,24 @@ zero-link:
aliases: aliases:
- Скрипты на Java - Скрипты на Java
--- ---
- [Парсинг URL c помощью регулярки](../../dev/snippet/Парсинг%20URL%20c%20помощью%20регулярки.md) <!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Область, this.file.link) or contains(zero-link, this.file.link) -->
- [Сериализация и Десериализация даты в Jackson](../../dev/snippet/Сериализация%20и%20Десериализация%20даты%20в%20Jackson.md) <!-- SerializedQuery: LIST FROM [[]] WHERE contains(Область, this.file.link) or contains(zero-link, this.file.link) -->
- [Создание linux сервиса для Java приложения](../../dev/snippet/Создание%20linux%20сервиса%20для%20Java%20приложения.md) - [[Реализация GZIP в Java]]
- [Игнорирование ошибок сертификата OkHttp3](../../dev/snippet/Игнорирование%20ошибок%20сертификата%20OkHttp3.md) - [[MD5]]
- [Mock конфигурация Oauth2 для SpringBoot](../../dev/snippet/Mock%20конфигурация%20Oauth2%20для%20SpringBoot.md) - [[SHA-256]]
- [Несколько подключений к базе H2](../../dev/snippet/Несколько%20подключений%20к%20базе%20H2.md) - [[Логирование SQL в Hibernate]]
- [Дебаг приложения на этапе компиляции IntelliJ IDEA](../../dev/snippet/Дебаг%20приложения%20на%20этапе%20компиляции%20IntelliJ%20IDEA.md) - [[StartupEvent в Quarkus]]
- [Логирование SQL в Hibernate](../../dev/java/hibernate/Логирование%20SQL%20в%20Hibernate.md) - [[Бинарный поиск на Java]]
- [Бинарный поиск на Java](../../dev/java/Бинарный%20поиск%20на%20Java.md) - [[Mock конфигурация Oauth2 для SpringBoot]]
- [[../../dev/snippet/Проблема с Hibernate Reactive в Telegram SDK для Java|Проблема с Hibernate Reactive в Telegram SDK для Java]] - [[Дебаг приложения на этапе компиляции IntelliJ IDEA]]
- [[../../dev/snippet/Реализация SHA-256 на Java|Реализация SHA-256 на Java]] - [[Игнорирование ошибок сертификата OkHttp3]]
- [[../../../../_inbox/Реализация GZIP в Java|Реализация GZIP в Java]] - [[Несколько подключений к базе H2]]
- [[../../dev/snippet/Реализация Base64 на Java|Реализация Base64 на Java]] - [[Парсинг URL c помощью регулярки]]
- [[../../dev/snippet/Преобразование Json из коллекции в Java объект при помощи Jackson|Преобразование Json из коллекции в Java объект при помощи Jackson]] - [[Преобразование Json из коллекции в Java объект при помощи Jackson]]
- [[Проблема с Hibernate Reactive в Telegram SDK для Java]]
- [[Реализация Base64 на Java]]
- [[Реализация SHA-256 на Java]]
- [[Сериализация и Десериализация даты в Jackson]]
- [[Создание linux сервиса для Java приложения]]
- [[Добавление сертификата в JVM]]
<!-- SerializedQuery END -->

View File

@ -0,0 +1,32 @@
---
aliases:
tags:
- maturity/🌱
date: 2024-10-20
zero-link:
parents:
linked:
---
В программной разработке часто упускается из виду один важный аспект: это командная работа. Написание кода — не просто индивидуальная деятельность, а коллективный процесс, требующий эффективного взаимодействия между всеми членами команды. В больших проектах успех невозможен, если каждый действует исключительно самостоятельно, не оглядываясь на коллег.
Вот несколько ключевых принципов, которые помогут разработчикам осознать важность командного подхода и находить баланс между личной эффективностью и потребностями команды.
## Совместная работа
Результат работы — это общая ответственность. В одиночку создать успешный продукт сложно, так как успех зависит от слаженности всех элементов системы. Каждый участник команды должен осознавать, что его работа — это не просто код, а часть общей задачи. ==Успех проекта напрямую зависит от качества взаимодействия, координации и взаимопонимания между участниками.==
## Читаемость кода
- [[../dev/Читаемый код|Читаемый код]]
## Время на взаимодействие — залог успеха
Часто можно встретить мнение, что разработчики должны тратить 100% своего времени на написание кода. Однако успех больших проектов зависит от многих аспектов: ревью кода, обсуждения архитектурных решений, согласование подходов и документация. Эти процессы являются неотъемлемой частью командной работы и требуют выделения времени. Умение разработчика эффективно коммуницировать и обсуждать решения с коллегами столь же важно, как и умение писать код.
***
## Мета информация
**Область**:: [[../meta/zero/00 Командная продуктивность|00 Командная продуктивность]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-10-20]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->