9.Coding convention
9.1. Mục tiêu chương
Chương này quy định chuẩn coding và nguyên tắc thiết kế nhằm:
-
Đảm bảo code thống nhất giữa các module và các đơn vị phát triển
-
Giúp code dễ đọc, dễ hiểu và dễ bảo trì
-
Giảm lỗi phát sinh do cách đặt tên hoặc coding không đồng nhất
-
Tăng hiệu quả review và kiểm soát chất lượng code
-
Đảm bảo code tuân thủ nguyên lý thiết kế SOLID
-
Đảm bảo kiến trúc backend Spring Boot nhất quán toàn hệ thống
9.2. Khái niệm / phạm vi áp dụng
Quy định này áp dụng cho:
-
Toàn bộ source code của hệ thống
-
Core Team và Partner Team
-
Tất cả các module trong
modules/** -
Các thành phần trong
common/**vàconfig/**do Core Team quản lý -
Tất cả service, controller, repository, DTO, entity
9.3. Quy định chính
9.3.1. Quy tắc đặt tên
Các thành phần phải đặt tên theo quy ước thống nhất:
| Thành phần | Quy tắc đặt tên | Ví dụ | ||
|---|---|---|---|---|
| Controller | <Name>Controller |
UserController |
||
|
|
UserService |
||
|
|
UserRepository |
||
|
|
UserEntity |
||
| DTO
|
<Name>UpdateRequest |
UserCreateRequest |
||
DTO |
|
UserResponse |
||
|
|
UserMapper |
||
| Enum | <Name>Enum |
UserStatusEnum |
9.3.2. Quy tắc chung Java
ÁpDùng dụngcamelCase cho toàn bộ code Java:cho:
-
Dùng camelCase cho: Biến
-
Method
-
Dùng PascalCase cho:
-
Class
-
Interface
-
Enum
Ví dụ:
9.3.3. Quy định về logging
Không được dùng:
Phải dùng logging chuẩn:
9.3.3.4. Validation dữ liệu đầu vào
Tất cả dữ liệu đầu vào phải được validate bằng annotation.
Các annotationAnnotation chuẩn:
-
@NotNull -
@NotBlank -
@Size -
@Email -
@Pattern
Ví dụ:
9.4. Nguyên lý thiết kế SOLID áp dụng trong dự án
9.4.1. S — Single Responsibility
Một class chỉ có một trách nhiệm.
Quy định dự án:
-
Controller → chỉ xử lý HTTP
-
Service → xử lý nghiệp vụ
-
Repository → truy cập DB
-
Mapper → convert DTO ↔ Entity
Sai:
Đúng:
9.4.2. O — Open/Closed
Code phải mở rộng được nhưng không sửa code cũ.
Áp dụng:
-
Dùng interface Service
-
Không sửa class gốc khi thêm logic
Ví dụ:
Triển khai:
9.4.3. L — Liskov Substitution
Class con có thể thay thế class cha.
Quy định:
-
ServiceImpl phải tuân interface
-
Không throw exception mới trái contract
Sai:
9.4.4. I — Interface Segregation
Không tạo interface quá lớn.
Sai:
Đúng:
9.4.5. D — Dependency Inversion
Phụ thuộc abstraction, không phụ thuộc implementation.
Quy định:
-
Inject interface
-
Không new service
Sai:
Đúng:
9.5. Quy tắc kiến trúc Spring Boot trong dự án
9.5.1. Luồng chuẩn tầng
Không được:
9.5.2. Controller không chứa nghiệp vụ
Sai:
Đúng:
9.5.3. Service không chứa logic HTTP
Sai:
Đúng:
9.5.4. Repository chỉ truy vấn dữ liệu
Không chứa:
-
validation
-
business logic
-
mapping
9.6. Design pattern sử dụng trong hệ thống
9.6.1. Service pattern
Service là tầng nghiệp vụ trung tâm.
9.6.2. DTO pattern
Tách DTO khỏi Entity.
Không trả Entity ra API.
Sai:
Đúng:
9.6.3. Mapper pattern
Convert DTO ↔ Entity.
9.6.4. Exception pattern
Dùng BusinessException thống nhất.
9.7. Cách thực hiện / quy trình
Quy trình tạo DTO đúng chuẩn
Bước 1: Tạo class DTO theo quy tắc đặt tên
Ví dụ:
-
UserCreateRequest
-
UserUpdateRequest
-
UserResponse
Bước 2: Thêm validation annotation
Bước 3: Dùng DTO trong controller
Quy trình logging chuẩn
Bước 1: Khai báo logger trong class
Bước 2: Dùng logger thay cho System.out.println
9.5.8. Ví dụ minh họa
Trường hợp sai
Sai vì:
-
Tên class không đúng chuẩn
-
Tên method không camelCase
-
Dùng System.out.println
-
Không theo kiến trúc tầng
Trường hợp đúng
Ví dụ DTO sai
Sai vì:
-
Tên class không chuẩn
-
Không có validation
-
Field public
-
Không theo DTO pattern
Ví dụ DTO đúng
9.6.9. Checklist áp dụng
Trước khi commit hoặc tạo PR:
Tên class đúng chuẩn:-
Controller →
*Controller -
Service →
*Service -
Repository →
*Repository -
Entity →
*Entity -
DTO →
*Request / *Response -
Biến và method dùng camelCase
-
Class dùng PascalCase
-
Không dùng System.out.println
-
Dùng logging chuẩn slf4j
-
DTO có validation annotation
-
Không có field public trong DTO
Naming
Coding
Validation
SOLID
-
Controller không chứa nghiệp vụ
-
Service không chứa HTTP logic
-
Repository chỉ truy vấn DB
-
Inject interface, không new
-
Class có 1 trách nhiệm
Architecture
-
Không Controller → Repository
-
Không trả Entity ra API
-
Có DTO mapping
-
Exception dùng chuẩn hệ thống