Что такое слоистая архитектура в разработке ПО?

Ответ

Слоистая архитектура (Layered Architecture) — это архитектурный паттерн, при котором компоненты системы группируются в горизонтальные слои. Каждый слой выполняет определённую роль и имеет чётко определённые обязанности.

Ключевая идея — изоляция: изменения в одном слое (например, замена базы данных) не должны затрагивать другие слои (например, пользовательский интерфейс).

Основные принципы:

  • Разделение ответственности (Separation of Concerns): Каждый слой отвечает за свою часть функциональности (UI, бизнес-логика, доступ к данным).
  • Однонаправленные зависимости: Верхние слои могут вызывать только нижележащие слои. Например, слой представления обращается к слою бизнес-логики, но не наоборот.

Типичная 3-слойная структура:

  1. Слой представления (Presentation Layer): Отвечает за взаимодействие с пользователем (UI, API-контроллеры).
  2. Слой бизнес-логики (Business/Application Layer): Содержит основную логику приложения, координирует задачи и использует слой данных.
  3. Слой доступа к данным (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)