Powtórka — menedżer użytkowników
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 68 z 70.
Wyzwanie
ŁatwyZbudujmy system zarządzania użytkownikami: praktyczną aplikację, którą można znaleźć w wielu programach używanych na co dzień! Utworzysz dwie współpracujące ze sobą klasy: jedną reprezentującą poszczególnych użytkowników, a drugą efektywnie zarządzającą ich kolekcją.
Rozmieścisz swój kod w trzech plikach:
User.lua: Utwórz klasę User reprezentującą pojedynczego użytkownika w systemie. Każdy użytkownik maidiname. Dodaj metodę:getInfo(), która zwraca ciąg znaków w formacie"ID: {id}, Name: {name}".UserManager.lua: Zbuduj klasę menedżera, która obsługuje kolekcję użytkowników. Zastanów się, jak przechowywać użytkowników, aby wyszukiwanie było efektywne: użycie ID użytkownika jako klucza w tablicy znacznie ułatwia znajdowanie i usuwanie użytkowników w porównaniu z przeszukiwaniem listy. Twój menedżer potrzebuje::addUser(user): dodaje obiekt User do kolekcji:removeUser(id): usuwa użytkownika na podstawie jego ID:findUser(id): zwraca obiekt User o pasującym ID albonil, jeśli nie zostanie znaleziony:listUsers(): wypisuje informacje o wszystkich użytkownikach, po jednym w wierszu
main.lua: Połącz wszystko w całość! Utwórz obiekt UserManager, dodaj użytkowników na podstawie otrzymanych danych wejściowych, wykonaj operacje i wyświetl wyniki.
Otrzymasz pięć danych wejściowych:
- ID pierwszego użytkownika (liczba)
- Imię pierwszego użytkownika
- ID drugiego użytkownika (liczba)
- Imię drugiego użytkownika
- ID użytkownika, którego należy wyszukać (liczba)
W głównym pliku:
- Utwórz obiekt UserManager i dodaj obu użytkowników
- Wywołaj
:listUsers(), aby wypisać wszystkich użytkowników - Usuń pierwszego użytkownika (używając pierwszego ID)
- Wypisz
"After removal:" - Ponownie wywołaj
:listUsers() - Wyszukaj użytkownika o ID z piątego wejścia; jeśli zostanie znaleziony, wypisz jego informacje, a jeśli nie, wypisz
"User not found"
Na przykład, jeśli danymi wejściowymi są 101, Alice, 102, Bob i 102, wynikiem powinno być:
ID: 101, Name: Alice
ID: 102, Name: Bob
After removal:
ID: 102, Name: Bob
ID: 102, Name: BobJeśli danymi wejściowymi są 201, Charlie, 202, Diana i 201, wynikiem powinno być:
ID: 201, Name: Charlie
ID: 202, Name: Diana
After removal:
ID: 202, Name: Diana
User not foundZauważ, że w drugim przykładzie, po usunięciu użytkownika 201 (Charlie), wyszukanie tego ID zwraca "User not found", ponieważ użytkownika nie ma już w systemie!
Spróbuj swoich sił
-- main.lua: Połącz wszystko w całość
local User = require('User')
local UserManager = require('UserManager')
-- Odczytaj dane wejściowe
local id1 = tonumber(io.read())
local name1 = io.read()
local id2 = tonumber(io.read())
local name2 = io.read()
local searchId = tonumber(io.read())
-- TODO: Utwórz instancję UserManager
-- TODO: Utwórz dwa obiekty User na podstawie danych wejściowych
-- TODO: Dodaj obu użytkowników do menedżera
-- TODO: Wywołaj listUsers(), aby wyświetlić wszystkich użytkowników
-- TODO: Usuń pierwszego użytkownika (używając id1)
-- TODO: Wyświetl "After removal:"
-- TODO: Ponownie wywołaj listUsers()
-- TODO: Wyszukaj użytkownika o identyfikatorze searchId
-- Jeśli użytkownik zostanie znaleziony, wyświetl jego dane; w przeciwnym razie wyświetl "User not found"
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ów9Kompozycja i mixiny
Relacja Has-ADelegowanieProste mixinyStosowanie wielu mixinówMixiny a dziedziczeniePodsumowanie — składanie robota12Końcowe wyzwania
Powtórka — system magazynowyPowtórka — menedżer użytkownikówPowtórka — śledzenie wynikówKońcowy sprawdzian z OOPPoćwicz samodzielnie: Kompilator Lua online