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
endPodkreś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.
Wyzwanie
ŁatwyZbudujmy 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:
- Imię i nazwisko właściciela
- Początkowe saldo (liczba)
- 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: 650Pamię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}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Koncepcja „self”
Tabele z funkcjamiJawne „self”Składnia z dwukropkiemKropka czy dwukropekPodsumowanie — poruszający się punkt4Projekt: Bank cyfrowy
Konfiguracja projektuMetoda wpłaty7Polimorfizm i nadpisywanie
Nadpisywanie metodWywoływanie metod klasy nadrzędnejTypowanie kaczeWspólny interfejsSprawdzanie typuPodsumowanie — role pracowników10Projekt: Menedżer kształtów
Konfiguracja projektuKlasa prostokątaKlasa kołaMetoda obwoduKolekcja kształtówPole całkowiteFiltrowanie kształtów2Wzorzec prototypu klasy
Koncepcja prototypuŁączenie za pomocą __indexKonstruktor :new()Inicjalizacja atrybutówNiezależne instancjePodsumowanie – fabryka samochodów5Przeciążanie operatorów w OOP
Dodawanie obiektówOdejmowanie obiektówŁączenie obiektówPorównywanie obiektów (<, >)Powtórka — działania na portfelu8Hermetyzacja
Konwencje nazewnictwaDomknięcia dla prywatnościDostęp za pomocą domknięćTabele tylko do odczytuLogika walidacjiPodsumowanie — bezpieczny sejf11Wzorce projektowe (podstawy)
Funkcje fabrykująceTabela SingletonWzorzec iteratoraObserwator (nasłuchujący)Powtórka — fabryka loggera3Stan i zachowanie obiektu
Zmienne instancjiMetody dostępoweMetody ustawiająceWłaściwości obliczaneFormatowanie ciągów znakówSprawdzanie równościPodsumowanie – ocena ucznia6Podstawy dziedziczenia
Konfiguracja dziedziczeniaDziedziczenie metodRozszerzanie konstruktoraDodawanie metod potomnychWspólne i unikalne elementyPowtórka — hierarchia kształtówPoćwicz samodzielnie: Kompilator Lua online