Какие сущности определяют бизнес-логику в Clean Architecture
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Сущности, определяющие бизнес-логику в Clean Architecture
Clean Architecture — это архитектурный паттерн, предложенный Robert C. Martin (Uncle Bob) для создания независимых, тестируемых и масштабируемых приложений. В центре этой архитектуры находятся Entity (Сущности).
Слои Clean Architecture
Архитектура представляет собой несколько концентрических кругов:
- Entities (Сущности) — самый внутренний слой
- Use Cases (Прецеденты использования)
- Interface Adapters (Адаптеры интерфейсов)
- 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). Это позволяет строить чистый, тестируемый код, который легко поддерживать и расширять.