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 |
| Service | <Name>Service |
UserService |
| Repository | <Name>Repository |
UserRepository |
| Entity | <Name>Entity |
UserEntity |
| DTO Request | <Name>CreateRequest, <Name>UpdateRequest |
UserCreateRequest |
| DTO Response | <Name>Response |
UserResponse |
| Mapper | <Name>Mapper |
UserMapper |
| Enum | <Name>Enum |
UserStatusEnum |
9.3.2. Quy tắc chung Java
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.4. Validation dữ liệu đầu vào
Tất cả dữ liệu đầu vào phải được validate bằng annotation.
Annotation 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.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.9. Checklist áp dụng
Trước khi commit hoặc tạo PR:
Naming
-
Controller →
*Controller -
Service →
*Service -
Repository →
*Repository -
Entity →
*Entity -
DTO →
*Request / *Response
Coding
-
Biến và method dùng camelCase
-
Class dùng PascalCase
-
Không dùng System.out.println
-
Dùng logging chuẩn slf4j
Validation
-
DTO có validation annotation
-
Không có field public trong DTO
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
9.10. Cấu trúc chuẩn của một hàm xử lý nghiệp vụ
9.10.1. Mục tiêu
Quy định cấu trúc thống nhất của một hàm xử lý nghiệp vụ nhằm:
-
Dễ đọc và dễ review
-
Tách rõ validate – logic – log – exception
-
Tránh thiếu validate hoặc thiếu log
-
Chuẩn hóa xử lý lỗi và response
-
Giúp dev mới đọc code hiểu ngay luồng xử lý
9.10.2. Cấu trúc chuẩn bắt buộc
Một hàm service/controller phải theo thứ tự:
9.10.3. Quy định chi tiết từng phần
1. Validate
-
Validate annotation ở DTO
-
Validate nghiệp vụ ở service
Ví dụ:
2. Log
Phải log:
-
input chính
-
hành động nghiệp vụ
-
lỗi
3. Business logic
Chỉ chứa xử lý nghiệp vụ:
-
mapping
-
tính toán
-
gọi repository
-
gọi service khác
4. Exception handling
Không catch Exception chung chung nếu không xử lý.
Sai:
Đúng:
5. Response
Service:
-
trả DTO
-
hoặc throw BusinessException
Controller:
-
trả ApiResponse
Controller:
9.10.4. Ví dụ hàm sai
Sai vì:
-
Không validate
-
Không log
-
Trả entity
-
Không xử lý lỗi
-
Không theo DTO pattern
9.10.5. Ví dụ hàm đúng chuẩn dự án
9.10.6. Checklist
Khi review hàm service/controller:
-
Có validate nghiệp vụ
-
Có log input chính
-
Không xử lý logic trong controller
-
Không trả Entity
-
Throw BusinessException đúng chuẩn
-
Không catch Exception vô nghĩa
-
Trả DTO / ApiResponse đúng chuẩn