Menu
Coddy logo textTech

Méthodes Setter

Fait partie de la section Object Oriented Programming du Journey Lua de Coddy — leçon 14 sur 70.

Les méthodes getter vous permettent de lire des données internes via un point d'accès contrôlé. Les méthodes setter (également appelées méthodes mutateurs) font le contraire : elles offrent un moyen contrôlé de modifier l'état interne.

Au lieu d'assigner directement car.speed = 50, vous appelez car:setSpeed(50) :

local Car = {}
Car.__index = Car

function Car:new()
    local instance = {}
    setmetatable(instance, self)
    instance.speed = 0
    return instance
end

function Car:setSpeed(newSpeed)
    self.speed = newSpeed
end

function Car:getSpeed()
    return self.speed
end

À première vue, cela semble être un travail supplémentaire pour le même résultat. Mais les setters deviennent puissants lorsque vous devez ajouter des règles plus tard. Imaginez que vous vouliez vous assurer que la vitesse ne devienne jamais négative ou ne dépasse un maximum :

function Car:setSpeed(newSpeed)
    if newSpeed < 0 then
        self.speed = 0
    elseif newSpeed > 200 then
        self.speed = 200
    else
        self.speed = newSpeed
    end
end

Désormais, chaque changement de vitesse passe par votre logique de validation. Tout code utilisant :setSpeed() bénéficie automatiquement de ces vérifications sans modification. C'est là que réside la véritable valeur des setters : ils créent un point unique où vous contrôlez la manière dont les données changent, rendant vos objets plus sûrs et plus faciles à maintenir.

challenge icon

Défi

Facile

Construisons une classe Thermostat qui utilise des méthodes setter pour contrôler la température de manière intelligente. Au lieu d'autoriser n'importe quelle valeur de température, votre thermostat imposera des limites raisonnables, maintenant la température dans une plage confortable.

Vous organiserez votre code sur deux fichiers :

  • Thermostat.lua : Définissez votre classe Thermostat avec le modèle de prototype standard. Chaque thermostat doit suivre sa temperature actuelle. Incluez :
    • Un constructeur :new() qui initialise la température à 20 (une valeur par défaut confortable)
    • Un getter :getTemperature() qui renvoie la température actuelle
    • Un setter :setTemperature(newTemp) qui met à jour la température, mais la maintient dans les limites : minimum 10 et maximum 30
  • main.lua : Importez votre module Thermostat et créez une instance de thermostat. Utilisez le setter pour tenter différents changements de température et observez comment les limites sont appliquées.

Votre méthode :setTemperature() doit appliquer ces règles :

  • Si la nouvelle température est inférieure à 10, réglez-la sur 10
  • Si la nouvelle température est supérieure à 30, réglez-la sur 30
  • Sinon, réglez-la sur la valeur demandée

Vous recevrez deux entrées :

  1. Première température à régler
  2. Deuxième température à régler

Dans votre fichier principal, créez un thermostat, puis :

  1. Affichez la température initiale
  2. Réglez la température sur la première valeur d'entrée et affichez le résultat
  3. Réglez la température sur la deuxième valeur d'entrée et affichez le résultat

Affichez chaque température sur sa propre ligne (uniquement le nombre).

Par exemple, si les entrées sont 25 et 50, la sortie devrait être :

20
25
30

Remarquez comment la deuxième tentative de réglage à 50 donne 30 — le setter applique automatiquement la limite maximale !

Aide-mémoire

Les méthodes de type "setter" (mutateurs) offrent un moyen contrôlé de modifier l'état interne, vous permettant d'ajouter des règles de validation et des contraintes.

Syntaxe de base d'une méthode setter :

function Car:setSpeed(newSpeed)
    self.speed = newSpeed
end

Les setters avec validation appliquent des règles lorsque les données changent :

function Car:setSpeed(newSpeed)
    if newSpeed < 0 then
        self.speed = 0
    elseif newSpeed > 200 then
        self.speed = 200
    else
        self.speed = newSpeed
    end
end

La combinaison de getters et de setters crée un accès contrôlé aux propriétés de l'objet :

local Car = {}
Car.__index = Car

function Car:new()
    local instance = {}
    setmetatable(instance, self)
    instance.speed = 0
    return instance
end

function Car:setSpeed(newSpeed)
    if newSpeed < 0 then
        self.speed = 0
    elseif newSpeed > 200 then
        self.speed = 200
    else
        self.speed = newSpeed
    end
end

function Car:getSpeed()
    return self.speed
end

Les setters créent un point de contrôle unique pour la modification des données, rendant les objets plus sûrs et plus faciles à maintenir. Tout code utilisant le setter bénéficie automatiquement de la logique de validation sans modification.

Essayez vous-même

-- Requiert le module Thermostat
local Thermostat = require('Thermostat')

-- Lire l'entrée
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())

-- TODO: Créer une instance de thermostat

-- TODO: Afficher la température initiale

-- TODO: Régler la température à temp1 et afficher le résultat

-- TODO: Régler la température à temp2 et afficher le résultat
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 Object Oriented Programming