Что такое бизнес-логика?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Бизнес-логика в приложениях
Бизнес-логика — это набор правил, алгоритмов и процессов, которые реализуют основную функциональность приложения в соответствии с требованиями бизнеса. Это ядро приложения, которое определяет, как система работает, обрабатывает данные и принимает решения. Бизнес-логика отделена от технических деталей реализации (базы данных, пользовательского интерфейса, сетевых протоколов) и отражает реальные процессы организации.
Основные примеры бизнес-логики
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 системы.