← Назад к вопросам

Что такое бизнес-логика?

2.0 Middle🔥 161 комментариев
#SOLID и паттерны проектирования#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Бизнес-логика в приложениях

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

Основные примеры бизнес-логики

1. Расчёты и валидация

Определение допустимых значений и вычисление результатов по правилам бизнеса:

// Бизнес-логика: рассчитать цену с учётом скидок
public class OrderService {
    public BigDecimal calculateTotal(Order order) {
        BigDecimal subtotal = order.getItems()
            .stream()
            .map(item -> item.getPrice().multiply(
                new BigDecimal(item.getQuantity())))
            .reduce(BigDecimal.ZERO, BigDecimal::add);
        
        // Бизнес-правило: скидка 10% при заказе более 100 долларов
        BigDecimal discount = subtotal.compareTo(
            new BigDecimal("100")) > 0 
            ? subtotal.multiply(new BigDecimal("0.1")) 
            : BigDecimal.ZERO;
        
        // Бизнес-правило: добавить налог
        BigDecimal tax = subtotal
            .subtract(discount)
            .multiply(new BigDecimal("0.18"));
        
        return subtotal.subtract(discount).add(tax);
    }
}

2. Управление состояниями и переходами

Котролирование допустимых переходов между состояниями заказа:

// Бизнес-логика: допустимые переходы статусов заказа
public class OrderStateManager {
    private Order order;
    
    public void confirmOrder() {
        // Бизнес-правило: заказ можно подтвердить только если он новый
        if (order.getStatus() != OrderStatus.NEW) {
            throw new InvalidOrderStateException(
                "Заказ можно подтвердить только из статуса NEW");
        }
        order.setStatus(OrderStatus.CONFIRMED);
        order.setConfirmationDate(LocalDateTime.now());
    }
    
    public void shipOrder() {
        // Бизнес-правило: можно отправить только подтверждённый заказ
        if (order.getStatus() != OrderStatus.CONFIRMED) {
            throw new InvalidOrderStateException(
                "Заказ должен быть подтвёрждён перед отправкой");
        }
        // Бизнес-правило: проверить наличие товара
        validateInventory(order);
        order.setStatus(OrderStatus.SHIPPED);
    }
    
    public void cancelOrder() {
        // Бизнес-правило: заказ можно отменить только до отправки
        if (order.getStatus() == OrderStatus.SHIPPED || 
            order.getStatus() == OrderStatus.DELIVERED) {
            throw new InvalidOrderStateException(
                "Невозможно отменить отправленный заказ");
        }
        order.setStatus(OrderStatus.CANCELLED);
    }
}

3. Бизнес-процессы

Комплексные операции, объединяющие несколько шагов:

// Бизнес-логика: процесс оплаты заказа
public class PaymentProcessor {
    private PaymentGateway gateway;
    private OrderService orderService;
    private InventoryService inventoryService;
    private NotificationService notificationService;
    
    public void processPayment(Order order, Payment payment) {
        // Шаг 1: Валидация платежа
        validatePayment(order, payment);
        
        // Шаг 2: Проверка доступности средств
        boolean paymentSuccess = gateway.charge(
            payment.getCardNumber(),
            order.getTotal()
        );
        
        if (!paymentSuccess) {
            order.setStatus(OrderStatus.PAYMENT_FAILED);
            throw new PaymentException("Платёж отклонён");
        }
        
        // Шаг 3: Обновить статус заказа
        order.setStatus(OrderStatus.PAID);
        order.setPaymentDate(LocalDateTime.now());
        
        // Шаг 4: Зарезервировать товар
        inventoryService.reserveItems(order.getItems());
        
        // Шаг 5: Отправить уведомление
        notificationService.sendConfirmationEmail(order.getCustomer());
        
        // Шаг 6: Сохранить заказ
        orderService.save(order);
    }
    
    private void validatePayment(Order order, Payment payment) {
        // Бизнес-правило: проверить минимальную сумму заказа
        if (order.getTotal().compareTo(new BigDecimal("10")) < 0) {
            throw new ValidationException("Минимальная сумма заказа: 10 долларов");
        }
        
        // Бизнес-правило: проверить срок действия карты
        if (payment.isExpired()) {
            throw new ValidationException("Карта истекла");
        }
    }
}

4. Правила доступа и авторизации

Бизнес-правила для управления доступом к функциям:

// Бизнес-логика: определить доступные действия для пользователя
public class PermissionManager {
    public boolean canEditOrder(User user, Order order) {
        // Бизнес-правило: владелец может редактировать незавершённый заказ
        if (user.getId().equals(order.getCustomerId()) && 
            order.getStatus().isEditable()) {
            return true;
        }
        
        // Бизнес-правило: админы могут редактировать любой заказ
        if (user.hasRole("ADMIN")) {
            return true;
        }
        
        return false;
    }
    
    public boolean canApplyPromoCode(User user, PromoCode code) {
        // Бизнес-правило: промокод действует только для новых пользователей
        if (code.isNewCustomersOnly() && !user.isNewCustomer()) {
            return false;
        }
        
        // Бизнес-правило: проверить срок действия
        if (code.isExpired()) {
            return false;
        }
        
        // Бизнес-правило: проверить лимит использований
        if (code.getUsageLimit() <= code.getTimesUsed()) {
            return false;
        }
        
        return true;
    }
}

Архитектурное расположение бизнес-логики

В Clean Architecture и DDD бизнес-логика размещается в отдельных слоях:

// Domain слой (бизнес-логика ядра)
public class OrderAggregate {
    private List<OrderItem> items;
    private Customer customer;
    private OrderStatus status;
    
    // Методы с бизнес-логикой
    public void addItem(Product product, int quantity) {
        // Бизнес-правило: можно добавлять только в новый заказ
        if (status != OrderStatus.NEW) {
            throw new BusinessRuleException(
                "Не можно добавить товар");
        }
        items.add(new OrderItem(product, quantity));
    }
}

Лучшие практики

1. Отделение бизнес-логики от технических деталей

Бизнес-логика должна быть независима от базы данных, HTTP и других технических деталей. Она должна описывать реальные процессы предметной области.

2. Тестируемость

Хорошо организованная бизнес-логика легко покрывается unit-тестами без необходимости мокирования сложных зависимостей.

3. Использование доменных объектов

Объекты должны инкапсулировать как данные, так и методы, операции с этими данными в соответствии с бизнес-правилами.

Бизнес-логика — это сердце приложения. Её правильная организация определяет качество, тестируемость и maintainability системы.

Что такое бизнес-логика? | PrepBro