Rust:
Refaktorering

Hvordan:

La oss refaktorere et enkelt stykke Rust-kode for å gjøre det mer idiomatisk og vedlikeholdbart. Vi starter med en funksjon som kalkulerer summen av en vektor med heltall:

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

fn main() {
    let tall = vec![1, 2, 3, 4, 5];
    println!("Summen er {}", sum(&tall));
}

Output:

Summen er 15

Nå, la oss refaktorere dette for å bruke mer idiomatisk Rust ved å utnytte iteratorer og fold-metoden:

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

fn main() {
    let tall = vec![1, 2, 3, 4, 5];
    println!("Summen er {}", sum(&tall));
}

Ingen endring i output—den er fortsatt 15—men den refaktorerte versjonen er renere og bruker Rusts styrker som låning og iterator metoder.

Dypdykk

Refaktorering har sine røtter i Smalltalk-samfunnet og ble popularisert i Java-verdenen av Martin Fowlers bok “Refactoring: Improving the Design of Existing Code”. Prinsippene er universelle og gjelder også for Rust, hvor sikkerhet og samtidighet er av største viktighet. Rust oppmuntrer til å skrive robust kode ved å fange problemer ved kompileringstid, så under refaktorering, fungerer Rust-kompilatoren som et sikkerhetsnett.

Alternativer til manuell refaktorering inkluderer bruk av automatiserte verktøy, som ‘rustfmt’ for kodeformatering og ‘clippy’ for linting, som kan foreslå mer idiomatiske måter å skrive kode på. Imidlertid krever dyp refaktorering ofte en gjennomtenkt forståelse av kodens design, noe disse verktøyene ikke kan automatisere fullt ut.

I Rust kan refaktorering dreie seg om å forbedre typen bruk, utnytte levetider effektivt, redusere unødvendige tildelinger, eller benytte seg av samtidighetsmønstre som å bruke Arc<Mutex<T>> når nødvendig. Det er også vanlig å gå over fra unwrap() til mer uttrykksfull feilhåndtering med Result<T, E>.

Se Også

For å dykke dypere inn i refaktorering i Rust: