📝 Viết Ghi Chú Trong Code
Comments Là Gì?
Comments (ghi chú) là những dòng chữ trong code mà:
- ❌ Máy tính KHÔNG đọc
- ❌ Compiler BỎ QUA
- ✅ Người lập trình ĐỌC để hiểu code
Giải Thích Cho Bạn 5 Tuổi
Comments giống như ghi chú bên lề trong sách giáo khoa:
- 📖 Bạn viết ghi chú để nhớ
- 👀 Chỉ bạn (và người đọc) thấy
- 🤖 Máy tính không quan tâm
Ví dụ: Bạn giải toán, viết bên cạnh "Nhớ: a² + b² = c²" Code cũng vậy! 📚✨
🎯 Tại Sao Cần Comments?
1. Giải Thích Code Phức Tạp
fn main() {
// Tính diện tích hình tròn
// Công thức: S = π × r²
let radius = 5.0;
let area = 3.14159 * radius * radius;
println!("Diện tích: {}", area);
}
2. Nhắc Nhở Bản Thân Sau Này
fn main() {
// TODO: Thêm validation cho input
// FIXME: Bug khi radius âm
let radius = -5.0; // Cần fix!
}
3. Giúp Người Khác Hiểu Code
fn main() {
// Thuật toán bubble sort
// Độ phức tạp: O(n²)
// Chỉ dùng cho mảng nhỏ!
let mut arr = vec![5, 2, 8, 1, 9];
// ... code bubble sort
}
4. Tắt Code Tạm Thời
fn main() {
println!("Hello");
// Tạm thời không dùng
// println!("Debug info");
// println!("More debug");
println!("World");
}
📝 Các Loại Comments Trong Rust
1. Line Comments // - Comment Một Dòng
// Đây là comment
fn main() {
// Comment có thể ở đầu dòng
println!("Hello"); // Hoặc cuối dòng
// Comment trên nhiều dòng
// Mỗi dòng cần //
// Như thế này
}
Đặc điểm:
- ✅ Dùng nhiều nhất
- ✅ Dễ viết, dễ đọc
- ✅ Tự động xuống dòng
2. Block Comments /* */ - Comment Nhiều Dòng
/*
Đây là block comment
Có thể viết nhiều dòng
Không cần // ở đầu mỗi dòng
*/
fn main() {
println!("Hello");
}
Nested block comments (Rust hỗ trợ!):
fn main() {
/*
Comment ngoài
/* Comment trong */
Tiếp comment ngoài
*/
println!("Hello");
}
Khi nào dùng?
- ⚠️ Ít dùng hơn
// - ✅ Comment nhiều dòng
- ✅ Tắt cả đoạn code lớn
3. Doc Comments /// - Documentation
Comment cho documentation (tài liệu):
/// Tính diện tích hình chữ nhật
///
/// # Arguments
/// * `width` - Chiều rộng
/// * `height` - Chiều cao
///
/// # Example
/// ```
/// let area = calculate_area(5, 10);
/// assert_eq!(area, 50);
/// ```
fn calculate_area(width: i32, height: i32) -> i32 {
width * height
}
Sinh ra HTML documentation:
cargo doc --open
4. Module-level Doc Comments //!
Document cho file/module:
//! # My Math Library
//!
//! Thư viện tính toán đơn giản
//! Hỗ trợ các phép toán cơ bản
fn add(a: i32, b: i32) -> i32 {
a + b
}
🎨 Comment Style Guide
✅ Comments TỐT
1. Giải Thích "TẠI SAO", Không Phải "CÁI GÌ"
// ✅ TỐT - Giải thích lý do
// Dùng f64 vì cần độ chính xác cao cho tính toán tài chính
let price: f64 = 19.99;
// ❌ TỆ - Chỉ nói cái hiển nhiên
// Khai báo biến price kiểu f64
let price: f64 = 19.99;
2. Giải Thích Business Logic
// ✅ TỐT
// Giảm 20% cho đơn hàng trên 1 triệu
if order_total > 1_000_000 {
discount = 0.20;
}
// ❌ TỆ
// Nếu order_total lớn hơn 1000000
if order_total > 1_000_000 {
discount = 0.20;
}
3. Cảnh Báo Khi Cần
// ⚠️ CẢNH BÁO: Không thay đổi giá trị này!
// Magic number từ spec v2.1 của API
const MAX_RETRIES: u32 = 3;
// ⚠️ HACK: Workaround cho bug trong library X
// TODO: Remove khi upgrade lên v2.0
thread::sleep(Duration::from_millis(100));
4. TODO và FIXME
fn main() {
// TODO: Thêm validation cho email
let email = get_user_input();
// FIXME: Crash khi input rỗng
process_email(email);
// NOTE: Feature này đang thử nghiệm
experimental_feature();
}
❌ Comments TỆ
1. Lặp Lại Code
// ❌ TỆ - Lặp lại những gì code đã nói
// Set x = 5
let x = 5;
// In x ra màn hình
println!("{}", x);
2. Comments Sai/Lỗi Thời
// ❌ TỆ - Comment sai!
// Tính tổng
let result = a * b; // Thực ra là nhân!
3. Quá Dài, Quá Chi Tiết
// ❌ TỆ - Quá dài không cần thiết
// Đầu tiên, chúng ta khai báo một biến tên là x
// và gán cho nó giá trị 5, biến này sẽ được
// sử dụng để lưu trữ số lượng items...
// (50 dòng comment)
let x = 5;
💡 Best Practices
1. Code Tự Giải Thích > Comments
Thay vì:
// ❌ Cần comment để hiểu
let d = 86400; // seconds in a day
Hãy viết:
// ✅ Tên biến tự giải thích
let seconds_in_a_day = 86400;
2. Cập Nhật Comments Khi Sửa Code
// ❌ TỆ - Comment lỗi thời
// Returns the sum of two numbers
fn multiply(a: i32, b: i32) -> i32 {
a * b // Đổi từ cộng sang nhân nhưng quên sửa comment!
}
// ✅ TỐT
// Returns the product of two numbers
fn multiply(a: i32, b: i32) -> i32 {
a * b
}
3. Dùng Comments Cho Complex Logic
fn fibonacci(n: u32) -> u32 {
// Base cases
if n == 0 {
return 0;
}
if n == 1 {
return 1;
}
// Recursive case: fib(n) = fib(n-1) + fib(n-2)
// Không tối ưu nhưng dễ hiểu cho người mới
fibonacci(n - 1) + fibonacci(n - 2)
}
4. Comment Cho Weird Hacks
fn buggy_workaround() {
// HACK: Sleep 100ms để tránh race condition
// Đây là workaround tạm thời cho bug trong library X v1.2
// Issue: https://github.com/example/repo/issues/123
// TODO: Remove khi upgrade lên v2.0
thread::sleep(Duration::from_millis(100));
}
🔍 Doc Comments Chi Tiết
Cấu Trúc Doc Comment
/// Brief description (một dòng)
///
/// Detailed description (nhiều dòng)
/// Giải thích chi tiết hơn
///
/// # Arguments
/// * `param1` - Mô tả parameter 1
/// * `param2` - Mô tả parameter 2
///
/// # Returns
/// Mô tả giá trị trả về
///
/// # Example
/// ```
/// let result = my_function(1, 2);
/// assert_eq!(result, 3);
/// ```
///
/// # Panics
/// Function panic khi nào (nếu có)
///
/// # Errors
/// Các lỗi có thể xảy ra (nếu trả về Result)
///
/// # Safety
/// Safety requirements (cho unsafe code)
fn my_function(param1: i32, param2: i32) -> i32 {
param1 + param2
}