Ответ
Слоистая архитектура (Layered Architecture) — это архитектурный паттерн, при котором компоненты системы группируются в горизонтальные слои. Каждый слой выполняет определённую роль и имеет чётко определённые обязанности.
Ключевая идея — изоляция: изменения в одном слое (например, замена базы данных) не должны затрагивать другие слои (например, пользовательский интерфейс).
Основные принципы:
- Разделение ответственности (Separation of Concerns): Каждый слой отвечает за свою часть функциональности (UI, бизнес-логика, доступ к данным).
- Однонаправленные зависимости: Верхние слои могут вызывать только нижележащие слои. Например, слой представления обращается к слою бизнес-логики, но не наоборот.
Типичная 3-слойная структура:
- Слой представления (Presentation Layer): Отвечает за взаимодействие с пользователем (UI, API-контроллеры).
- Слой бизнес-логики (Business/Application Layer): Содержит основную логику приложения, координирует задачи и использует слой данных.
- Слой доступа к данным (Data Access/Persistence Layer): Обеспечивает взаимодействие с базой данных или другими источниками данных.
Пример на Python (Flask):
# 1. Presentation Layer (API-контроллер)
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/users/<int:user_id>')
def get_user(user_id):
# Обращение к нижележащему слою бизнес-логики
user = user_service.get_user_by_id(user_id)
if user:
return jsonify(user)
return jsonify({'error': 'User not found'}), 404
# 2. Business Logic Layer (Сервис)
class UserService:
def __init__(self, repository):
self._repository = repository
def get_user_by_id(self, user_id):
# Логика получения пользователя
return self._repository.find_by_id(user_id)
# 3. Data Access Layer (Репозиторий)
class UserRepository:
def find_by_id(self, user_id):
# Здесь был бы код для запроса к БД, например, через SQLAlchemy
# Для примера возвращаем статические данные
users = {1: {'id': 1, 'name': 'Alice'}, 2: {'id': 2, 'name': 'Bob'}}
return users.get(user_id)
# Инициализация зависимостей
user_repository = UserRepository()
user_service = UserService(user_repository)