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
endThoạ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
endGiờ đâ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.
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ớpThermostattheo mẫu prototype tiêu chuẩn. Mỗi bộ điều nhiệt cần theo dõitemperaturehiệ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à10và tối đa là30
- Hàm khởi tạo
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ành10 - Nếu nhiệt độ mới trên
30, hãy đặt nhiệt độ thành30 - 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:
- Nhiệt độ đầu tiên cần đặt
- Nhiệt độ thứ hai cần đặt
Trong tệp chính, hãy tạo một bộ điều nhiệt, sau đó:
- In ra nhiệt độ ban đầu
- Đặt nhiệt độ thành giá trị đầu vào thứ nhất rồi in ra kết quả
- Đặ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
30Hã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ả
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
1Khái niệm “self”
Bảng với hàm“self” tường minhCú pháp dấu hai chấmDấu chấm và dấu hai chấmÔn tập: Điểm chuyển động4Dự án: Ngân hàng số
Thiết lập dự ánPhương thức nạp tiền2Mẫu Prototype cho lớp
Khái niệm PrototypeLiên kết bằng __indexHàm khởi tạo :new()Khởi tạo thuộc tínhCác instance độc lậpÔn tập: Nhà máy ô tô5Nạp chồng toán tử trong OOP
Cộng các đối tượngTrừ các đối tượngNối các đối tượngSo sánh các đối tượng (<, >)Ôn tập: phép tính với ví tiền8Đóng gói
Quy ước đặt tênClosure để bảo mậtTruy cập qua closureBảng chỉ đọcLogic kiểm tra hợp lệTổng kết: Két an toàn11Mẫu thiết kế (cơ bản)
Hàm tạo đối tượngBảng SingletonMẫu IteratorObserver (Listener)Ôn tập: Factory Logger3Trạng thái và hành vi của đối tượng
Biến instancePhương thức getterPhương thức setterThuộc tính tính toánĐịnh dạng chuỗiKiểm tra tính bằng nhauÔn tập: điểm số học sinh6Cơ bản về kế thừa
Thiết lập kế thừaKế thừa phương thứcMở rộng hàm khởi tạoThêm phương thức cho lớp conDùng chung và riêngÔn tập: hệ phân cấp hình dạngTự luyện tập: Trình biên dịch Lua online