Conventions de nommage
Fait partie de la section Object Oriented Programming du Journey Lua de Coddy — leçon 43 sur 70.
En Lua, tous les champs de table sont accessibles publiquement par défaut. N'importe qui peut lire ou modifier self.health directement. Bien que Lua n'impose pas de confidentialité, les programmeurs utilisent des conventions de nommage pour communiquer leur intention — signalant quels champs doivent être traités comme des détails d'implémentation interne.
La convention standard consiste à préfixer les champs privés par un tiret bas :
local Player = {}
Player.__index = Player
function Player:new(name)
local obj = {
name = name, -- Public : accessible directement
_health = 100, -- Privé : utiliser les méthodes à la place
_score = 0 -- Privé : suivi interne
}
setmetatable(obj, Player)
return obj
end
function Player:getHealth()
return self._health
end
function Player:takeDamage(amount)
self._health = self._health - amount
endLe tiret bas ne change pas le fonctionnement de Lua — player._health reste techniquement accessible. Cependant, il sert d'avertissement clair aux autres programmeurs (et à vous-même dans le futur) : « Ce champ est censé être privé. Accédez-y plutôt via des méthodes. »
Cette convention est importante car elle sépare l'interface (ce que les autres devraient utiliser) de l'implémentation (comment cela fonctionne en interne). Si vous avez besoin plus tard d'ajouter une validation ou de modifier la façon dont la santé est stockée, vous modifiez uniquement les méthodes — le code utilisant :getHealth() continue de fonctionner sans changement.
Défi
FacileConstruisons une classe BankAccount qui signale correctement quels champs sont censés être privés en utilisant la convention de nommage avec underscore !
Vous organiserez votre code sur deux fichiers :
BankAccount.lua: Créez une classe qui gère les informations du compte. Le constructeur:new(ownerName, initialBalance)doit stocker le nom du propriétaire en tant que champ public (owner) et le solde en tant que champ privé (_balance). Incluez trois méthodes ::getBalance()— retourne le solde actuel:deposit(amount)— ajoute le montant à_balance:getOwner()— retourne le nom du propriétaire
main.lua: Chargez votre module BankAccount, lisez le nom du propriétaire, le solde initial et le montant du dépôt à partir de l'entrée. Créez un compte, effectuez un dépôt, puis affichez le propriétaire et le solde final.
Vous recevrez trois entrées :
- Le nom du propriétaire
- Le solde initial (un nombre)
- Le montant du dépôt (un nombre)
Votre sortie doit comporter deux lignes indiquant le propriétaire et le solde final après le dépôt :
Owner: {ownerName}
Balance: {finalBalance}Par exemple, si les entrées sont Maria, 500, et 150, la sortie doit être :
Owner: Maria
Balance: 650Rappel : le préfixe underscore sur _balance signale aux autres programmeurs que ce champ doit être accédé via des méthodes comme :getBalance() et :deposit(), et non directement. Le champ owner sans underscore indique qu'il peut être accédé publiquement.
Aide-mémoire
En Lua, tous les champs de table sont accessibles publiquement par défaut. Pour communiquer quels champs doivent être traités comme des détails d'implémentation interne, utilisez la convention de nommage par souligné en préfixant les champs privés d'un tiret bas (_).
Le tiret bas n'impose pas la confidentialité — c'est un signal pour les autres programmeurs que le champ doit être accédé via des méthodes plutôt que directement.
local Player = {}
Player.__index = Player
function Player:new(name)
local obj = {
name = name, -- Public : accès direct autorisé
_health = 100, -- Privé : utiliser des méthodes à la place
_score = 0 -- Privé : suivi interne
}
setmetatable(obj, Player)
return obj
end
function Player:getHealth()
return self._health
end
function Player:takeDamage(amount)
self._health = self._health - amount
endCette convention sépare l'interface (ce que les autres doivent utiliser) de l'implémentation (comment cela fonctionne en interne), rendant le code plus facile à maintenir lorsque des modifications sont nécessaires.
Essayez vous-même
-- Charger le module BankAccount
local BankAccount = require('BankAccount')
-- Lire les entrées
local ownerName = io.read()
local initialBalance = tonumber(io.read())
local depositAmount = tonumber(io.read())
-- TODO : Créer un nouveau BankAccount avec ownerName et initialBalance
-- TODO : Effectuer un dépôt en utilisant depositAmount
-- TODO : Afficher le propriétaire et le solde final dans le format requis
-- Format :
-- Propriétaire : {ownerName}
-- Solde : {finalBalance}
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