Menu
CoddyTech

Phương thức setter

Thuộc phần Lập trình hướng đối tượng trong hành trình Lua của Coddy. Bài học 14 trên 70.

Các phương thức getter cho phép bạn đọc dữ liệu nội bộ thông qua một điểm truy cập có kiểm soát. Phương thức setter (còn gọi là phương thức mutator) làm điều ngược lại. Chúng cung cấp cách thức có kiểm soát để thay đổi trạng thái nội bộ.

Thay vì gán trực tiếp car.speed = 50, bạn gọi 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

Thoạt nhìn, việc này có vẻ như tốn thêm công sức mà vẫn cho cùng kết quả. Nhưng các phương thức thiết lập (setter) trở nên hữu ích khi sau này bạn cần thêm quy tắc. Hãy tưởng tượng bạn muốn đảm bảo tốc độ không bao giờ âm hoặc vượt quá mức tối đa:

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

Giờ đây, mọi thay đổi về tốc độ đều tuân theo logic kiểm tra hợp lệ của bạn. Bất kỳ đoạn code nào dùng :setSpeed() đều tự động được hưởng lợi từ các bước kiểm tra này mà không cần sửa đổi. Đây chính là giá trị thực sự của các phương thức setter. Chúng tạo ra một điểm duy nhất để bạn kiểm soát cách dữ liệu thay đổi, giúp các đối tượng an toàn hơn và dễ bảo trì hơn.

challenge icon

Thử thách

Dễ

Hãy tạo một lớp Thermostat dùng các phương thức setter để điều chỉnh nhiệt độ một cách thông minh. Thay vì cho phép mọi giá trị nhiệt độ, bộ điều nhiệt sẽ áp dụng các giới hạn hợp lý, giữ nhiệt độ trong phạm vi thoải mái.

Bạn sẽ sắp xếp code trong hai tệp:

  • Thermostat.lua: Định nghĩa lớp Thermostat theo mẫu prototype tiêu chuẩn. Mỗi bộ điều nhiệt cần theo dõi temperature hiện tại. Bao gồm:
    • Hàm khởi tạo :new() để đặt nhiệt độ ban đầu là 20 (mức mặc định dễ chịu)
    • Getter :getTemperature() để trả về nhiệt độ hiện tại
    • Setter :setTemperature(newTemp) để cập nhật nhiệt độ nhưng vẫn giữ nhiệt độ trong giới hạn: tối thiểu là 10 và tối đa là 30
  • main.lua: Nạp module Thermostat và tạo một instance bộ điều nhiệt. Dùng setter để thử thay đổi nhiệt độ nhiều lần và quan sát cách các giới hạn được áp dụng.

Phương thức :setTemperature() cần áp dụng các quy tắc sau:

  • Nếu nhiệt độ mới dưới 10, hãy đặt nhiệt độ thành 10
  • Nếu nhiệt độ mới trên 30, hãy đặt nhiệt độ thành 30
  • Nếu không, hãy đặt nhiệt độ thành giá trị được yêu cầu

Bạn sẽ nhận hai đầu vào:

  1. Nhiệt độ đầu tiên cần đặt
  2. Nhiệt độ thứ hai cần đặt

Trong tệp chính, hãy tạo một bộ điều nhiệt, sau đó:

  1. In ra nhiệt độ ban đầu
  2. Đặt nhiệt độ thành giá trị đầu vào thứ nhất rồi in ra kết quả
  3. Đặt nhiệt độ thành giá trị đầu vào thứ hai rồi in ra kết quả

In mỗi nhiệt độ trên một dòng riêng (chỉ in số).

Ví dụ, nếu đầu vào là 25 và 50, đầu ra sẽ là:

20
25
30

Hãy chú ý, lần thử đặt 50 thứ hai cho kết quả là 30: setter tự động áp dụng giới hạn tối đa!

Tự làm thử

-- Nạp module Thermostat
local Thermostat = require('Thermostat')

-- Đọc đầu vào
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())

-- TODO: Tạo một instance của Thermostat

-- TODO: In ra nhiệt độ ban đầu

-- TODO: Đặt nhiệt độ thành temp1 và in ra kết quả

-- TODO: Đặt nhiệt độ thành temp2 và in ra kết quả
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Lua online