- vừa được xem lúc

Clean Architecture – Old but Gold

0 0 3

Người đăng: Coong Laam

Theo Viblo Asia

“Code sạch không chỉ là đẹp – mà là bền vững.”

☕ Mở đầu: Tại sao Clean Architecture lại ‘vàng’?

Hãy tưởng tượng bạn xây một quán cà phê:

  • Bạn muốn dễ thay đổi thực đơn
  • Có thể mở thêm chi nhánh
  • Và tuyển nhân viên mới mà không phải training cả tháng

Viết phần mềm cũng thế. Dự án càng lớn, càng lâu dài thì bạn càng cần kiến trúc rõ ràng. Đó là lúc Clean Architecture – mô hình kinh điển của "chú Bob" (Uncle Bob) – phát huy sức mạnh.

📐 Clean Architecture là gì?

Clean Architecture chia hệ thống thành nhiều lớp (layer) tách biệt, mỗi lớp có một vai trò riêngchỉ phụ thuộc vào lớp bên trong – nghĩa là:

  • Domain không phụ thuộc framework
  • Use case không biết gì về REST API
  • Controller chỉ là người đưa thư

👉 Clean Architecture đảo ngược mối phụ thuộc: business điều khiển infrastructure – chứ không phải ngược lại!

🧩 Các lớp trong Clean Architecture

Sơ đồ tổng thể:

💡 Hình dung dễ hiểu:

Lớp Vai trò Ví dụ
Entities Business thuần khiết User, Order, các quy tắc nghiệp vụ
Use Cases Logic ứng dụng Xử lý đăng ký tài khoản, đặt hàng
Interface Adapters Chuyển đổi dữ liệu Controller, DTO, Mapper
Frameworks & Drivers Giao tiếp ngoài Spring Boot, DB, Redis

💻 Áp dụng với Spring Boot: Một ví dụ mini

Giả sử bạn xây hệ thống đăng ký người dùng.

1. Entity – Domain thuần túy

// domain/model/User.java
public class User { private Long id; private String name; private String email; public boolean isValidEmail() { return email.contains("@"); }
}

2. Use Case – Business điều khiển hành động

// application/port/in/CreateUserUseCase.java
public interface CreateUserUseCase { User createUser(CreateUserCommand command);
}
// application/service/CreateUserService.java
public class CreateUserService implements CreateUserUseCase { private final UserRepository userRepository; public User createUser(CreateUserCommand command) { if (!command.getEmail().contains("@")) { throw new IllegalArgumentException("Email không hợp lệ"); } return userRepository.save(new User(null, command.getName(), command.getEmail())); }
}

3. Adapter – Giao tiếp bên ngoài

// adapter/web/UserController.java
@RestController
@RequestMapping("/api/users")
public class UserController { private final CreateUserUseCase createUserUseCase; @PostMapping public ResponseEntity<UserResponse> create(@RequestBody CreateUserRequest request) { User user = createUserUseCase.createUser( new CreateUserCommand(request.getName(), request.getEmail())); return ResponseEntity.ok(UserMapper.toResponse(user)); }
}

4. Infrastructure – Lưu trữ với JPA

@Repository
public class JpaUserRepository implements UserRepository { private final SpringDataUserRepository repo; public User save(User user) { UserEntity entity = UserMapper.toEntity(user); return UserMapper.toDomain(repo.save(entity)); }
}

🗂️ Cấu trúc thư mục gợi ý

src/
├── domain/ ← Entity, Value Object
├── application/ ← Use Case, Port In/Out
├── adapter/ ← Controller, DTO, Mapper
├── infrastructure/ ← DB, Email, File, Kafka...
└── config/ ← Spring config

🧪 Bonus: Test use case không cần Spring context

@Test
void testCreateUser() { UserRepository fakeRepo = new InMemoryUserRepo(); CreateUserUseCase service = new CreateUserService(fakeRepo); User result = service.createUser(new CreateUserCommand("Alice", "alice@gmail.com")); assertEquals("Alice", result.getName());
}

⚖️ So sánh nhanh

Kiểu Project Ưu điểm Nhược điểm
Monolith truyền thống Code nhanh Dễ rối
Clean Architecture Mở rộng, test dễ Cấu trúc ban đầu phức tạp hơn

✅ Lợi ích thật sự khi dùng Clean Architecture

  • Code bạn không “dính chặt” vào Spring, JPA hay bất kỳ công nghệ nào
  • Viết test dễ dàng ở tầng Use Case mà không cần chạy server
  • Thay DB, framework... không ảnh hưởng domain
  • Code nhìn như Lego – lắp vào, tháo ra, nâng cấp thoải mái

⚠️ Clean Architecture – Không phải “cây đũa thần”

Mặc dù rất mạnh mẽ và đáng tin cậy, Clean Architecture vẫn có một vài hạn chế mà bạn cần lưu ý:

1. Cấu trúc ban đầu khá phức tạp Với những dự án nhỏ hoặc MVP, việc chia lớp rõ ràng có thể tốn công hơn giá trị mang lại.

2. Tăng số lượng file và lớp Một logic đơn giản có thể cần đến 4–5 file (entity, use case, port, adapter, dto…) – gây “choáng” cho người mới.

3. Yêu cầu tư duy kiến trúc cao hơn Dễ hiểu sai nếu không nắm rõ nguyên lý: nhiều dự án gắn mác “clean” nhưng phụ thuộc lẫn lộn.

4. Khó tích hợp với framework "magic" Ví dụ: dùng Spring Boot với JPA annotation nặng bên trong entity → nếu không tách domain đúng cách thì lại “rối”.

5. Dễ bị over-engineering Nếu lạm dụng hoặc áp dụng cho mọi loại project, bạn sẽ mất thời gian cho những thứ không cần thiết.

🏁 Kết luận: Old but gold

Clean Architecture không phải trend mới, nhưng như mọi viên kim cương – giá trị nằm ở sự bền vững. Dù dự án của bạn dùng Spring Boot, Quarkus hay gì đi nữa, thì kiến trúc sạch là khoản đầu tư sinh lời.

“Hãy viết code như thể người duy nhất bảo trì nó là… một phiên bản buồn ngủ của chính bạn.” 😴


Bài viết của mình kết thúc ở đây, nếu có thắc mắc hay góp ý gì thì hãy comment ở phía dưới nhé các bạn. Happy coding!!

Source: https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html

Bình luận

Bài viết tương tự

- vừa được xem lúc

Các loại Design Patterns thường dùng ở Android và App Architectures - Phần 1

Buồn quá mọi người ạ, bài trước publish rồi mà Viblo bị dính quả bug to quá nên bài viết từ 18-05 đến 20-05 của mọi tài khoản đều bị mất hết rồi. Lại phải cụm cụi viết lại đây ạ.

0 0 407

- vừa được xem lúc

Khởi tạo ViewModel sao cho hợp thời đại

Bài viết này tôi sẽ sử dụng Kotlin để khởi tạo ViewModel và AndroidViewModel. Nếu bạn chưa biết Delegation trong Kotlin thì hãy đọc bài viết này trước nhé.

0 0 71

- vừa được xem lúc

Clean Architecture

1. Clean Architecture là gì.

0 0 37

- vừa được xem lúc

Dựng Golang microservice boilerplate theo clean architecture

Chuyện về việc học. Như các bạn đã biết, mình trước giờ chủ yếu code đột NÉT, nhưng lại có thêm vài mối tình ngoài em nó, chẳng hạn PHP, Nodejs.

0 0 41

- vừa được xem lúc

Tìm hiểu về Clean Architecture

1.Clean Architecture là gì. Kiến trúc của Clean Architecture chia thành 4 layer với một quy tắc phụ thuộc. Use Cases (Application business rules).

0 0 26

- vừa được xem lúc

Clean Architect Với FrontEnd

※ Bài viết được dịch tóm lược từ nguồn: https://dev.to/bespoyasov/clean-architecture-on-frontend-4311.

0 0 24