Récapitulatif - Casier sécurisé
Fait partie de la section Programmation Orientée Objet du Journey Rust de Coddy. Leçon 13 sur 61.
Défi
FacileConstruisons un système de casier sécurisé qui rassemble tout ce que vous avez appris sur l’encapsulation ! Votre casier protégera son contenu derrière un code secret : seule une personne qui connaît le code pourra voir ce qui se trouve à l’intérieur.
Vous allez créer deux fichiers pour organiser votre code :
locker.rs: définissez une structureLockeravec deux champs privés :code(u32) etcontents(String). La structure doit être publique, mais les deux champs doivent rester privés afin de protéger la sécurité du casier. Implémentez :- un constructeur
newqui prend un code et un contenu initiaux - une méthode
set_codequi permet de modifier le code du casier - une méthode
get_contentsqui prend un code tenté ; s’il correspond au code du casier, elle renvoie le contenu ; sinon, elle renvoie"Access denied"
- un constructeur
main.rs: importez votre module de casier, créez un casier et démontrez ses fonctionnalités de sécurité en tentant d’accéder au contenu avec des codes correct et incorrect.
La méthode get_contents doit renvoyer une String, soit le contenu réel lorsque le code est correct, soit le message de refus lorsqu’il est incorrect. Il s’agit de votre accesseur conditionnel qui valide l’accès avant de révéler les données privées.
Votre sortie doit respecter exactement le format suivant :
Attempt with {code}: {result}
Code changed
Attempt with {code}: {result}Par exemple, si vous créez un casier avec le code 1234 et le contenu "Gold coins", que vous essayez le code 0000, modifiez le code en 5678, puis essayez 5678, la sortie sera :
Attempt with 0000: Access denied
Code changed
Attempt with 5678: Gold coinsVous recevrez cinq entrées : le code initial, le contenu, le premier code tenté, le nouveau code à définir et le second code tenté.
Essayez vous-même
mod locker;
use locker::Locker;
fn main() {
// Lire les entrées
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let initial_code: u32 = input.trim().parse().expect("Invalid number");
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let contents = input.trim().to_string();
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let first_attempt: u32 = input.trim().parse().expect("Invalid number");
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let new_code: u32 = input.trim().parse().expect("Invalid number");
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let second_attempt: u32 = input.trim().parse().expect("Invalid number");
// TODO: Créer un nouveau Locker avec initial_code et contents
// TODO: Tenter d'obtenir contents avec le code first_attempt
// Afficher : "Attempt with {code}: {result}"
// TODO: Changer le code du locker pour new_code
// Print: "Code changed"
// TODO: Tenter d'obtenir contents avec le code second_attempt
// Afficher : "Attempt with {code}: {result}"
}
Toutes les leçons de Programmation Orientée Objet
1Méthodes et comportement
Introduction aux blocs d'implémentationLe paramètre SelfMéthodes mutablesFonctions associéesBlocs d'implémentation multiplesChaînage de méthodesRécapitulatif - Actions sur le rectangle4Projet : Animal virtuel
Définir l'animalNourrir l'animal7Traits standards
Le trait DebugLe trait DisplayClone et CopyLes traits d'égalitéRécapitulatif - Point affichable10Projet : Système de documents
Le trait DrawComposant texte2Encapsulation et modules
Bases des modulesLe mot-clé publicChamps privésGettersSettersRécapitulatif - Casier sécurisé5Généricité
Structures génériquesMéthodes génériquesPlusieurs types génériquesFonctions génériquesRécapitulatif - Point de coordonnées8Les Traits comme contraintes
Syntaxe des contraintes de traitContraintes multiplesLa clause whereRetourner des types avec des traitsRécapitulatif - Afficheur générique11Design Patterns en Rust
Le pattern NewtypeCompositionLe trait DropFrom et IntoRécapitulatif - Mock de Smart Pointer3Enums avancées
Enums avec donnéesMéthodes sur les EnumsMatching des variantes de donnéesL'Enum Option revisitéeRécapitulatif - Enum Shape6Définition des Traits
Qu'est-ce qu'un Trait ?Implémenter des TraitsImplémentations par défautRedéfinir les comportements par défautTraits avec paramètresRécapitulatif - Lecteur multimédiaEntraînez-vous par vous-même : Compilateur Rust en ligne