Sobes.tech
Middle+

What can you tell about clean architecture?

sobes.tech AI

Answer from AI

Clean Architecture, popularized by Robert Martin ("Uncle Bob"), is a set of principles for organizing code aimed at creating flexible, testable, and easily maintainable systems.

Main ideas:

  1. Layered architecture: Code is divided into concentric circles, with inner circles containing business logic, and outer ones containing implementation details (UI, databases, external APIs).
  2. Dependence on inner layers: Outer layers depend on inner layers, but not vice versa. This is achieved through the Dependency Inversion Principle.
  3. Encapsulation: Each layer hides its implementation details from outer layers.
  4. Testability: Business logic in the central layers does not depend on external details, making it easy to test in isolation.
  5. Framework independence: Core business rules are not tied to specific frameworks, UI, or databases.

Layers (example):

  • Entities: Contain business objects and rules (e.g., a User class with business logic related to the user).
  • Use Cases (Interactors): Contain application-specific business logic (e.g., GetUserUseCase). They orchestrate interactions between Entities and Gateway Interfaces.
  • Interface Adapters: Adapt data from external sources into a format understandable by Use Cases and Entities (e.g., Presenters for UI, Gateway Implementations for databases).
  • Frameworks & Drivers: External layer containing frameworks (UI, databases, web services).

The dependency inversion principle plays a key role. Inner layers define interfaces (Gateway Interfaces), and outer layers implement these interfaces. This is shown in the following diagram:

+-----------------+      +-------------------+      +--------------------+      +------------------------+
| Frameworks &    |----->|   Interface       |<-----|    Use Cases       |<-----|        Entities          |
| Drivers (UI, DB)|      |   Adapters        |      |  (Interactors)     |      |      (Business Rules)    |
+-----------------+      |  (Presenters,     |      |                    |      +------------------------+
                         |  Gateway Impls)   |      |                    |
                         +-------------------+      +--------------------+

Arrows indicate dependency directions. All dependencies point inward toward the Entities layer.

In Android development, Clean Architecture is often implemented using components such as:

  • UI Layer (Presentation): Activity, Fragment, ViewModel, UI Logic. Depends on Domain Layer.
  • Domain Layer (Use Cases): Application's business logic. Does not depend on other layers.
  • Data Layer: Data sources (network, databases), repositories. Implements interfaces defined in the Domain Layer.

Example structure:

root
├── app
│   ├── src
│   │   └── main
│   │       └── java
│   │           └── com
│   │               └── example
│   │                   └── myapp
│   │                       ├── presentation  // UI Layer (ViewModel, Activities, Fragments)
│   │                       │   ├── ui
│   │                       │   └── viewmodel
│   │                       ├── domain      // Domain Layer (Use Cases, Entities, Interfaces)
│   │                       │   ├── entity
│   │                       │   ├── repository  // Domain Interfaces
│   │                       │   └── usecase
│   │                       └── data        // Data Layer (Repositories, Data Sources, Mappers)
│   │                           ├── local       // Local Data Source (Room)
│   │                           ├── remote      // Remote Data Source (Retrofit)
│   │                           ├── mapper
│   │                           └── repository  // Data Impls extending Domain Interfaces
│   └── build.gradle
└── build.gradle

Advantages:

  • Testability: Business logic is isolated and easily testable.
  • Flexibility: Easy to replace external dependencies (e.g., switch from Room to Realm).
  • Maintainability: Clear separation of responsibilities makes the code easier to understand and maintain.
  • Technology independence: Business logic is not tied to specific Android frameworks or libraries.

Disadvantages:

  • Complexity: Can be initially more complex to understand and implement, especially for small projects.
  • More code: Requires writing more classes and interfaces compared to simpler architectures.

Overall, Clean Architecture is a powerful approach for creating scalable and maintainable Android applications, especially for medium and large projects. It promotes development around business logic rather than technical details.