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
endDé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.
Défi
FacileConstruisons 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 classeThermostatavec le modèle de prototype standard. Chaque thermostat doit suivre satemperatureactuelle. 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 : minimum10et maximum30
- Un constructeur
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 sur10 - Si la nouvelle température est supérieure à
30, réglez-la sur30 - Sinon, réglez-la sur la valeur demandée
Vous recevrez deux entrées :
- Première température à régler
- Deuxième température à régler
Dans votre fichier principal, créez un thermostat, puis :
- Affichez la température initiale
- Réglez la température sur la première valeur d'entrée et affichez le résultat
- 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
30Remarquez 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
endLes 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
endLa 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
endLes 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
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
1Le concept de « self »
Tables avec fonctions« self » expliciteLa syntaxe avec deux-pointsPoint vs deux-pointsRécapitulatif - Point mobile4Projet : Banque numérique
Configuration du projetMéthode de dépôt7Polymorphisme et Redéfinition
Redéfinition de méthodesAppeler des méthodes parentesDuck TypingInterface communeVérification du typeRécapitulatif - Rôles des employés10Projet : Gestionnaire de formes
Configuration du projetClasse Rectangle2Modèle de prototype de classe
Le concept de prototypeLiaison avec __indexLe constructeur :new()Initialisation des attributsInstances indépendantesRécapitulatif - Usine de voitures5Surcharge d'opérateurs en POO
Additionner des objetsSoustraire des objetsConcaténer des objetsComparer des objets (<, >)Récapitulatif - Calculs de portefeuille8Encapsulation
Conventions de nommageClosures pour la confidentialitéAccès via les ClosuresTables en lecture seuleLogique de validationRécapitulatif - Coffre-fort sécurisé11Patrons de conception (Lite)
Fonctions FactoryTable SingletonPatron IteratorObserver (Écouteur)Récapitulatif - Logger Factory3État et comportement des objets
Variables d'instanceMéthodes GetterMéthodes SetterPropriétés calculéesFormatage de chaînesVérifications d'égalitéRécapitulatif - Note de l'étudiant6Bases de l'héritage
Mise en place de l'héritageHériter des méthodesÉtendre le constructeurAjouter des méthodes enfantsPartagé vs UniqueRécapitulatif - Hiérarchie des formes