Menu
Coddy logo textTech

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 = 77F

La 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.

challenge icon

Défi

Facile

Construisons 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 classe Money qui 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 centimes
    • getDollars() : 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 USD
    • getEuros() : 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 de Money. 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)

?>
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur PHP en ligne