Архитектурная концепция.md
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
17f87c5b23
commit
8eb3c4e62e
70
dev/architecture/Dependency Injection.md
Normal file
70
dev/architecture/Dependency Injection.md
Normal file
@ -0,0 +1,70 @@
|
||||
---
|
||||
aliases:
|
||||
- DI
|
||||
- внедрение зависимостей
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: "[[2023-10-26]]"
|
||||
zero-link:
|
||||
- "[[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]"
|
||||
parents:
|
||||
- "[[Inversion of Control]]"
|
||||
- "[[Паттерн программирования]]"
|
||||
linked:
|
||||
---
|
||||
**Dependency Injection (DI)** — это паттерн проектирования, который используется для реализации принципа [[Inversion of Control]] (IoC). DI позволяет передавать зависимости объектам извне, вместо того чтобы объекты сами создавали их. Это ослабляет связь между компонентами системы, что делает код более гибким и удобным для поддержки.
|
||||
|
||||
В **Java** DI часто используется через фреймворки, такие как [[../../meta/zero/00 SpringBoot|Spring]] или [[../../meta/zero/00 Quarkus|Quarkus]], где зависимости внедряются автоматически. Основные способы внедрения зависимостей включают:
|
||||
- **Внедрение через конструктор**: зависимости передаются через параметры конструктора.
|
||||
- **Внедрение через сеттеры**: зависимости устанавливаются через методы.
|
||||
- **Внедрение через поля**: зависимости могут быть внедрены напрямую в поля класса с использованием аннотаций.
|
||||
|
||||
Пример внедрения через конструктор с использованием Spring:
|
||||
|
||||
```java
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
@Component
|
||||
class Engine {
|
||||
public void start() {
|
||||
System.out.println("Engine started");
|
||||
}
|
||||
}
|
||||
|
||||
@Component
|
||||
class Car {
|
||||
private final Engine engine;
|
||||
|
||||
@Autowired
|
||||
public Car(Engine engine) {
|
||||
this.engine = engine;
|
||||
}
|
||||
|
||||
public void drive() {
|
||||
engine.start();
|
||||
System.out.println("Car is moving");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
В этом примере Spring автоматически создаёт и инжектирует объект Engine в Car, благодаря аннотации `@Autowired`. Это упрощает управление зависимостями и позволяет легче изменять их без изменения логики программы.
|
||||
|
||||
Главные преимущества DI:
|
||||
- **Лёгкость тестирования**: можно подменять зависимости, что упрощает создание модульных тестов.
|
||||
- **Масштабируемость**: система легче адаптируется к изменениям.
|
||||
- **Упрощение архитектуры**: бизнес-логика отделена от процесса создания зависимостей.
|
||||
|
||||
|
||||
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]
|
||||
**Родитель**:: [[Inversion of Control]], [[Паттерн программирования]]
|
||||
**Источник**::
|
||||
**Автор**::
|
||||
**Создана**:: [[2023-10-06]]
|
||||
### Дополнительные материалы
|
||||
-
|
||||
### Дочерние заметки
|
||||
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
99
dev/architecture/Inversion of Control.md
Normal file
99
dev/architecture/Inversion of Control.md
Normal file
@ -0,0 +1,99 @@
|
||||
---
|
||||
aliases:
|
||||
- IoC
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: "[[2023-10-26]]"
|
||||
zero-link:
|
||||
- "[[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]"
|
||||
parents:
|
||||
- "[[Архитектурная концепция]]"
|
||||
linked:
|
||||
---
|
||||
Inversion of Control (IoC) — это [[архитектурная концепция]], которая заключается в передаче управления зависимостями программы от самого кода к внешней системе. Обычно, если один объект зависит от другого, он сам создаёт или запрашивает его. В IoC этот процесс контролируется извне, что позволяет программам быть более гибкими и легко расширяемыми.
|
||||
|
||||
Простой пример: допустим, у вас есть класс, который зависит от другого класса для выполнения своей работы. В обычном подходе класс сам создаёт объект-зависимость.
|
||||
|
||||
```java
|
||||
class Engine {
|
||||
public void start() {
|
||||
System.out.println("Engine started");
|
||||
}
|
||||
}
|
||||
|
||||
class Car {
|
||||
private Engine engine;
|
||||
|
||||
public Car() {
|
||||
// Класс Car сам создает зависимость
|
||||
this.engine = new Engine();
|
||||
}
|
||||
|
||||
public void drive() {
|
||||
engine.start();
|
||||
System.out.println("Car is moving");
|
||||
}
|
||||
}
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
Car car = new Car();
|
||||
car.drive();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
С использованием **IoC**, создание объекта Engine передаётся внешнему компоненту. Теперь Car не отвечает за создание своей зависимости:
|
||||
|
||||
```java
|
||||
class Engine {
|
||||
public void start() {
|
||||
System.out.println("Engine started");
|
||||
}
|
||||
}
|
||||
|
||||
class Car {
|
||||
private Engine engine;
|
||||
|
||||
// Зависимость передается через конструктор (IoC)
|
||||
public Car(Engine engine) {
|
||||
this.engine = engine;
|
||||
}
|
||||
|
||||
public void drive() {
|
||||
engine.start();
|
||||
System.out.println("Car is moving");
|
||||
}
|
||||
}
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
// Создание зависимостей осуществляется снаружи
|
||||
Engine engine = new Engine();
|
||||
Car car = new Car(engine);
|
||||
car.drive();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
IoC помогает реализовать принципы [[../../../../garden/ru/dev/architecture/SOLID|SOLID]], особенно [[../../../../garden/ru/dev/architecture/Dependency Inversion Principle|Принцип инверсии зависимостей]] (Dependency Inversion Principle, DIP), согласно которому высокоуровневые модули не должны зависеть от низкоуровневых модулей напрямую. Оба типа модулей должны зависеть от абстракций. В контексте IoC это означает, что классы не должны напрямую создавать свои зависимости, а получать их через интерфейсы или внешние механизмы. Такой подход упрощает замену реализаций, тестирование и расширение приложения.
|
||||
|
||||
**Преимущества IoC**
|
||||
- **Ослабление связности кода**. Поскольку классы не создают свои зависимости напрямую, их связь с конкретными реализациями уменьшается. Это облегчает изменение или замену зависимостей без изменения самого класса.
|
||||
- **Упрощение тестирования**. IoC позволяет легко заменять реальные зависимости на тестовые (например, mock-объекты), что упрощает процесс модульного тестирования. Вы можете изолировать классы и тестировать их независимо от реальных зависимостей.
|
||||
- **Лучшая расширяемость**. Система, построенная на принципах IoC, легче адаптируется к изменениям и новым требованиям. Новые зависимости могут быть добавлены или изменены без значительного изменения существующего кода.
|
||||
- **Разделение ответственности**. С IoC создаётся чёткое разделение между бизнес-логикой и управлением зависимостями. Это помогает сосредоточить внимание на основной функциональности класса, не отвлекаясь на вопросы создания объектов.
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]
|
||||
**Родитель**:: [[Архитектурная концепция]]
|
||||
**Источник**::
|
||||
**Автор**::
|
||||
**Создана**:: [[2023-10-26]]
|
||||
### Дополнительные материалы
|
||||
-
|
||||
### Дочерние заметки
|
||||
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
||||
<!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
||||
- [[Dependency Injection]]
|
||||
<!-- SerializedQuery END -->
|
23
dev/architecture/Архитектурная концепция.md
Normal file
23
dev/architecture/Архитектурная концепция.md
Normal file
@ -0,0 +1,23 @@
|
||||
---
|
||||
aliases:
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-10-01
|
||||
zero-link:
|
||||
- "[[../garden/ru/meta/zero/00 Архитектура ПО|00 Архитектура ПО]]"
|
||||
parents:
|
||||
linked:
|
||||
---
|
||||
- [[Inversion of Control]]
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]
|
||||
**Родитель**::
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-10-01]]
|
||||
**Автор**::
|
||||
### Дополнительные материалы
|
||||
-
|
||||
|
||||
### Дочерние заметки
|
||||
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
28
dev/architecture/Паттерн программирования.md
Normal file
28
dev/architecture/Паттерн программирования.md
Normal file
@ -0,0 +1,28 @@
|
||||
---
|
||||
aliases:
|
||||
- паттерн
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: "[[2023-11-05]]"
|
||||
zero-link:
|
||||
- "[[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]"
|
||||
parents:
|
||||
- "[[Архитектурная концепция]]"
|
||||
linked:
|
||||
---
|
||||
- [[Dependency Injection]]
|
||||
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]
|
||||
**Родитель**:: [[Архитектурная концепция]]
|
||||
**Источник**::
|
||||
**Автор**::
|
||||
**Создана**:: [[2023-11-05]]
|
||||
### Дополнительные материалы
|
||||
-
|
||||
### Дочерние заметки
|
||||
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
||||
<!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
||||
- [[Dependency Injection]]
|
||||
<!-- SerializedQuery END -->
|
@ -1,10 +1,11 @@
|
||||
---
|
||||
aliases:
|
||||
aliases:
|
||||
- spring
|
||||
tags:
|
||||
- type/zero-link
|
||||
date: 2023-11-15
|
||||
zero-link:
|
||||
- "[[../../../../garden/ru/meta/zero/00 Java разработка|00 Java разработка]]"
|
||||
parents: []
|
||||
parents:
|
||||
linked:
|
||||
---
|
||||
|
@ -5,6 +5,8 @@ zero-link:
|
||||
- "[[00 Разработка]]"
|
||||
---
|
||||
- [[../../dev/architecture/Архитектурный слой|Архитектурный слой]]
|
||||
- [[../../dev/architecture/Архитектурная концепция|Архитектурная концепция]]
|
||||
- [[../../dev/architecture/Паттерн программирования|Паттерн программирования]]
|
||||
|
||||
Архитектурные ошибки и проблемы:
|
||||
- [[../../dev/architecture/Протекание абстракций|Протекание абстракций]]
|
||||
|
Loading…
Reference in New Issue
Block a user