Menu
Coddy logo textTech

Propriétés calculées

Fait partie de la section Programmation orientée objet du Journey Lua de Coddy. Leçon 15 sur 70.

Les getters et les setters permettent d’accéder aux valeurs stockées, mais vous avez parfois besoin de données qui n’existent pas en tant que champ stocké. Elles doivent être calculées à partir d’autres attributs. On les appelle des propriétés calculées.

Considère un rectangle. Tu stockes sa largeur et sa hauteur, mais l’aire n’est stockée nulle part : elle est calculée en multipliant ces deux valeurs. Au lieu de stocker des données redondantes, tu crées une méthode qui calcule et renvoie le résultat :

local Rectangle = {}
Rectangle.__index = Rectangle

function Rectangle:new(width, height)
    local instance = {}
    setmetatable(instance, self)
    instance.width = width
    instance.height = height
    return instance
end

function Rectangle:getArea()
    return self.width * self.height
end

La méthode :getArea() ne renvoie pas une valeur stockée. Elle calcule l’aire à nouveau chaque fois que vous l’appelez. Cette approche présente un avantage essentiel : si la largeur ou la hauteur change, l’aire reflète automatiquement les nouvelles dimensions sans que vous ayez besoin de mettre quoi que ce soit à jour.

local box = Rectangle:new(5, 3)
print(box:getArea())  -- Sortie : 15

box.width = 10
print(box:getArea())  -- Sortie : 30

Les propriétés calculées garantissent la cohérence de vos objets. Plutôt que de stocker des valeurs qui dépendent d’autres champs (au risque qu’elles deviennent obsolètes), vous les calculez à la demande. Ce modèle s’applique à toutes les données dérivées : périmètres, moyennes, chaînes formatées ou toute valeur pouvant être déterminée à partir d’attributs existants.

challenge icon

Défi

Facile

Construisons une classe Box qui calcule son volume à la demande ! Au lieu de stocker le volume comme un champ, tu vas créer une propriété calculée qui le détermine à partir des dimensions de la boîte chaque fois que nécessaire.

Tu vas organiser ton code sur deux fichiers :

  • Box.lua : définis ta classe Box avec le modèle standard de prototype. Chaque boîte stocke trois dimensions : width, height et depth. Inclus :
    • Un constructeur :new(width, height, depth) qui stocke les trois dimensions
    • Une méthode :getVolume() qui calcule et renvoie le volume (largeur × hauteur × profondeur)
    • Une méthode :getSurfaceArea() qui calcule et renvoie la surface totale
  • main.lua : importe ton module Box, crée une instance de boîte et montre comment les propriétés calculées reflètent automatiquement les dimensions actuelles.

La surface d'une boîte se calcule ainsi : 2 × (width×height + height×depth + width×depth)

Tu recevras trois entrées représentant les dimensions de la boîte :

  1. Largeur
  2. Hauteur
  3. Profondeur

Dans ton fichier principal, crée une boîte avec les dimensions données, puis affiche deux lignes :

  1. Le volume à l'aide de :getVolume()
  2. La surface à l'aide de :getSurfaceArea()

Par exemple, si les entrées sont 3, 4 et 5, la sortie devrait être :

60
94

L'intérêt des propriétés calculées est qu'elles restent toujours exactes. Si tu modifiais plus tard l'une des dimensions de la boîte, appeler à nouveau :getVolume() renverrait automatiquement la nouvelle valeur correcte : aucune mise à jour manuelle n'est nécessaire !

Essayez vous-même

-- Charger le module Box
local Box = require('Box')

-- Lire les dimensions d'entrée
local width = tonumber(io.read())
local height = tonumber(io.read())
local depth = tonumber(io.read())

-- TODO: Créer une instance de box avec les dimensions données

-- TODO: Afficher le volume en utilisant :getVolume()

-- TODO: Afficher l'aire de surface en utilisant :getSurfaceArea()
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 Lua en ligne