Rust:
Refatoração

Como fazer:

Vamos refatorar um simples trecho de código em Rust para torná-lo mais idiomático e manutenível. Começamos com uma função que calcula a soma de um vetor de inteiros:

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!("A soma é {}", sum(&numbers));
}

Saída:

A soma é 15

Agora, vamos refatorar isso para usar Rust mais idiomático, aproveitando iteradores e o método 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!("A soma é {}", sum(&numbers));
}

Sem mudança na saída—ainda é 15—mas a versão refatorada é mais limpa e usa as forças do Rust como empréstimos e métodos iteradores.

Aprofundando

A refatoração tem suas raízes na comunidade Smalltalk e foi popularizada no mundo Java pelo livro de Martin Fowler “Refactoring: Improving the Design of Existing Code”. Seus princípios são universais e aplicam-se ao Rust também, onde segurança e concorrência são primordiais. Rust encoraja a escrita de código robusto, capturando problemas em tempo de compilação, então, durante a refatoração, o compilador Rust atua como uma rede de segurança.

Alternativas à refatoração manual incluem o uso de ferramentas automatizadas, como ‘rustfmt’ para formatação de código e ‘clippy’ para linting, que podem sugerir maneiras mais idiomáticas de escrever código. No entanto, refatorações profundas frequentemente requerem um entendimento cuidadoso do design do código, o que essas ferramentas não podem automatizar completamente.

Em Rust, a refatoração pode girar em torno da melhoria do uso de tipos, aproveitamento de lifetimes efetivamente, redução de alocações desnecessárias, ou emprego de padrões de concorrência como o uso de Arc<Mutex<T>> quando necessário. Também é comum a transição de unwrap() para um tratamento de erro mais expressivo com Result<T, E>.

Veja Também

Para se aprofundar mais na refatoração em Rust: