VieTopikKhoá học
  • Games
  • Cá nhân
Tải app
© 2026 VieTopikChính sách bảo mậtĐiều khoản sử dụngCài appEnglish
  • Trang chủ
  • Học
  • Luyện thi
  • Cẩm nang
  • Games
  • Cá nhân
Kiến trúc và chất lượng codeCode sạch và refactor
Bài 9/17
5 phút

Code smell

Bình luậ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 chạy đúng chưa chắc đã dễ sửa. Có những dấu hiệu báo trước lần sửa sau sẽ vất vả: cùng một con số chép ở ba nơi, method dài hai trăm dòng. Nhận ra chúng sớm thì sửa rẻ hơn nhiều so với lúc chúng đã gây lỗi.

Khái niệm

👃 Code smell: dấu hiệu trong code cho thấy code khó hiểu, khó sửa, dù chưa chắc đã là lỗi.

Smell Dấu hiệu Cách sửa thường dùng
Trùng lặp cùng một công thức chép ở nhiều nơi tách thành một method
Method dài phải cuộn mới đọc hết một method tách thành nhiều method nhỏ có tên
Số trần (magic number) 0.1m, 500000 nằm giữa code, không có tên đặt thành hằng có tên
Danh sách tham số dài method nhận năm, sáu tham số gom thành một class

Ví dụ

Tổng tiền có VAT 10% được tính ở hai nơi:

Console.WriteLine(CartTotal(100000m));
Console.WriteLine(InvoiceTotal(100000m));

decimal CartTotal(decimal subtotal)
{
    return subtotal * 1.1m;
}

decimal InvoiceTotal(decimal subtotal)
{
    return subtotal * 1.1m;
}

Có hai smell cùng lúc: 1.1m là số trần, không cho biết nó là gì, và công thức bị trùng ở hai method. Sửa bằng một hằng và một method dùng chung:

const decimal VatRate = 0.1m;

decimal WithVat(decimal subtotal)
{
    return subtotal * (1 + VatRate);
}

decimal CartTotal(decimal subtotal)
{
    return WithVat(subtotal);
}

decimal InvoiceTotal(decimal subtotal)
{
    return WithVat(subtotal);
}
  • const khai báo hằng số: gán một lần khi viết code, không đổi được lúc chạy.
  • Tên VatRate nói rõ con số là gì. VAT đổi thì sửa đúng một dòng.
  • Hai method gọi chung WithVat, công thức chỉ còn một chỗ.

Thử ngay

Nhà nước giảm VAT còn 8%. Với bản chưa sửa, lập trình viên chỉ nhớ đổi CartTotal thành subtotal * 1.08m, quên InvoiceTotal. Chạy lại.

Đoán trước khi chạy: số tiền ở giỏ hàng và trên hoá đơn có khớp nhau không?

Xem kết quả
108000.00
110000.0

Không khớp: khách thấy 108.000 trong giỏ nhưng hoá đơn ghi 110.000. Công thức bị chép ở hai nơi thì sớm muộn sẽ có lúc sửa sót một nơi. Với bản đã sửa, chỉ cần đổi VatRate là cả hai cùng đúng.

Lỗi hay gặp

Đặt hằng mà tên không nói gì. Tên như X vẫn không cho biết con số là gì, số trần chỉ đổi chỗ đứng.

// SAI — X là gì?
const decimal X = 0.1m;
// ĐÚNG — tên nói rõ ý nghĩa
const decimal VatRate = 0.1m;

Tóm tắt

  • Code smell là dấu hiệu code khó sửa, chưa chắc là lỗi.
  • Bốn smell hay gặp: trùng lặp, method dài, số trần, tham số dài.
  • Số trần thay bằng const có tên. Công thức trùng gom về một method.
  • Tên hằng phải nói rõ con số là gì.
Đặt tên và method ngắnRefactor an toàn

Bình luận

Đang tải bình luận…

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