Το Rust στερείται εγγενούς υποστήριξης για το OOP, αλλά μπορείτε να χρησιμοποιήσετε αυτές τις τεχνικές για να επωφεληθείτε από το παράδειγμα ούτως ή άλλως.

Ο Αντικειμενοστρεφής Προγραμματισμός (OOP) απλοποιεί τον σχεδιασμό λογισμικού δίνοντας έμφαση στη χρήση αντικειμένων για την αναπαράσταση οντοτήτων και εννοιών του πραγματικού κόσμου. Το OOP ενθαρρύνει τη συντηρησιμότητα ενσωματώνοντας τη λειτουργικότητα μέσα σε αντικείμενα.

Η Rust είναι μια ευέλικτη γλώσσα που υποστηρίζει λειτουργικό και διαδικαστικό προγραμματισμό. Αν και δεν υποστηρίζει εγγενώς αντικειμενοστραφή προγραμματισμό, μπορείτε να εφαρμόσετε έννοιες OOP χρησιμοποιώντας τους ενσωματωμένους τύπους δεδομένων του Rust.

Ενθυλάκωση σε σκουριά

Η ενθυλάκωση συνεπάγεται την οργάνωση κώδικα σε αυτόνομες μονάδες που κρύβουν εσωτερικές λεπτομέρειες ενώ έκθεση μιας δημόσιας διεπαφής για εξωτερική αλληλεπίδραση για την ελαχιστοποίηση της πολυπλοκότητας και τη βελτίωση του κώδικα συντηρησιμότητα.

Μπορείτε να ενσωματώσετε τον κώδικα Rust με ενότητες. Μια ενότητα είναι μια συλλογή στοιχείων που περιλαμβάνει συναρτήσεις, δομές, αριθμούς και σταθερές. Οι μονάδες Rust παρέχουν λειτουργικότητα για την ομαδοποίηση και τον καθορισμό ορίων μεταξύ τμημάτων ενός προγράμματος.

instagram viewer

Χρήση μονάδων για ενθυλάκωση δεδομένων και συναρτήσεων

Μπορείτε να ορίσετε μια ενότητα χρησιμοποιώντας το mod λέξη-κλειδί ακολουθούμενη από ένα όνομα:

mod my_module {
// τα στοιχεία της μονάδας πηγαίνουν εδώ
}

Μπορείτε να οργανώσετε τις ενότητες ιεραρχικά τοποθετώντας τις δηλώσεις τους:

mod parent_module {
mod my_module {
// τα στοιχεία της μονάδας πηγαίνουν εδώ
}
}

Στη συνέχεια, μπορείτε να ανατρέξετε σε ένθετες ενότητες με την πλήρη ιεραρχία, διαχωρίζοντας κάθε ενότητα με διπλή άνω και κάτω τελεία, για παράδειγμα, parent_module:: my_module.

Από προεπιλογή, τα στοιχεία εντός των λειτουργικών μονάδων είναι ιδιωτικά και είναι προσβάσιμα μόνο στον κώδικα εντός της ίδιας λειτουργικής μονάδας. Αλλά μπορείτε να κάνετε δημόσιες ενότητες χρησιμοποιώντας το καπηλειό λέξη-κλειδί:

mod my_module {
καπηλειόστmy_function() {
// το σώμα συνάρτησης πηγαίνει εδώ
}
}

Στη συνέχεια, μπορείτε να αποκτήσετε πρόσβαση my_function από άλλα μέρη του προγράμματός σας.

Χρήση γνωρισμάτων για τον καθορισμό των συμπεριφορών

Ένας άλλος τρόπος με τον οποίο το Rust επιτρέπει την ενθυλάκωση είναι μέσω της χρήσης χαρακτηριστικών. Τα χαρακτηριστικά ορίζουν συμπεριφορές που μπορούν να εφαρμόσουν οι τύποι και διασφαλίζουν ότι διαφορετικοί τύποι συμμορφώνονται με την ίδια διεπαφή.

καπηλειόχαρακτηριστικόΕκτυπώσιμος {
στΤυπώνω(&εαυτός);
}

καπηλειόstructΟ τύπος μου {
// κατασκευή πεδίων εδώ
}

υπονοώ Εκτυπώσιμος Για Ο τύπος μου {
στΤυπώνω(&εαυτός) {
// υλοποίηση εδώ
}
}

ο Εκτυπώσιμος γνώρισμα έχει α Τυπώνω μέθοδος, και η Ο τύπος μου struct υλοποιεί το Εκτυπώσιμος χαρακτηριστικό με την εφαρμογή του Τυπώνω μέθοδος.

Χρησιμοποιώντας χαρακτηριστικά, μπορείτε να διασφαλίσετε ότι οποιοσδήποτε τύπος υλοποιεί το Εκτυπώσιμος γνώρισμα έχει α Τυπώνω μέθοδος. Αυτό είναι βολικό όταν εργάζεστε με γενικό κώδικα που πρέπει να διαλειτουργεί με διαφορετικούς τύπους που μοιράζονται μια κοινή συμπεριφορά.

Κληρονομιά στο Rust

Η κληρονομικότητα σάς επιτρέπει να ορίσετε μια κλάση με βάση μια διαφορετική. Η υποκλάση θα κληρονομήσει τις ιδιότητες και τις μεθόδους του μητρικού της.

Στο Rust, σας ενθαρρύνουμε να χρησιμοποιήσετε σύνθεση αντί για κληρονομικότητα. Η σύνθεση είναι μια διαδικασία δημιουργίας νέων αντικειμένων με συνδυασμό υπαρχόντων. Αντί να δημιουργήσετε μια νέα κλάση που κληρονομεί τη λειτουργικότητα από τη βασική κλάση, μπορείτε να δημιουργήσετε μια νέα δομή που περιέχει μια παρουσία της βασικής δομής και των πεδίων της.

Δημιουργία νέων τύπων συνδυάζοντας υπάρχοντες τύπους

Θα χρησιμοποιήσετε αριθμούς και δομές για να δημιουργήσετε νέους τύπους. Τα enum είναι εύχρηστα για τύπους με πεπερασμένες τιμές και οι δομές μπορούν να χωρέσουν πολλά πεδία.

Μπορείτε να δημιουργήσετε έναν τύπο enum για διαφορετικούς τύπους ζώων.

αρίθμησηΖώο {
Γάτα,
Σκύλος,
Πουλί,
// ...
}

Εναλλακτικά, μπορείτε να δημιουργήσετε μια δομή που περιέχει πεδία για κάθε τύπο ζώου. Οι δομές μπορούν να χωρέσουν enums και άλλους τύπους.

structΖώο {
όνομα: Σειρά,
ηλικία: u8,
animal_type: AnimalType,
}

αρίθμησηAnimalType {
Γάτα,
Σκύλος,
Πουλί,
// ...
}

ο Ζώο Η δομή κρατά τις τιμές του AnimalType τύπος απαρίθμησης.

Μπορείτε να χρησιμοποιήσετε χαρακτηριστικά για να εφαρμόσετε κληρονομικότητα και να προσθέσετε συμπεριφορά σε έναν τύπο χωρίς να δημιουργήσετε έναν νέο.

χαρακτηριστικόΠετώ {
στπετώ(&εαυτός);
}

Δείτε πώς μπορείτε να το εφαρμόσετε Πετώ χαρακτηριστικό για πολλούς τύπους.

structΠουλί {
όνομα: Σειρά,
άνοιγμα φτερών: f32,
}

υπονοώ Πετώ Για Πουλί {
στπετώ(&εαυτός) {
println!("{} πετάει!", εαυτός.όνομα);
}
}

structΕπίπεδο {
μοντέλο: Σειρά,
μέγιστη ταχύτητα: u32,
}

υπονοώ Πετώ Για αεροπλάνο {
στπετώ(&εαυτός) {
println!("{} πετάει!", εαυτός.μοντέλο);
}
}

ο Πουλί και Επίπεδο δομές υλοποιούν το Πετώ χαρακτηριστικό και τυπωμένες συμβολοσειρές με το Println! μακροεντολή.

Μπορείτε να καλέσετε το πετώ μέθοδο και στις δύο δομές χωρίς να γνωρίζουμε τους συγκεκριμένους τύπους τους.

στκύριος() {
αφήνω πουλί = Πουλί {
όνομα: Σειρά::από("Αετός"),
άνοιγμα φτερών: 2.0,
};

αφήνω αεροπλάνο = αεροπλάνο {
μοντέλο: Σειρά::από("Boeing 747"),
μέγιστη ταχύτητα: 900,
};

αφήνω flying_objects: Vecdyn Πετάω> = vec![&bird, &plane];

Για αντικείμενο σε flying_objects {
object.fly();
}
}

ο κύριος η συνάρτηση στιγματίζει το Επίπεδο και Πουλί τύπους. ο ιπτάμενα_αντικείμενα vector είναι ένα διάνυσμα των στιγμιότυπων αντικειμένων και το Για ο βρόχος διασχίζει το διάνυσμα και καλεί το πετώ μέθοδος στις περιπτώσεις.

Εφαρμογή Πολυμορφισμού στη Σκουριά

Μια κατηγορία ή τύπος είναι πολυμορφικό εάν πολλοί τύποι αντιπροσωπεύουν μια διεπαφή. Δεδομένου ότι τα χαρακτηριστικά παρέχουν τη λειτουργικότητα για τον ορισμό συμπεριφορών στο Rust, ενώ παρέχουν μια κοινή διεπαφή για τη σύνταξη γενικού κώδικα, μπορείτε να χρησιμοποιήσετε τα χαρακτηριστικά για να εφαρμόσετε τον πολυμορφισμό.

Εδώ είναι ένα χαρακτηριστικό που ονομάζεται Σχεδιαστικό που ορίζει τη συμπεριφορά για την απόδοση αντικειμένων στην οθόνη:

χαρακτηριστικόΣχεδιαστικό {
στσχεδιάζω(&εαυτός);
}

Οι τύποι που υλοποιούν το χαρακτηριστικό Drawable μπορούν να έχουν πρόσβαση στο σχεδιάζω λειτουργία.

structΟρθογώνιο παραλληλόγραμμο {
πλάτος: u32,
ύψος: u32,
}

υπονοώ Σχεδιαστικό Για ορθογώνιο {
στσχεδιάζω(&εαυτός) {
// Αποδώστε το ορθογώνιο στην οθόνη
}
}

Μπορείτε να γράψετε γενικό κώδικα που σχεδιάζει αντικείμενα που υλοποιούν το Σχεδιαστικό χαρακτηριστικό.

στσχεδίαση_αντικειμένου(αντικείμενο: &T) {
object.draw();
}

ο σχεδίαση_αντικειμένου η συνάρτηση παίρνει έναν γενικό τύπο Τ ως είσοδο που υλοποιεί το Σχεδιαστικό γνώρισμα και καλεί το σχεδιάζω μέθοδος στο χαρακτηριστικό. Διαφορετικά αντικείμενα μπορούν να υλοποιήσουν το Σχεδιαστικό χαρακτηριστικό και πρόσβαση στη λειτουργικότητα.

Εφαρμογή της Αφαίρεσης στη Σκουριά

Η αφαίρεση είναι έννοια OOP όπου οι κλάσεις και οι διεπαφές είναι προσβάσιμες σε καθορισμένα αντικείμενα και τύπους. Μπορείτε να εφαρμόσετε την αφαίρεση στο Rust με χαρακτηριστικά.

Ακολουθεί ένα παράδειγμα χαρακτηριστικού για ένα πρόγραμμα αναπαραγωγής πολυμέσων:

χαρακτηριστικόΜεσο ΜΑΖΙΚΗΣ ΕΝΗΜΕΡΩΣΗΣ {
στπαίζω(&εαυτός);
}

Δομές και αριθμοί που υλοποιούν το Μεσο ΜΑΖΙΚΗΣ ΕΝΗΜΕΡΩΣΗΣ το χαρακτηριστικό πρέπει να παρέχει μια εφαρμογή για το παίζω μέθοδος.

structΤραγούδι {
τίτλος: Σειρά,
καλλιτέχνης: Σειρά,
}

υπονοώ Μεσο ΜΑΖΙΚΗΣ ΕΝΗΜΕΡΩΣΗΣ Για Τραγούδι {
στπαίζω(&εαυτός) {
println!("Αναπαραγωγή τραγουδιού: {} από {}", εαυτός.τίτλος, εαυτός.καλλιτέχνης);
}
}

ο Τραγούδι struct υλοποιεί το Μεσο ΜΑΖΙΚΗΣ ΕΝΗΜΕΡΩΣΗΣ χαρακτηριστικό παρέχοντας μια εφαρμογή για το παίζω μέθοδος που εκτυπώνει ένα μήνυμα με τα πεδία του Τραγούδι δομές στην κονσόλα.

στκύριος() {
// Δημιουργία ενός στιγμιότυπου της δομής Song
αφήνω τραγούδι = Τραγούδι {
τίτλος: Σειρά::από("Bohemian Rhapsody"),
καλλιτέχνης: Σειρά::από("Βασίλισσα"),
};

// Καλέστε τη μέθοδο αναπαραγωγής στην παρουσία τραγουδιού
song.play();
}

ο τραγούδι η μεταβλητή είναι ένα παράδειγμα του Τραγούδι struct, και η μεταβλητή μπορεί να έχει πρόσβαση και να καλεί το παίζω μέθοδος.

Η οργάνωση του Rust Code είναι εύκολη

Ο αντικειμενοστραφής προγραμματισμός βοηθά στην οργάνωση κώδικα. Χάρη στο σύστημα λειτουργικών μονάδων της Rust, μπορείτε εύκολα να οργανώσετε τον κώδικα Rust ενώ εφαρμόζετε τις έννοιες OOP για την εφαρμογή σας για να διατηρείτε τον κώδικά σας οργανωμένο, διαχειρίσιμο και διαισθητικό.