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

Какая логика модели в MVC?

1.0 Junior🔥 151 комментариев
#SOLID и паттерны проектирования#Основы Java

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

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

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

# Какая логика модели в MVC?

Модель в MVC содержит вся бизнес-логика приложения — всё, что не связано с представлением пользователю (UI) и управлением потоком запросов.

Структура MVC

Узел управления:

  • Model - данные и их преобразование
  • Controller - логика управления, маршрутизация
  • View - представление данных

Что входит в Model?

1. Бизнес-логика

public class User {
    private String email;
    private String password;
    
    public boolean isValidEmail() {
        return email.matches("^[A-Za-z0-9+_.-]+@(.+)$");
    }
    
    public boolean isPasswordStrong() {
        return password.length() >= 8;
    }
}

public class UserService {
    public User register(String email, String password) {
        if (!isValidEmail(email)) {
            throw new ValidationException("Invalid email");
        }
        User user = new User(email, hashPassword(password));
        userRepository.save(user);
        return user;
    }
    
    public User authenticate(String email, String password) {
        User user = userRepository.findByEmail(email);
        if (!validatePassword(password, user.getPassword())) {
            throw new AuthException("Invalid password");
        }
        return user;
    }
}

2. Доступ к данным (Repository/DAO)

public interface UserRepository {
    User findByEmail(String email);
    void save(User user);
    void delete(Long id);
    List<User> findAll();
}

3. Entities (Модели данных)

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(nullable = false, unique = true)
    private String email;
    
    @Column(nullable = false)
    private String password;
}

Что НЕ входит в Model?

Не входят HTTP детали

// ПЛОХО - HTTP в Model
public class UserService {
    public ResponseEntity<?> register(HttpServletRequest request) {
    }
}

// ХОРОШО - только бизнес-логика
public class UserService {
    public User register(String email, String password) {
    }
}

Не входит логика представления

// ПЛОХО - View логика в Model
public class User {
    public String getFormattedEmail() {
        return "<strong>" + email + "</strong>";
    }
}

// ХОРОШО
public class User {
    public String getEmail() {
        return email;
    }
}

Не входит управление потоком

// ПЛОХО - управление потоком в Model
public class UserService {
    public void handleRequest() {
        if (isLogin) {
            redirectToHome();
        }
    }
}

// ХОРОШО - это работа Controller
public class UserController {
    @PostMapping("/login")
    public String login(String email, String password) {
        User user = userService.authenticate(email, password);
        return "redirect:/home";
    }
}

Пример: полная MVC структура

Model слой

@Entity
public class Order {
    @Id
    private Long id;
    private String status;
    private BigDecimal total;
}

@Service
public class OrderService {
    @Autowired
    private OrderRepository repository;
    
    public Order createOrder(Long userId, List<Long> itemIds) {
        Order order = new Order();
        order.setUserId(userId);
        order.setStatus("PENDING");
        order.setTotal(calculateTotal(itemIds));
        repository.save(order);
        return order;
    }
    
    public void payOrder(Long orderId) {
        Order order = repository.findById(orderId).orElseThrow();
        if (!order.getStatus().equals("PENDING")) {
            throw new OrderException("Cannot pay");
        }
        order.setStatus("PAID");
        repository.save(order);
    }
}

Controller слой

@RestController
@RequestMapping("/api/orders")
public class OrderController {
    @Autowired
    private OrderService orderService;
    
    @PostMapping
    public OrderDTO createOrder(@RequestBody CreateOrderRequest request) {
        Order order = orderService.createOrder(
            request.getUserId(),
            request.getItemIds()
        );
        return OrderDTO.fromEntity(order);
    }
    
    @PostMapping("/{id}/pay")
    public OrderDTO payOrder(@PathVariable Long id) {
        orderService.payOrder(id);
        Order order = orderService.getOrderById(id);
        return OrderDTO.fromEntity(order);
    }
}

Слои Model в Spring архитектуре

Model
├── Entities (Domain Models)
├── DTOs (Data Transfer Objects)
├── Services (Бизнес-логика)
├── Repositories (Доступ к данным)
└── Utils/Validators (Вспомогательные)

Ключевые принципы

  1. Model независим - не знает о View и Controller
  2. Переиспользуемость - Model в разных Controller
  3. Тестируемость - Unit тесты без Controller
  4. Разделение ответственности - каждый слой делает одно

Заключение

Model содержит:

  • Бизнес-логику приложения
  • Доступ к данным (Repository)
  • Валидацию данных
  • Расчёты и преобразования
  • Domain entities

Model НЕ содержит:

  • HTTP/Request/Response детали
  • HTML/UI форматирование
  • Маршрутизацию и управление потоком
  • Сессии и cookies напрямую

Это разделение позволяет иметь чистую, тестируемую, переиспользуемую архитектуру.