47 lines
4.2 KiB
Markdown
47 lines
4.2 KiB
Markdown
---
|
||
aliases:
|
||
- Контракты
|
||
- контракт
|
||
tags:
|
||
- maturity/🌱
|
||
date: 2024-09-27
|
||
zero-link:
|
||
- "[[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]"
|
||
- "[[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]]"
|
||
---
|
||
В контексте разработки программного обеспечения **контракт** — это соглашение или набор правил, определяющий, как различные части системы (например, компоненты, классы или модули) взаимодействуют друг с другом. Контракт описывает обязанности и ожидания каждой из сторон (поставщика и потребителя), гарантируя, что при соблюдении этих условий взаимодействие будет корректным и предсказуемым.
|
||
|
||
Основные элементы контракта:
|
||
- **Предусловия**: Условия, которые должны быть выполнены перед вызовом метода или началом взаимодействия. Например, входные данные метода должны быть корректными, а ресурс должен быть доступен.
|
||
- **Постусловия**: Результаты, которые гарантируются после выполнения метода или операции, если предусловия были выполнены. Это может включать возвращаемое значение метода или состояние объекта после вызова.
|
||
- **Инварианты**: Условия, которые остаются неизменными в течение жизни объекта. Например, допустимые диапазоны значений переменных или непротиворечивость состояния системы.
|
||
## Примеры контрактов
|
||
**Контракт в объектно-ориентированном программировании**: В [[ООП|ООП]] контракт может выражаться через интерфейсы или абстрактные классы, которые определяют набор методов, обязательных для реализации. Это позволяет программным компонентам общаться на основе общих соглашений, не зная конкретную реализацию.
|
||
|
||
Пример интерфейса как контракта:
|
||
```java
|
||
public interface Shape {
|
||
double calculateArea(); // контракт: любой класс, реализующий Shape, обязан иметь этот метод
|
||
}
|
||
```
|
||
|
||
**Контракт API**: В контексте API контрактом является описание того, как клиент может взаимодействовать с API. Это включает в себя форматы запросов и ответов, методы HTTP, параметры, типы данных, кодировки и обработку ошибок.
|
||
|
||
Пример контракта [[../system-design/RESTful|REST]] API:
|
||
- Метод: `POST /users`
|
||
- Входные данные: JSON-объект с полями `name` и `email`
|
||
- Ответ: код 201 (Created) и объект пользователя
|
||
- Ошибки: код 400 (Bad Request) при некорректных данных
|
||
***
|
||
## Мета информация
|
||
**Область**:: [[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]], [[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]]
|
||
**Родитель**::
|
||
**Источник**::
|
||
**Создана**:: [[2024-09-27]]
|
||
**Автор**::
|
||
### Дополнительные материалы
|
||
-
|
||
|
||
### Дочерние заметки
|
||
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|