Clean code thực dụng: viết code để người sau sửa được an toàn Trung cấp
Cụm này trả lời: “clean” nghĩa là gì khi đo bằng chi phí sửa code, và refactor một service thật từng bước ra sao mà không làm vỡ production.
Vấn đề
Phần tiêu đề “Vấn đề”“Clean” không phải là đẹp hay ngắn. Định nghĩa vận hành của cụm này:
- Rẻ để sửa: một thay đổi nghiệp vụ chạm ít file, ít nhánh.
- An toàn để sửa: sửa xong có test bắt được hồi quy, lỗi không bị nuốt.
- Dễ review: người review hiểu ý định trong vài phút, không phải chạy code trong đầu.
Mọi quy tắc phải trả lời được: “nó làm thay đổi tiếp theo rẻ hơn hay an toàn hơn ở đâu?”. Không trả lời được thì đó là dogma, bỏ qua.
Đọc theo thứ tự nào
Phần tiêu đề “Đọc theo thứ tự nào”Đang tải diagram…
Trong cụm này
Phần tiêu đề “Trong cụm này”| Phần | Câu hỏi nó trả lời |
|---|---|
| Refactor an toàn | Code “before” sai ở đâu? Làm sao refactor mà chứng minh được không đổi hành vi? |
| Hàm và side effect | Guard clause, bỏ flag, hằng số có đơn vị, tách lõi thuần khỏi I/O thế nào? |
| Lỗi, comment, DRY | Lỗi nào là kết quả, lỗi nào là exception? Comment gì? Khi nào trùng lặp tốt hơn abstraction? |
| Lỗi hay gặp | Các mẫu code BAD/GOOD dev hay viết, hậu quả cụ thể khi nào nổ |
Tóm tắt quyết định
Phần tiêu đề “Tóm tắt quyết định”| Triệu chứng trong code | Mặc định nên làm | Vì sao |
|---|---|---|
if lồng 3-4 tầng |
Guard clause, return sớm | Đường chính đọc thẳng một mạch |
Tham số boolean (express, dryRun) |
Tách hàm, hoặc union type | Call site checkout(x, true, false) không ai đọc được |
| Hơn ~3 tham số cùng đi với nhau | Parameter object | Thêm field không phá mọi call site |
500000, 0.9, 12 trong logic |
Hằng số có tên và đơn vị | Sửa một chỗ, grep được |
Logic tính toán trộn với DB/HTTP/new Date() |
Functional core, imperative shell | Test core không cần mock |
catch (e) { console.log(e) } |
Ném lại với context + cause, hoặc xử lý thật |
Lỗi nuốt = dữ liệu sai âm thầm |
| Nhánh nghiệp vụ dự kiến (declined, hết hàng) | Trả về kết quả có kiểu | Exception dành cho điều bất thường |
| Hai đoạn code giống nhau | Chờ lần thứ ba | Abstraction sai đắt hơn trùng lặp |
| Comment kể lại code làm gì | Xoá, đặt tên tốt hơn; comment giải thích vì sao | Comment “what” nhanh lỗi thời |
Checklist code review
Phần tiêu đề “Checklist code review”- Commit refactor và commit đổi hành vi có tách riêng không? Commit refactor có sửa test không (không nên)?
- Có
catchnào không ném lại, không xử lý thật, chỉ log không? - Lỗi ném ra có đủ context (id, số tiền, key) và giữ
causekhông? - Nhánh nghiệp vụ dự kiến có đang dùng exception làm luồng điều khiển không?
- Có tham số
booleannào ở public method không? Call site có đọc được không cần mở định nghĩa? - Số và chuỗi nghiệp vụ có tên và đơn vị chưa? Có giá trị nào bị lặp ở nhiều nơi?
- Logic quyết định có test được không cần mock DB/HTTP/đồng hồ không?
- Có abstraction mới nào chỉ có một caller, hoặc hàm chung nào vừa bị thêm flag để “vừa” một caller mới không?
Tóm tắt
Phần tiêu đề “Tóm tắt”Tiếp theo: Refactor an toàn