Rust:
Refaktoryzacja

Jak to zrobić:

Zrefaktoryzujmy prosty fragment kodu w Rust, aby uczynić go bardziej idiomatycznym i łatwiejszym w utrzymaniu. Zaczynamy od funkcji, która oblicza sumę wektora liczb całkowitych:

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

Wynik:

Suma to 15

Teraz zrefaktoryzujmy to, aby użyć bardziej idiomatycznego Rusta, wykorzystując iteratory i metodę 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!("Suma to {}", sum(&numbers));
}

Bez zmian w wyniku - wciąż jest 15 - ale zrefaktoryzowana wersja jest czystsza i wykorzystuje mocne strony Rusta, takie jak pożyczanie i metody iteratorów.

Dogłębna analiza

Refaktoryzacja ma swoje korzenie w społeczności Smalltalk i została spopularyzowana w świecie Java przez książkę Martina Fowlera “Refaktoryzacja: Ulepszanie struktury istniejącego kodu”. Jej zasady są uniwersalne i mają zastosowanie również do Rusta, gdzie bezpieczeństwo i współbieżność są nadrzędne. Rust zachęca do pisania solidnego kodu, wyłapując problemy w czasie kompilacji, więc podczas refaktoryzacji, kompilator Rusta działa jak siatka bezpieczeństwa.

Alternatywami dla ręcznej refaktoryzacji są narzędzia automatyczne, takie jak ‘rustfmt’ do formatowania kodu i ‘clippy’ do lintowania, które mogą sugerować bardziej idiomatyczne sposoby pisania kodu. Jednak dogłębna refaktoryzacja często wymaga przemyślanego zrozumienia projektu kodu, czego te narzędzia nie mogą w pełni zautomatyzować.

W Rust refaktoryzacja może dotyczyć poprawy wykorzystania typów, efektywnego wykorzystania czasów życia, redukcji niepotrzebnych alokacji lub zastosowania wzorców współbieżności, takich jak użycie Arc<Mutex<T>>, gdy jest to konieczne. Powszechne jest również przejście z unwrap() na bardziej ekspresyjne obsługiwanie błędów z Result<T, E>.

Zobacz również

Aby zagłębić się w refaktoryzację w Rust: