Menu
Coddy logo textTech

Konwencje nazewnictwa

Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 43 z 70.

W Lua wszystkie pola tabeli są domyślnie publicznie dostępne. Każdy może bezpośrednio odczytać lub zmodyfikować self.health. Lua nie wymusza prywatności, ale programiści stosują konwencje nazewnictwa, aby komunikować swoje intencje: wskazywać, które pola należy traktować jako wewnętrzne szczegóły implementacji.

Standardową konwencją jest poprzedzanie pól prywatnych znakiem podkreślenia:

local Player = {}
Player.__index = Player

function Player:new(name)
    local obj = {
        name = name,      -- Publiczne: można uzyskiwać dostęp bezpośrednio
        _health = 100,    -- Prywatne: zamiast tego używaj metod
        _score = 0        -- Prywatne: wewnętrzne śledzenie
    }
    setmetatable(obj, Player)
    return obj
end

function Player:getHealth()
    return self._health
end

function Player:takeDamage(amount)
    self._health = self._health - amount
end

Podkreślenie nie zmienia sposobu działania Lua: player._health nadal jest technicznie dostępne. Pełni jednak funkcję wyraźnego ostrzeżenia dla innych programistów (i dla ciebie z przyszłości): „To pole ma być prywatne. Uzyskuj do niego dostęp za pomocą metod”.

Ta konwencja jest ważna, ponieważ oddziela interfejs (to, czego inni powinni używać) od implementacji (tego, jak działa wewnętrznie). Jeśli później trzeba będzie dodać walidację lub zmienić sposób przechowywania zdrowia, wystarczy zmodyfikować metody: kod używający :getHealth() nadal będzie działać bez zmian.

challenge icon

Wyzwanie

Łatwy

Zbudujmy klasę BankAccount, która prawidłowo sygnalizuje za pomocą konwencji nazewnictwa z podkreśleniem, które pola powinny być prywatne!

Rozmieścisz swój kod w dwóch plikach:

  • BankAccount.lua: Utwórz klasę zarządzającą informacjami o koncie. Konstruktor :new(ownerName, initialBalance) powinien przechowywać imię i nazwisko właściciela w publicznym polu (owner), a saldo w prywatnym polu (_balance). Dodaj trzy metody:
    • :getBalance(): zwraca bieżące saldo
    • :deposit(amount): dodaje kwotę do _balance
    • :getOwner(): zwraca imię i nazwisko właściciela
  • main.lua: Załaduj moduł BankAccount, wczytaj z wejścia imię i nazwisko właściciela, początkowe saldo oraz kwotę wpłaty. Utwórz konto, dokonaj wpłaty, a następnie wypisz właściciela i końcowe saldo.

Otrzymasz trzy dane wejściowe:

  1. Imię i nazwisko właściciela
  2. Początkowe saldo (liczba)
  3. Kwota wpłaty (liczba)

Na wyjściu powinny znaleźć się dwa wiersze z informacją o właścicielu i końcowym saldzie po wpłacie:

Owner: {ownerName}
Balance: {finalBalance}

Na przykład, jeśli dane wejściowe to Maria, 500 i 150, wynik powinien wyglądać tak:

Owner: Maria
Balance: 650

Pamiętaj: prefiks podkreślenia w _balance sygnalizuje innym programistom, że dostęp do tego pola powinien odbywać się za pośrednictwem metod, takich jak :getBalance() i :deposit(), a nie bezpośrednio. Pole owner bez podkreślenia wskazuje, że dostęp do niego może być publiczny.

Spróbuj swoich sił

-- Załaduj moduł BankAccount
local BankAccount = require('BankAccount')

-- Odczytaj dane wejściowe
local ownerName = io.read()
local initialBalance = tonumber(io.read())
local depositAmount = tonumber(io.read())

-- TODO: Utwórz nowy obiekt BankAccount z ownerName i initialBalance

-- TODO: Wpłać kwotę depositAmount

-- TODO: Wyświetl właściciela i saldo końcowe w wymaganym formacie
-- Format:
-- Właściciel: {ownerName}
-- Saldo: {finalBalance}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Lua online