Menu
Coddy logo textTech

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
end

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

challenge icon

Défi

Facile

Construisons 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 :

  1. Le nom du propriétaire
  2. Le solde initial (un nombre)
  3. 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: 650

Rappel : 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
end

Cette 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}
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