VieTopik
Tiếng HànTiếng AnhIT
  • Góc học tập
Tải app
  • Thư viện
  • Luyện thi
  • Cẩm nang
  • Góc học tập
Kiến trúc và chất lượng codeCode sạch và refactor
Bài 8/17
5 phút

Đặt tên và method ngắn

Nội dung bài · 5 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 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, r bắ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 trong if.
  • 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
35000

calc 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ừ, boolean bắt đầu bằng is, 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à return sớm, bớt if lồng nhau.
  • Comment giải thích "vì sao", tên giải thích "là gì".

Tự kiểm tra

0/3 câu
Câu 1

Biến boolean cho biết đơn hàng đã thanh toán nên đặt tên thế nào?

Câu 2

Guard clause giúp gì cho method có nhiều if lồng nhau?

Câu 3

Comment nào đáng giữ lại?

Test đáng tinCode smell

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt