Rust:
Tái cấu trúc mã

Cách thực hiện:

Hãy tái cấu trúc một đoạn mã Rust đơn giản để làm cho nó dễ bảo trì và theo đúng điển hình hơn. Chúng ta bắt đầu với một chức năng tính tổng của một vector chứa số nguyên:

fn sum(vec: &Vec<i32>) -> i32 {
    let mut sum = 0;
    for i in vec {
        sum += i;
    }
    sum
}

fn main() {
    let numbers = vec![1, 2, 3, 4, 5];
    println!("Tổng số là {}", sum(&numbers));
}

Kết quả:

Tổng số là 15

Bây giờ, hãy tái cấu trúc để sử dụng Rust điển hình hơn bằng cách tận dụng các iterators và phương thức fold:

fn sum(vec: &[i32]) -> i32 {
    vec.iter().fold(0, |acc, &x| acc + x)
}

fn main() {
    let numbers = vec![1, 2, 3, 4, 5];
    println!("Tổng số là {}", sum(&numbers));
}

Kết quả không thay đổi—vẫn là 15—nhưng phiên bản đã được tái cấu trúc sạch sẽ hơn và sử dụng các điểm mạnh của Rust như việc mượn và phương thức iterator.

Sâu hơn

Tái cấu trúc có nguồn gốc từ cộng đồng Smalltalk và được phổ biến trong thế giới Java qua cuốn sách của Martin Fowler “Refactoring: Improving the Design of Existing Code”. Các nguyên tắc của nó là phổ quát và áp dụng cho Rust, nơi mà tính an toàn và đồng thời là vô cùng quan trọng. Rust khuyến khích viết mã robust bằng cách phát hiện sự cố tại thời điểm biên dịch, do đó trong quá trình tái cấu trúc, trình biên dịch Rust đóng vai trò như một lưới an toàn.

Các phương án thay thế cho việc tái cấu trúc thủ công bao gồm việc sử dụng các công cụ tự động, như ‘rustfmt’ cho định dạng mã và ‘clippy’ cho linting, có thể gợi ý cách viết mã điển hình hơn. Tuy nhiên, tái cấu trúc sâu thường yêu cầu sự hiểu biết cẩn thận về thiết kế mã, điều mà những công cụ này không thể tự động hoàn toàn.

Trong Rust, tái cấu trúc có thể tập trung vào việc cải thiện việc sử dụng kiểu dữ liệu, tận dụng hiệu quả các vòng đời, giảm các phân bổ không cần thiết, hoặc áp dụng các mẫu đồng thời như sử dụng Arc<Mutex<T>> khi cần thiết. Cũng rất phổ biến khi chuyển từ unwrap() sang xử lý lỗi biểu cảm hơn với Result<T, E>.

Xem Thêm

Để tìm hiểu sâu hơn về tái cấu trúc trong Rust: