Menu
Coddy logo textTech

Metody ustawiające

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

Metody pobierające umożliwiają odczyt wewnętrznych danych za pomocą kontrolowanego punktu dostępu. Metody ustawiające (nazywane także metodami modyfikującymi) działają odwrotnie. Zapewniają kontrolowany sposób na modyfikowanie stanu wewnętrznego.

Zamiast bezpośrednio przypisywać car.speed = 50, wywołujesz car:setSpeed(50):

local Car = {}
Car.__index = Car

function Car:new()
    local instance = {}
    setmetatable(instance, self)
    instance.speed = 0
    return instance
end

function Car:setSpeed(newSpeed)
    self.speed = newSpeed
end

function Car:getSpeed()
    return self.speed
end

Na pierwszy rzut oka wydaje się, że to dodatkowa praca, która daje ten sam rezultat. Settery stają się jednak przydatne, gdy później trzeba dodać reguły. Wyobraź sobie, że chcesz mieć pewność, że prędkość nigdy nie będzie ujemna ani nie przekroczy maksimum:

function Car:setSpeed(newSpeed)
    if newSpeed < 0 then
        self.speed = 0
    elseif newSpeed > 200 then
        self.speed = 200
    else
        self.speed = newSpeed
    end
end

Teraz każda zmiana prędkości przechodzi przez logikę walidacji. Każdy kod używający :setSpeed() automatycznie korzysta z tych kontroli bez modyfikacji. Na tym polega prawdziwa wartość setterów. Tworzą one jeden punkt, w którym kontrolujesz sposób zmiany danych, dzięki czemu Twoje obiekty są bezpieczniejsze i łatwiejsze w utrzymaniu.

challenge icon

Wyzwanie

Łatwy

Zbudujmy klasę Thermostat, która używa metod ustawiających do inteligentnego kontrolowania temperatury. Zamiast dopuszczać dowolną wartość temperatury, termostat będzie wymuszać rozsądne limity, utrzymując temperaturę w komfortowym zakresie.

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

  • Thermostat.lua: Zdefiniuj klasę Thermostat przy użyciu standardowego wzorca prototypowego. Każdy termostat powinien śledzić bieżącą temperature. Uwzględnij:
    • Konstruktor :new(), który ustawia początkową temperaturę na 20 (komfortową wartość domyślną)
    • Getter :getTemperature(), który zwraca bieżącą temperaturę
    • Setter :setTemperature(newTemp), który aktualizuje temperaturę, ale utrzymuje ją w określonych granicach: minimum 10 i maksimum 30
  • main.lua: Zaimportuj moduł Thermostat i utwórz instancję termostatu. Użyj settera, aby spróbować różnych zmian temperatury i zaobserwuj, jak wymuszane są limity.

Metoda :setTemperature() powinna wymuszać następujące zasady:

  • Jeśli nowa temperatura jest niższa niż 10, ustaw ją na 10
  • Jeśli nowa temperatura jest wyższa niż 30, ustaw ją na 30
  • W przeciwnym razie ustaw ją na żądaną wartość

Otrzymasz dwa dane wejściowe:

  1. Pierwsza temperatura do ustawienia
  2. Druga temperatura do ustawienia

W pliku głównym utwórz termostat, a następnie:

  1. Wyświetl początkową temperaturę
  2. Ustaw temperaturę na wartość pierwszego wejścia i wyświetl wynik
  3. Ustaw temperaturę na wartość drugiego wejścia i wyświetl wynik

Wyświetl każdą temperaturę w osobnym wierszu (samą liczbę).

Na przykład, jeśli danymi wejściowymi są 25 i 50, wynikiem powinno być:

20
25
30

Zauważ, że druga próba ustawienia wartości 50 daje w wyniku 30: setter automatycznie wymusza maksymalny limit!

Spróbuj swoich sił

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

-- Odczytaj dane wejściowe
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())

-- TODO: Utwórz instancję termostatu

-- TODO: Wypisz początkową temperaturę

-- TODO: Ustaw temperaturę na temp1 i wypisz wynik

-- TODO: Ustaw temperaturę na temp2 i wypisz wynik
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