개요
이 문서는: Roblox 공식 문서(Roblox Lua Style Guide)를 참고합니다.
본 문서는 팀 내에서 코드 리뷰와 협업 시 발생할 수 있는 스타일 관련 논쟁을 최소화하고, 읽기 좋은 코드를 작성하기 위한 원칙을 안내합니다. 빠른 작성보다는 읽기 쉽고 유지 보수하기 좋은 코드 작성에 집중해주세요.
스크립트
코드 순서
코드는 아래 항목들을 가능한 경우 다음 순서대로 포함합니다. 항목이 필요 없다면 생략합니다.
- 주석 지시어
파일 최상단에
--!native,--!nolint등과 같은 주석 지시어를 둡니다.
--!strict 는 대부분의 경우에 적지 않습니다, --!nonstrcit 가 기본이기 때문.
- 코드 설명 블록 주석
해당 파일이 존재하는 이유나 기능을 간단히 설명합니다, 생략 가능. 파일명, 작성자, 날짜 등의 메타 정보는 버전 관리 시스템에서 충분히 파악 가능하므로 기재하지 않습니다.
만약 API 문서로 작성할 경우, 문서 주석으로 작성합니다. 자세한 것은 주석 기반 문서 참고.
- 서비스
game:GetService("...")호출부를 모아서 적습니다.
예시:
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-
Require Require 블록의 순서, alias 사용법, 별칭 정리는 require-style 문서에서 세부적으로 정의합니다. 외부 패키지 → 공통 조상 → 내부 모듈 순으로 블록을 구성하고, 모든 경로는 문자열 literal alias 를 사용한 뒤 상수와 함수를 선언합니다.
-
상수
-
변수와 함수
-
현재 모듈이 반환하는 오브젝트
-
Return 최종적으로 이 스크립트(모듈)가 반환할 값(테이블, 함수, 클래스 등).
RunContext
LocalScript와 Script를 굳이 폴더나 구조 상으로 구분하기보다는,
Script의 RunContext를 활용해 동일한 폴더(혹은 패키지) 내에서 관리하기를 권장합니다.
이렇게 하면 스크립트 파일의 수가 불필요하게 늘어나지 않고, 프로젝트 구조가 단순해집니다.
모듈 스크립트
- 종속성을 정적으로 만들기 위해, 일반적으로 스크립트의 맨 위에서
require문을 모두 선언합니다. - 모듈의 이름을 해당 변수의 이름과 동일하게 맞추는 것이 권장됩니다.
require
Require 블록 구성, 정렬, 외부 라이브러리 별칭 규칙은 require-style 문서에서 전부 관리합니다. 이 문서에서는 해당 규칙을 따라 파일 상단에 모든 require 호출을 모으고, 별칭 블록 이후에만 일반 지역 상수나 변수를 선언한다는 점을 기억하세요.
패키지 구조
- 패키지는 외부에서 소비될 API를 정의하는 모듈입니다.
- 일반적으로 최상위 레벨 테이블이 여러 모듈을 require한 후, 이들을 모아서 최종적으로 반환합니다.
- 소비자 입장에서는 최상위 패키지만 require하고, 필요한 서브 모듈을 패키지 객체에서 꺼내 쓰는 방식을 선호합니다.
-- 패키지 내부 (예: MyLibrary/Foo.lua)
local MyLibrary = script.Parent
local MyModule = require("./MyModule")
...
return Foo
-- 패키지를 사용하는 곳
local MyLibrary = require("@Some/MyLibrary")
local MyModule = require("@Some/MyLibrary/MyModule")
예시 구조
MyProject
|- FooBar
| |- Foo.lua
| |- Bar.lua
|- MyClass.lua
|- Packages
| |- Baz.lua
| | |- Bazifyer.lua
| | |- UnBazifyer.lua
-- 예: MyClass.lua
-- 파일 구조에 따른 Require 블록
-- 1. 공통 조상 정의
local MyProject = script.Parent
-- 2. 모든 임포트된 패키지의 블록
local Baz = require("@Packages/Baz")
-- 3. 패키지에 있는 항목들을 정의한 블록
local Bazifyer = Baz.Bazifyer
local UnBazifyer = Baz.UnBazifyer
-- 4. 같은 프로젝트의 모듈들의 블록
local Foo = require("./FooBar/Foo")
local Bar = require("./FooBar/Bar")
-- ...
return MyClass
코드
인덴트
인덴트는 Space 가 아닌, 무조건 Tab 으로 처리해야합니다. Tab 간격은 4칸을 사용합니다.