검증 로직
Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 47번째.
지금까지 데이터 보호를 위한 다양한 방법을 살펴보았습니다. 명명 규칙은 의도를 나타내고, 클로저는 변수를 완전히 숨기며, 읽기 전용 테이블은 모든 수정을 방지합니다. 하지만 변경을 허용하되 유효한 변경만 허용하는, 그 중간 단계가 필요한 경우가 많습니다.
여기서 setter 메서드가 강력해집니다. 단순히 값을 할당하는 대신, setter는 새 값을 받아들이기 전에 그 값이 타당한지 확인할 수 있습니다:
local Person = {}
Person.__index = Person
function Person:new(name, age)
local obj = {
_name = name,
_age = age
}
setmetatable(obj, Person)
return obj
end
function Person:setAge(newAge)
if newAge < 0 then
print("Error: Age cannot be negative")
return
end
self._age = newAge
end누군가 person:setAge(-5)를 호출하면, 메서드는 잘못된 입력을 감지하고 업데이트를 거부합니다. 객체의 상태는 일관된 상태로 유지됩니다. 이러한 보호 기능이 없다면 잘못된 데이터가 프로그램을 조용히 손상시킬 수 있습니다. 음수 나이로 퇴직 급여를 계산한다고 상상해 보세요.
유효성 검사는 필요한 만큼 간단하거나 복잡할 수 있습니다. 범위를 확인하거나, 형식을 검증하거나, 값이 예상되는 형식과 일치하는지 확인할 수 있습니다. 핵심 원칙은 setter가 문지기 역할을 하여 타당한 데이터만 객체에 들어가도록 보장한다는 것입니다.
챌린지
쉬움검증 로직을 setter 메서드에 사용하여 health 및 level 특성을 보호하는 Player 클래스를 만들어 봅시다! 이렇게 하면 게임 캐릭터가 불가능한 능력치를 갖게 되는 일을 막을 수 있습니다.
코드를 두 파일로 구성합니다:
Player.lua: 적절한 검증을 통해 플레이어의 능력치를 관리하는 클래스를 만듭니다. 생성자:new(name)는 이름이 지정되고_health가100으로,_level이1로 설정된 플레이어를 초기화해야 합니다. 다음 메서드를 포함하세요::getName(): 플레이어의 이름을 반환합니다:getHealth(): 현재 health를 반환합니다:getLevel(): 현재 level을 반환합니다:setHealth(value): 값이 0 이상 100 이하인 경우에만 health를 업데이트합니다. 값이 유효하지 않으면Error: Health must be between 0 and 100을 출력하고 값을 변경하지 않습니다.:setLevel(value): 값이 1 이상인 경우에만 level을 업데이트합니다. 값이 유효하지 않으면Error: Level must be at least 1을 출력하고 값을 변경하지 않습니다.
main.lua: Player 모듈을 Require하고 플레이어 이름을 읽은 다음 setter를 테스트할 두 값을 읽습니다. 플레이어를 생성하고, 첫 번째 값으로 health를 설정해 보며, 두 번째 값으로 level을 설정해 본 다음 플레이어의 최종 능력치를 출력합니다.
세 개의 입력을 받습니다:
- 플레이어의 이름
- 설정해 볼 health 값(유효하거나 유효하지 않을 수 있는 숫자)
- 설정해 볼 level 값(유효하거나 유효하지 않을 수 있는 숫자)
출력에는 유효하지 않은 설정 시도의 오류 메시지가 표시된 다음 플레이어의 최종 능력치가 표시되어야 합니다:
Name: {name}
Health: {finalHealth}
Level: {finalLevel}예를 들어 입력이 Hero, -20, 5인 경우 출력은 다음과 같아야 합니다:
Error: Health must be between 0 and 100
Name: Hero
Health: 100
Level: 5health setter는 -20을 거부하여 health를 100으로 유지하고, level setter는 5를 유효한 값으로 허용했습니다.
입력이 Warrior, 75, 0인 경우 출력은 다음과 같아야 합니다:
Error: Level must be at least 1
Name: Warrior
Health: 75
Level: 1직접 해보기
-- Player 모듈을 불러옵니다
local Player = require('Player')
-- 입력을 읽습니다
local name = io.read()
local healthValue = tonumber(io.read())
local levelValue = tonumber(io.read())
-- TODO: 주어진 이름으로 새 플레이어를 생성합니다
-- TODO: 플레이어의 체력을 healthValue로 설정하려고 시도합니다
-- TODO: 플레이어의 레벨을 levelValue로 설정하려고 시도합니다
-- TODO: 다음 형식으로 플레이어의 최종 스탯을 출력합니다:
-- Name: {name}
-- Health: {finalHealth}
-- Level: {finalLevel}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러