Đặt tên và method ngắn
Nội dung bài · 5 mục
- 1.Khái niệm
- 2.Ví dụ
- 3.Thử ngay
- 4.Lỗi hay gặp
- 5.Tóm tắt
Code được đọc nhiều hơn là được viết: khi sửa lỗi, khi review pull request, khi
thêm tính năng. Tên mơ hồ và if lồng nhiều tầng bắt người đọc phải đoán. Bài
này dạy hai thói quen giúp code dễ đọc mà không cần comment.
Khái niệm
📛 Tên rõ ý định (intention-revealing name): tên cho biết biến, method dùng để làm gì mà không cần đọc code bên trong hay comment.
✍️ Guard clause (điều kiện chặn đầu): lệnh if ở đầu method xử lý một trường hợp đặc biệt rồi return ngay.
| Loại | Quy ước | Ví dụ |
|---|---|---|
| Method | động từ, nói việc làm | calculateShippingFee |
Biến boolean |
bắt đầu bằng is, has, can |
isMember, hasDiscount |
| Biến kiểu số | kèm ý nghĩa hoặc đơn vị | orderTotal, deliveryDays |
Ví dụ
Tính phí giao hàng: đơn từ 500.000 hoặc khách thành viên thì miễn phí, nội thành Hà Nội 20.000, nơi khác 35.000.
Bản khó đọc:
// Main.java
void main() {
System.out.println(calc(200000, false, "Hà Nội"));
}
long calc(long t, boolean m, String c) {
long r;
if (t < 500000) {
if (m) {
r = 0;
} else {
if (c.equals("Hà Nội")) {
r = 20000;
} else {
r = 35000;
}
}
} else {
r = 0;
}
return r;
}Bản rõ ràng, cùng kết quả:
// Main.java
void main() {
System.out.println(
shippingFee(200000, false, "Hà Nội"));
}
long shippingFee(long orderTotal,
boolean isMember, String city) {
if (orderTotal >= 500000) {
return 0;
}
if (isMember) {
return 0;
}
if (city.equals("Hà Nội")) {
return 20000;
}
return 35000;
}t,m,c,rbắt người đọc lần ngược xem chúng là gì.orderTotal,isMember,cityđọc là hiểu.- Mỗi guard clause xử lý xong một trường hợp rồi
return, nên phần sau không phải lồng trongif. - Method chỉ làm một việc, cùng tinh thần với SRP ở khoá OOP, nên ngắn và dễ đặt tên.
Thử ngay
Thay thân main của bản rõ ràng bằng bốn lời gọi sau:
System.out.println(
shippingFee(600000, false, "Hà Nội"));
System.out.println(
shippingFee(200000, true, "Đà Nẵng"));
System.out.println(
shippingFee(200000, false, "Hà Nội"));
System.out.println(
shippingFee(200000, false, "Đà Nẵng"));Đoán trước khi chạy: bốn dòng in ra là gì? Gọi calc với cùng bốn bộ
dữ liệu thì kết quả có khác không?
Xem kết quả
0
0
20000
35000calc cho đúng bốn con số này. Đổi tên và bỏ if lồng không đổi hành vi,
chỉ làm code dễ đọc hơn.
Lỗi hay gặp
Dùng comment để chữa tên dở. Code đổi mà quên sửa comment thì comment thành sai. Còn tên biến xuất hiện ở mọi chỗ dùng biến, đổi tên là đổi ở mọi nơi.
// SAI — cần comment mới hiểu d là gì
int d = 3; // số ngày giao hàng// ĐÚNG — tên đã nói đủ
int deliveryDays = 3;Comment dùng để giải thích vì sao code làm vậy, ví dụ một quy định của công ty, không phải để giải thích code làm gì.
Tóm tắt
- Tên nói rõ ý định: method là động từ,
booleanbắt đầu bằngis,has. - Không viết tắt khó đoán như
t,m,r. - Guard clause xử lý trường hợp đặc biệt ở đầu và
returnsớm, bớtiflồng nhau. - Comment giải thích "vì sao", tên giải thích "là gì".
Tự kiểm tra
0/3 câuBiến boolean cho biết đơn hàng đã thanh toán nên đặt tên thế nào?
Guard clause giúp gì cho method có nhiều if lồng nhau?
Comment nào đáng giữ lại?