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: