Rust:
Рефакторинг

Як це зробити:

Давайте рефакторити простий шматок коду на Rust, щоб зробити його більш ідіоматичним та легшим для підтримки. Ми починаємо з функції, яка обчислює суму вектора цілих чисел:

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!("Сума {}", sum(&numbers));
}

Вивід:

Сума 15

Тепер давайте рефакторити це, використовуючи більш ідіоматичний Rust за допомогою ітераторів та методу 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!("Сума {}", sum(&numbers));
}

Зміни в виводі немає — все ще 15 — але рефакторена версія чистіша та використовує сили Rust, такі як запозичення та методи ітераторів.

Поглиблений огляд

Рефакторинг має свої корені в спільноті Smalltalk та був популяризований у світі Java книгою Мартіна Фаулера “Рефакторинг: Покращення дизайну існуючого коду”. Його принципи є універсальними та застосовні до Rust також, де безпека та одночасність є найважливішими. Rust спонукає писати надійний код, виявляючи проблеми на етапі компіляції, таким чином, під час рефакторингу, компілятор Rust виступає як сітка безпеки.

Альтернативами ручному рефакторингу є використання автоматизованих інструментів, таких як ‘rustfmt’ для форматування коду та ‘clippy’ для лінтингу, які можуть запропонувати більш ідіоматичні способи написання коду. Однак, глибокий рефакторинг часто вимагає обдуманого розуміння дизайну коду, яке ці інструменти не можуть повністю автоматизувати.

У Rust рефакторинг може стосуватися покращення використання типів, ефективного використання тривалостей життя, зниження непотрібних виділень пам’яті або використання шаблонів одночасності, як от використання Arc<Mutex<T>> коли це необхідно. Також поширеною практикою є перехід від unwrap() до більш виразного оброблення помилок із Result<T, E>.

Дивіться також

Щоб глибше зануритися в рефакторинг на Rust: