Rust:
Koodin refaktorointi

Kuinka:

Mennään refaktoroimaan yksinkertainen Rust-koodinpätkä, jotta se olisi idiomaattisempi ja ylläpidettävämpi. Aloiteamme funktiolla, joka laskee kokonaislukujen vektorin summan:

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!("Summa on {}", sum(&numbers));
}

Tuloste:

Summa on 15

Nyt refaktoroidaan tämä käyttämään idiomaattisempaa Rustia hyödyntämällä iteraattoreita ja fold-metodia:

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

fn main() {
    let numbers = vec![1, 2, 3, 4, 5];
    println!("Summa on {}", sum(&numbers));
}

Tuloksessa ei muutosta—se on edelleen 15—mutta refaktoroitu versio on siistimpi ja käyttää Rustin vahvuuksia, kuten lainaamista ja iteraattorimetodeja.

Syväsukellus

Refaktoroinnilla on juurensa Smalltalk-yhteisössä ja se popularisoitiin Java-maailmassa Martin Fowlerin kirjalla “Refactoring: Improving the Design of Existing Code”. Sen periaatteet ovat universaaleja ja sovellettavissa myös Rustiin, missä turvallisuus ja rinnakkaisuus ovat ensiarvoisen tärkeitä. Rust kannustaa kirjoittamaan vankkaa koodia nappaamalla ongelmia käännösaikana, joten refaktoroinnin aikana Rust-kääntäjä toimii turvaverkkona.

Vaihtoehtoja manuaaliselle refaktoroinnille sisältävät automatisoidut työkalut, kuten ‘rustfmt’ koodin muotoilua varten ja ‘clippy’ linttausta varten, jotka voivat ehdottaa idiomaattisempia tapoja kirjoittaa koodia. Kuitenkin syvällinen refaktorointi vaatii usein harkittua ymmärrystä koodin suunnittelusta, minkä nämä työkalut eivät voi täysin automatisoida.

Rustissa refaktorointi saattaa keskittyä parantamaan tyyppien käyttöä, hyödyntämään eliniköjä tehokkaasti, vähentämään tarpeettomia allokointeja tai käyttämään rinnakkaisuusmalleja, kuten käyttämällä Arc<Mutex<T>> tarvittaessa. On myös yleistä siirtyä unwrap()-funktiosta ilmaisuvoimaisempaan virheenkäsittelyyn Result<T, E>-avulla.

Katso myös

Syventääksesi ymmärrystäsi Rustin refaktoroinnista: