Sauberer Code in Rust: elegant und effizient schreiben

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum sauberer Code in Rust kein Luxus, sondern eine Notwendigkeit ist

\n\n

Rust ist eine Sprache, die Disziplin vom Entwickler verlangt. Der Compiler ist hier streng, aber fair: Er verzeiht keine Nachlässigkeit mit dem Speicher, gibt dafür aber unglaubliche Geschwindigkeit und Sicherheit. Um das Potenzial von Rust jedoch wirklich auszuschöpfen, reicht es nicht, den Code einfach nur kompilieren zu lassen. Man muss sauberen Code schreiben – verständlich, wartbar und elegant.

\n\n

In diesem Artikel werden wir uns ansehen, wie man sauberen Code in Rust schreibt, damit Ihr Projekt nicht zu einem Labyrinth aus unsafe-Blöcken und verworrenen Generics wird. Sie erfahren etwas über Namenskonventionen, Redewendungen im Umgang mit Ownership, Fehlerbehandlung und Code-Strukturierung. Los geht's!

\n\n

1. Namensgebung: Sprechen Sie die Sprache von Rust

\n\n

Die richtige Namensgebung ist die halbe Miete. In Rust gibt es strenge Konventionen, und deren Verletzung wird wie ein rotes Tuch für einen Stier wahrgenommen (besonders im Code-Review).

\n\n

Grundregeln

\n
    \n
  • snake_case für Variablen, Funktionen, Methoden und Module.
  • \n
  • PascalCase für Typen (struct, enum, trait).
  • \n
  • SCREAMING_SNAKE_CASE für Konstanten und statische Variablen.
  • \n
\n\n

Beispiel:

\n\n
// Schlecht\nlet UserName = "Alice";\nfn GetUserData() {}\nconst MAX_SIZE: u32 = 100;\n\n// Gut\nlet user_name = "Alice";\nfn get_user_data() {}\nconst MAX_SIZE: u32 = 100;
\n\n

Vermeiden Sie Abkürzungen (wenn sie nicht offensichtlich sind)

\n

Statt calc_avg() schreiben Sie besser calculate_average(). Statt tmp besser temp_buffer. Rust fördert Lesbarkeit, nicht Kürze.

\n\n

Tipp: Wenn Sie eine Funktion schreiben, die ein Closure annimmt, verwenden Sie die Namen f, g oder closure – das ist eine allgemein übliche Praxis.

\n\n

2. Ownership und Borrowing: Freunden Sie sich mit dem Compiler an

\n\n

Das Ownership-System ist das Herz von Rust. Sauberer Code respektiert die Regeln von ownership und borrowing und versucht nicht, sie durch unnötiges clone() oder Rc zu umgehen.

\n\n

Regel: Bevorzugen Sie Borrowing gegenüber Ownership

\n

Wenn eine Funktion nicht das Ownership übernehmen soll, nehmen Sie eine Referenz &T oder eine veränderbare Referenz &mut T entgegen.

\n\n
// Schlecht: unnötiges clone\nfn process(data: Vec<i32>) {\n    let mut sum = 0;\n    for &val in &data {\n        sum += val;\n    }\n    println!("Summe: {}", sum);\n}\n\n// Gut: Borrowing\nfn process(data: &[i32]) {\n    let mut sum = 0;\n    for &val in data {\n        sum += val;\n    }\n    println!("Summe: {}", sum);\n}
\n\n

Vermeiden Sie übermäßiges Klonen

\n

Wenn Sie Daten an mehrere Stellen übergeben müssen, verwenden Sie Rc (für Single-Thread-Szenarien) oder Arc (für Multi-Thread-Szenarien). Aber übertreiben Sie es nicht: Für einfache Fälle reichen Referenzen aus.

\n\n

3. Fehlerbehandlung: Verzichten Sie auf Panik

\n\n

In Rust gibt es zwei Hauptwege der Fehlerbehandlung: panic! (nicht behebbarer Fehler) und Result<T, E> (behebbarer Fehler). Sauberer Code verwendet Result wo immer möglich. Panik ist das letzte Mittel für wirklich außergewöhnliche Situationen (z. B. Division durch Null).

\n\n

Verwenden Sie den ?-Operator

\n

Dies ist eine prägnante Möglichkeit, einen Fehler nach oben zu reichen. Schreiben Sie statt umständlicher match-Anweisungen:

\n\n
use std::fs::File;\nuse std::io::Read;\n\nfn read_file(path: &str) -> Result<String, std::io::Error> {\n    let mut file = File::open(path)?;\n    let mut contents = String::new();\n    file.read_to_string(&mut contents)?;\n    Ok(contents)\n}
\n\n

Erstellen Sie eigene Fehlertypen

\n

Anstatt String als Fehler zu verwenden, definieren Sie eine Aufzählung:

\n\n
#[derive(Debug)]\nenum MyError {\n    Io(std::io::Error),\n    Parse(std::num::ParseIntError),\n}\n\nimpl From<std::io::Error> for My                

Blogs

Buchempfehlungen