63 lines
4.4 KiB
Markdown
63 lines
4.4 KiB
Markdown
|
---
|
|||
|
aliases:
|
|||
|
- инкапсуляцию
|
|||
|
- инкапсуляции
|
|||
|
tags:
|
|||
|
- maturity/🌱
|
|||
|
date: 2024-09-27
|
|||
|
zero-link:
|
|||
|
- "[[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]"
|
|||
|
parents:
|
|||
|
- "[[../garden/ru/dev/architecture/ООП|ООП]]"
|
|||
|
linked:
|
|||
|
---
|
|||
|
Инкапсуляция — один из ключевых принципов [[ООП|объектно-ориентированного программирования]] (ООП), который обеспечивает контроль доступа к данным и методам объекта, скрывая внутреннюю реализацию и предоставляя только необходимые интерфейсы для взаимодействия с внешним миром.
|
|||
|
|
|||
|
Основные идеи инкапсуляции:
|
|||
|
- **Сокрытие данных**: Внутренние детали реализации объекта, такие как его состояние или внутренние методы, не должны быть доступны напрямую из внешнего кода. Это позволяет избежать прямого изменения данных объекта извне и защищает его от некорректного использования.
|
|||
|
- **Чёткие интерфейсы**: Объект предоставляет только те методы и свойства, которые необходимы для работы с ним, скрывая всю сложную внутреннюю логику. Это упрощает работу с объектом и делает его использование безопасным.
|
|||
|
- **Управляемое изменение состояния**: Изменение состояния объекта происходит через методы, которые контролируют корректность этих изменений и могут проводить валидацию, логику или вызовы других методов.
|
|||
|
|
|||
|
Частые ошибки:
|
|||
|
- **Избыточная доступность**: Если данные и методы не скрыты должным образом, это приводит к увеличению связности компонентов и нарушению принципа инкапсуляции.
|
|||
|
- **Смешивание ответственности**: Когда внутренние данные объекта предоставляются другим компонентам, появляется риск того, что ответственность за управление состоянием будет распределена между разными частями системы.
|
|||
|
|
|||
|
## Пример инкапсуляции
|
|||
|
Представьте, что у вас есть объект `BankAccount`, который хранит баланс пользователя. Чтобы обеспечить безопасность, прямой доступ к балансу невозможен. Вместо этого объект предоставляет методы `deposit()` и `withdraw()`, которые корректно изменяют баланс и проверяют возможность транзакции:
|
|||
|
|
|||
|
```java
|
|||
|
public class BankAccount {
|
|||
|
private double balance;
|
|||
|
|
|||
|
public void deposit(double amount) {
|
|||
|
if (amount > 0) {
|
|||
|
balance += amount;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void withdraw(double amount) {
|
|||
|
if (amount > 0 && balance >= amount) {
|
|||
|
balance -= amount;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public double getBalance() {
|
|||
|
return balance;
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Таким образом, инкапсуляция помогает управлять состоянием объекта, делая его использование безопасным и устойчивым к ошибкам.
|
|||
|
***
|
|||
|
## Мета информация
|
|||
|
**Область**:: [[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]
|
|||
|
**Родитель**:: [[ООП]]
|
|||
|
**Источник**::
|
|||
|
**Создана**:: [[2024-09-27]]
|
|||
|
**Автор**::
|
|||
|
### Дополнительные материалы
|
|||
|
-
|
|||
|
|
|||
|
### Дочерние заметки
|
|||
|
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|