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.

What can you tell about clean architecture? — Android - sobes.tech