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

では、イテレータとfoldメソッドを活用することで、もっとイディオマティックなRustを使用してリファクタリングしてみましょう:

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コミュニティにルーツを持ち、Martin Fowlerの著書「Refactoring: Improving the Design of Existing Code」によってJavaの世界で普及しました。その原則は普遍的であり、安全性と並行性が最優先されるRustにも適用されます。Rustはコンパイル時に問題を捕捉することで堅牢なコードの記述を促進しますので、リファクタリング中にもRustコンパイラが安全網として機能します。

手動でのリファクタリングへの代替手段には、コードのフォーマットにrustfmt、リンティングにclippyを使うなどの自動化ツールがあります。これらはコードのよりイディオマティックな書き方を提案できます。しかし、深いリファクタリングはしばしばコードの設計に対する洞察に基づく理解を必要とし、これらのツールでは完全に自動化できません。

Rustにおけるリファクタリングは、型の使用を改善すること、ライフタイムを効果的に活用すること、不必要なアロケーションを削減すること、また必要に応じてArc<Mutex<T>>のような並行性パターンを使用することなどに焦点を当てることが一般的です。また、unwrap()からより表現豊かなエラーハンドリングへの移行、つまりResult<T, E>の使用への移行もよくあります。

関連情報

Rustでのリファクタリングをさらに深く掘り下げるには: