Les getters et setters en Dart
Les getters et setters en Dart
-
Objectifs du cours
- Comprendre le concept de getters et de setters en Dart.
- Savoir utiliser des getters pour récupérer des valeurs d’une classe.
- Savoir utiliser des setters pour modifier les valeurs d’une classe.
- Comprendre l’importance des getters et des setters dans l’encapsulation des données.
- Être en mesure d’appliquer les getters et les setters dans des scénarios pratiques.
-
Comprendre le concept de getters et de setters en Dart.
-
Présentation
- En POO, les accesseurs désignent des méthodes qui permettent d’accéder aux attributs privés d’une classe en lecture et écriture. Il y en a de deux types, les getters et les setters.
- Les getters et les setters sont également appelés accesseurs et les mutateurs permettent au programme d’initialiser et de récupérer les valeurs des champs de classe respectivement.
- Les getters ou les accesseurs sont définis à l’aide du mot-clé get, les setters ou les mutateurs sont définis à l’aide du mot-clé set.
- Obtenir et Setter fournir un accès explicite en lecture et en écriture aux propriétés d’un objet. Dans Dart, get et set sont les mots-clés utilisés pour créer un getter et un setter. Getter lit la valeur de la propriété et agit en tant qu’accesseur . Setter met à jour la valeur de la propriété et agit en tant que mutateur .
-
Définitions
- Les setters et les getters sont des composants essentiels de la programmation orientée objet, permettant aux développeurs de contrôler l’accès aux propriétés de classe et de fournir une logique personnalisée pour lire et modifier les valeurs.
- Dans Dart et Flutter, les setters et getters fournissent un mécanisme puissant pour encapsuler les données et ajouter des fonctionnalités supplémentaires.
- Cet article de niveau avancé vise à explorer les subtilités des setters et getters, leurs cas d’utilisation, et à fournir des exemples pratiques pour les développeurs avancés de Dart et Flutter.
-
Getter
Syntax:
- Une méthode qui permet d’accéder à la valeur d’une propriété d’une classe.
- Un getter est une méthode qui permet d’obtenir la valeur d’une propriété.
- Pour définir un getter, utilisez le mot-clé get suivi du nom du getter.
-
Solution
-
Setter
Syntax:
- Setter : Une méthode qui permet de mettre à jour la valeur d’une propriété d’une classe.
- Il est utilisé pour définir les données dans une variable reçue de la méthode getter. Toutes les classes ont une méthode de définition par défaut mais elle peut être remplacée explicitement.
- La méthode setter peut être définie à l’aide du mot-clé set comme :
-
Encapsulation
- Encapsulation : Le principe de regrouper les données (propriétés) et les méthodes (fonctions) qui les manipulent dans une seule unité, c’est-à-dire une classe.
- Les setters et getters assurent l’encapsulation en masquant la représentation interne des données et en autorisant un accès contrôlé. Cela favorise la dissimulation des informations et améliore la maintenabilité du code.
-
Activité
- Créez une classe nommée « Personne » avec une propriété privée « nom » de type String.
- Implémentez un getter « getNom » pour récupérer la valeur de la propriété « nom« .
- Implémentez également un setter « setNom » pour modifier la valeur de la propriété « nom« .
- Dans cet exemple, la classe « Personne » a une propriété privée « _nom » et les méthodes « getNom » et « setNom » pour y accéder. Le setter « setNom » permet de modifier la valeur de « _nom« , tandis que le getter « getNom » permet de récupérer sa valeur.
-
Pourquoi utiliser les getters et setters
- Les getters sont utilisés dans ce cas pour encapsuler l’accès aux attributs de la classe Rectangle. Voici quelques raisons pour lesquelles les getters sont utilisés :
- Encapsulation : Les getters permettent d’encapsuler l’accès aux données de la classe en fournissant une interface pour récupérer les valeurs des attributs. Cela permet de cacher les détails d’implémentation de la classe et de limiter l’accès direct aux attributs.
- Contrôle d’accès : En utilisant des getters, vous pouvez contrôler l’accès aux attributs de la classe. Par exemple, vous pouvez ajouter des conditions ou des vérifications lors de la récupération des valeurs, ce qui peut être utile pour garantir l’intégrité des données.
- Flexibilité : Les getters permettent de modifier la manière dont les valeurs des attributs sont récupérées sans modifier l’interface publique de la classe. Si vous décidez de changer la façon dont les attributs sont stockés ou calculés à l’avenir, vous pouvez le faire en modifiant uniquement le code du getter, sans avoir à modifier les autres parties du code qui utilisent la classe.
- Encapsulation des changements : En encapsulant l’accès aux attributs derrière des getters, vous pouvez modifier l’implémentation interne de la classe sans affecter le code client. Cela permet de réduire la dépendance entre les différentes parties du code et facilite la maintenance et l’évolution du logiciel.
-
Exemple
- Ce code définit une classe CompteBancaire avec des méthodes pour effectuer des dépôts et des retraits, ainsi qu’un attribut privé _solde pour stocker le solde du compte.
- Des getters sont utilisés pour permettre la lecture du solde sans accès direct à l’attribut privé. L’exemple dans la fonction main crée une instance de CompteBancaire, effectue un dépôt, affiche le solde, effectue un retrait, puis affiche à nouveau le solde mis à jour.
-
Applications
-
App01
- Créez une classe nommée « Cercle » avec une propriété privée « rayon » de type double.
- Implémentez un getter nommé « getRayon » pour récupérer la valeur de la propriété « rayon« .
- Implémentez un setter nommé « setRayon » qui vérifie si la valeur passée est supérieure à zéro. Si c’est le cas, mettez à jour la valeur de « rayon« . Sinon, affichez un message d’erreur.
- Testez votre classe en créant une instance de « Cercle« , en définissant le rayon avec le setter, puis en récupérant sa valeur avec le getter.
- Dans cet exercice, la classe « Cercle » a une propriété privée « _rayon » et les méthodes « getRayon » et « setRayon » pour y accéder. Le setter « setRayon » vérifie si la valeur passée est supérieure à zéro avant de mettre à jour la valeur de « _rayon« . Si la valeur est inférieure ou égale à zéro, un message d’erreur est affiché.
-
App02
- Créez une classe Temperature avec une variable privée _celsius pour représenter une température en degrés Celsius.
- La classe devrait avoir un getter celsius qui renvoie la valeur en degrés Celsius et un setter celsius qui permet de définir la valeur en degrés Celsius.
- Assurez-vous que la valeur en degrés Celsius est supérieure à -273.15, car cela représente le zéro absolu.
- Ensuite, ajoutez un getter fahrenheit qui renvoie la valeur en degrés Fahrenheit (la formule de conversion est : Fahrenheit = Celsius * 9/5 + 32).
-
App03
- Créez une classe Person avec les propriétés privées _firstName et _lastName. Ajoutez des getters et des setters pour ces propriétés.
- Ensuite, ajoutez une propriété calculée fullName qui renvoie la concaténation du prénom et du nom de famille. Assurez-vous de mettre à jour la valeur de fullName à chaque fois que les getters ou les setters des propriétés _firstName ou _lastName sont appelés.
-
App04
- Créez une classe Product pour représenter un produit avec les propriétés privées _name et _price. Ajoutez des getters et des setters pour ces propriétés.
- Ensuite, ajoutez une propriété calculée discountedPrice qui renvoie le prix réduit du produit. Vous pouvez supposer que le prix réduit est de 10% du prix d’origine.
Les getters sont des méthodes spéciales dans une classe qui permettent de récupérer la valeur d’un attribut privé depuis l’extérieur de la classe. Ils offrent un moyen sûr et contrôlé d’accéder à ces attributs privés sans exposer directement leur valeur.
return_type get field_name{
// return the value
}
class MaClasse {
String _maPropriete = "Valeur initiale";
String get maPropriete {
return _maPropriete;
}
}
set field_name {
// set the value
}
définir nom_champ{
...
}
class Personne {
String _nom;
String getNom() {
return _nom;
}
void setNom(String nouveauNom) {
_nom = nouveauNom;
}
}
void main() {
var personne = Personne();
personne.setNom("John Doe");
print(personne.getNom()); // Affiche "John Doe"
}
Exemple
class CompteBancaire {
// Attribut privé
double _solde = 0.0;
// Getter pour lire l'attribut privé _solde
double get solde => _solde;
//// Getter pour lire l'attribut privé _solde
//double get solde {
// return _solde;
//}
// Méthode pour effectuer un dépôt
void deposer(double montant) {
_solde += montant;
}
// Méthode pour effectuer un retrait
void retirer(double montant) {
if (_solde >= montant) {
_solde -= montant;
} else {
throw Exception("Solde insuffisant");
}
}
}
void main() {
// Création d'une instance de la classe CompteBancaire
CompteBancaire compte = CompteBancaire();
// Dépôt d'argent
compte.deposer(1000);
// Affichage du solde
print("Solde après le dépôt: ${compte.solde}");
// Retrait d'argent
compte.retirer(500);
// Affichage du solde
print("Solde après le retrait: ${compte.solde}");
}
Solution
class Cercle {
double _rayon;
double getRayon() {
return _rayon;
}
void setRayon(double nouveauRayon) {
if (nouveauRayon > 0) {
_rayon = nouveauRayon;
} else {
print("Le rayon doit être supérieur à zéro.");
}
}
}
void main() {
var cercle = Cercle();
cercle.setRayon(5.0);
print(cercle.getRayon()); // Affiche "5.0"
cercle.setRayon(-2.0); // Affiche "Le rayon doit être supérieur à zéro."
}
Solution
class Temperature {
// Attribut privé pour stocker la température en degrés Celsius
double _celsius;
// Constructeur pour initialiser la température en degrés Celsius
Temperature(this._celsius) {
// Vérifier que la température est supérieure au zéro absolu
if (_celsius < -273.15) {
throw ArgumentError("La température en degrés Celsius ne peut pas être inférieure à -273.15 (zéro absolu).");
}
}
// Getter pour récupérer la température en degrés Celsius
double get celsius => _celsius;
// Setter pour définir la température en degrés Celsius
set celsius(double value) {
// Vérifier que la nouvelle température est supérieure au zéro absolu
if (value < -273.15) {
throw ArgumentError("La température en degrés Celsius ne peut pas être inférieure à -273.15 (zéro absolu).");
}
_celsius = value;
}
// Getter pour récupérer la température en degrés Fahrenheit
double get fahrenheit => _celsius * 9/5 + 32;
}
void main() {
// Création d'un objet Temperature avec une température initiale de 20 degrés Celsius
Temperature temperature = Temperature(20.0);
// Affichage de la température en degrés Celsius et Fahrenheit
print("Température en degrés Celsius : ${temperature.celsius}");
print("Température en degrés Fahrenheit : ${temperature.fahrenheit}");
}
Solution
class Person {
// Attributs privés pour stocker le prénom et le nom de famille
String _firstName;
String _lastName;
// Constructeur pour initialiser le prénom et le nom de famille
Person(this._firstName, this._lastName);
// Getter pour récupérer le prénom
String get firstName => _firstName;
// Setter pour définir le prénom
set firstName(String value) {
_firstName = value;
}
// Getter pour récupérer le nom de famille
String get lastName => _lastName;
// Setter pour définir le nom de famille
set lastName(String value) {
_lastName = value;
}
// Propriété calculée pour renvoyer le nom complet
String get fullName => '$_firstName $_lastName';
}
void main() {
// Création d'un objet Person avec un prénom "John" et un nom de famille "Doe"
Person person = Person("John", "Doe");
// Affichage du prénom, du nom de famille et du nom complet
print("Prénom : ${person.firstName}");
print("Nom de famille : ${person.lastName}");
print("Nom complet : ${person.fullName}");
// Modification du prénom et du nom de famille
person.firstName = "Jane";
person.lastName = "Smith";
// Affichage du prénom, du nom de famille et du nom complet mis à jour
print("Prénom : ${person.firstName}");
print("Nom de famille : ${person.lastName}");
print("Nom complet : ${person.fullName}");
}
Solution
class Product {
// Attributs privés pour stocker le nom et le prix du produit
String _name;
double _price;
// Constructeur pour initialiser le nom et le prix du produit
Product(this._name, this._price);
// Getter pour récupérer le nom du produit
String get name => _name;
// Setter pour définir le nom du produit
set name(String value) {
_name = value;
}
// Getter pour récupérer le prix du produit
double get price => _price;
// Setter pour définir le prix du produit
set price(double value) {
_price = value;
}
// Propriété calculée pour renvoyer le prix réduit du produit
double get discountedPrice => _price * 0.9; // Réduction de 10%
}
void main() {
// Création d'un objet Product avec un nom "T-shirt" et un prix de 20
Product product = Product("T-shirt", 20);
// Affichage du nom et du prix du produit
print("Nom du produit : ${product.name}");
print("Prix du produit : ${product.price}");
// Calcul et affichage du prix réduit du produit
print("Prix réduit du produit : ${product.discountedPrice}");
}