Dissimulation de l’information
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 41 sur 91.
La dissimulation de l’information est le principe qui sous-tend l’encapsulation : l’idée qu’une classe ne devrait exposer que ce qui est nécessaire et masquer les détails de son implémentation interne. Les modificateurs d’accès et les accesseurs/mutateurs sont les outils, tandis que la dissimulation de l’information est la philosophie de conception qui guide la manière dont vous les utilisez.
L’objectif est de créer une séparation claire entre ce que fait une classe (son interface publique) et la manière dont elle le fait (son implémentation interne). Cette séparation signifie que vous pouvez modifier le fonctionnement interne sans affecter le code qui utilise la classe :
<?php
class Temperature {
private float $celsius;
public function setCelsius(float $value): void {
$this->celsius = $value;
}
public function getCelsius(): float {
return $this->celsius;
}
public function getFahrenheit(): float {
return ($this->celsius * 9/5) + 32;
}
}
$temp = new Temperature();
$temp->setCelsius(25);
echo $temp->getCelsius() . "C = " . $temp->getFahrenheit() . "F";
Sortie :
25C = 77FLa classe stocke la température en interne en degrés Celsius, mais les utilisateurs n’ont pas besoin de le savoir. Vous pourriez ultérieurement modifier le stockage interne pour utiliser les degrés Fahrenheit ou Kelvin et, tant que les méthodes publiques fonctionnent toujours de la même manière, aucun code externe ne sera affecté.
Point clé : Le masquage des informations protège votre code contre les modifications. Masquez les détails d’implémentation, n’exposez que des interfaces stables, et vos classes deviendront plus faciles à maintenir et à modifier au fil du temps.
Défi
FacileConstruisons un convertisseur de devises qui démontre le masquage des informations en pratique. Vous allez créer une classe qui stocke l’argent en interne dans une devise, mais qui peut convertir de manière transparente vers et depuis plusieurs devises, sans que le code externe sache jamais comment les données sont réellement stockées.
Vous organiserez votre code sur deux fichiers :
Money.php: créez une classeMoneyqui stocke en interne tous les montants en centimes (sous forme d’entier) afin d’éviter les problèmes de précision des nombres à virgule flottante. Ce détail d’implémentation doit être complètement masqué pour les utilisateurs de la classe. La classe doit fournir :- Une propriété privée pour stocker le montant en centimes
setDollars(float $amount): accepte un montant en dollars et le stocke en interne sous forme de centimesgetDollars(): renvoie le montant en dollars (float, avec 2 décimales)setEuros(float $amount): accepte un montant en euros et le convertit en centimes selon le taux suivant : 1 EUR = 1.10 USDgetEuros(): renvoie le montant converti en euros (float, avec 2 décimales)getInternalValue(): renvoie la valeur brute en centimes (entier) à des fins de débogage
main.php: incluez le fichier Money. Vous recevrez deux entrées : un montant en dollars et un montant en euros. Créez une instance deMoney. Commencez par définir le montant en dollars (converti en float) et affichez trois lignes : la valeur en dollars, l’équivalent en euros et la valeur interne en centimes. Définissez ensuite le montant en euros (converti en float) et affichez à nouveau ces trois mêmes valeurs.
L’intérêt de cette conception est que le code externe utilise des valeurs familières en dollars et en euros, sans savoir que tout est stocké en interne sous forme de centimes. Vous pourriez ultérieurement modifier le stockage interne pour utiliser une autre devise de référence ou une autre stratégie de précision et, tant que les méthodes publiques continuent de fonctionner correctement, aucun code externe n’aurait besoin d’être modifié.
Formatez toutes les sorties en dollars et en euros avec exactement 2 décimales. Chaque valeur doit être affichée sur sa propre ligne, pour un total de six lignes en sortie.
Essayez vous-même
<?php
require_once 'Money.php';
// Lire les entrées
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));
// TODO: Créer une instance de Money
// TODO: Définir le montant en dollars et afficher :
// - La valeur en dollars (2 décimales)
// - L'équivalent en euros (2 décimales)
// - La valeur interne en cents (entier)
// TODO: Définir le montant en euros et afficher :
// - La valeur en dollars (2 décimales)
// - L'équivalent en euros (2 décimales)
// - La valeur interne en cents (entier)
?>Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition des méthodesLe mot-clé finalClasses abstraitesRécapitulatif – Hiérarchie des employés7Encapsulation
Public, Protected, PrivateModificateurs d’accès en profondeurAccesseurs et mutateursDissimulation de l’informationPromotion des constructeurs (8.0)Récapitulatif – Système de fiches étudiant10Concepts avancés de la POO
Composition ou héritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibres (PHP 8.1)Approfondissement du clonage d’objetsGénérateurs et itérateurs13Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron Dépôt2Espaces de noms et chargement automatique
Introduction aux espaces de nomsLe mot-clé useNorme de chargement automatique PSR-4Autoloader de ComposerRécapitulatif - Projet organisé5Interfaces et contrats
Introduction aux interfacesImplémentation des interfacesImplémentation de plusieurs interfacesInterface ou classe abstraiteIndication de type avec les interfacesRécapitulatif - Calculateur de formes8Méthodes magiques
Introduction aux méthodes magiques__toString et __debugInfo__get, __set, __isset, __unset__call et __callStatic__clone et clonage d’objets__serialize et __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d’instance vs statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés en lecture seule (PHP 8.1)Récapitulatif - Gestionnaire de comptes bancaires6Polymorphisme
Révision de la redéfinition des méthodesPolymorphisme via les interfacesAnnotations de type et types unionLiaison statique tardiveRécapitulatif - Processeur de paiements9Traits
Introduction aux traitsUtilisation de plusieurs traitsRésolution des conflits entre traitsMéthodes abstraites dans les traitsTraits par rapport à l’héritage12Patrons de conception – Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur PHP en ligne