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

Какие сущности определяют бизнес-логику в Clean Architecture

2.7 Senior🔥 151 комментариев
#Архитектура и паттерны

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

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

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

Сущности, определяющие бизнес-логику в Clean Architecture

Clean Architecture — это архитектурный паттерн, предложенный Robert C. Martin (Uncle Bob) для создания независимых, тестируемых и масштабируемых приложений. В центре этой архитектуры находятся Entity (Сущности).

Слои Clean Architecture

Архитектура представляет собой несколько концентрических кругов:

  1. Entities (Сущности) — самый внутренний слой
  2. Use Cases (Прецеденты использования)
  3. Interface Adapters (Адаптеры интерфейсов)
  4. Frameworks & Drivers (Фреймворки и драйверы) — самый внешний

Дependency Rule: зависимости идут только внутрь (внешние слои зависят от внутренних, но не наоборот).

Entities — Сущности

Entities инкапсулируют критическую бизнес-логику приложения. Это объекты, которые существуют независимо от Use Cases или фреймворков:

data class User(
    val id: String,
    val name: String,
    val email: String,
    val createdAt: LocalDateTime
) {
    fun isValidEmail(): Boolean {
        return email.matches(Regex("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}"))
    }
    
    fun isAdult(): Boolean {
        return LocalDateTime.now().minusYears(18).isAfter(createdAt)
    }
}

Use Cases

Use Cases содержат бизнес-логику, которая использует Entities:

class CreateUserUseCase(private val repository: UserRepository) {
    fun execute(name: String, email: String): Result<User> {
        val user = User(UUID.randomUUID().toString(), name, email, LocalDateTime.now())
        
        if (!user.isValidEmail()) {
            return Result.Error("Invalid email")
        }
        
        return try {
            val savedUser = repository.save(user)
            Result.Success(savedUser)
        } catch (e: Exception) {
            Result.Error(e.message ?: "Unknown error")
        }
    }
}

Interface Adapters

Этот слой преобразует данные из Use Cases в форму, удобную для UI:

class UserViewModel(private val createUserUseCase: CreateUserUseCase) : ViewModel() {
    private val _uiState = MutableLiveData<UiState>()
    val uiState: LiveData<UiState> = _uiState
    
    fun createUser(name: String, email: String) {
        viewModelScope.launch {
            val result = createUserUseCase.execute(name, email)
            when (result) {
                is Result.Success -> _uiState.value = UiState.Success(result.data)
                is Result.Error -> _uiState.value = UiState.Error(result.message)
            }
        }
    }
}

Frameworks & Drivers

Внешний слой содержит фреймворки и инструменты:

class UserRepositoryImpl(private val database: AppDatabase) : UserRepository {
    override fun save(user: User): User {
        val entity = UserEntity(
            id = user.id,
            name = user.name,
            email = user.email,
            createdAt = user.createdAt
        )
        database.userDao().insert(entity)
        return user
    }
}

Преимущества Clean Architecture

  • Независимость от фреймворков: бизнес-логика не зависит от Android, базы данных
  • Тестируемость: Entity и Use Cases легко тестируются
  • Разделение ответственности: каждый слой отвечает за свою область
  • Гибкость: легко менять реализацию без влияния на бизнес-логику
  • Масштабируемость: простой рост архитектуры

Практическое применение в Android

В Android приложениях обычно используют вариацию Clean Architecture с Architecture Components (ViewModel, LiveData, Repository Pattern). Это позволяет строить чистый, тестируемый код, который легко поддерживать и расширять.

Какие сущности определяют бизнес-логику в Clean Architecture | PrepBro