0Pricing
Lua Academy · บทเรียน

การสร้าง DSL สำหรับการกำหนดค่า

สร้างภาษากำหนดค่าเชิงประกาศที่โหลดผ่าน dofile() ในแซนด์บ็อกซ์

การสร้าง DSL สำหรับการกำหนดค่า เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

เป้าหมาย: การกำหนดค่าแบบประกาศ

DSL สำหรับการกำหนดค่าช่วยให้ผู้ใช้แสดงการกำหนดค่าในรูปแบบที่อ่านง่ายและเป็นการประกาศ ขณะเดียวกันเบื้องหลังก็ยังใช้ความสามารถทั้งหมดของ Lua ได้ เช่น เงื่อนไข วนซ้ำ และฟังก์ชัน

รูปแบบฟังก์ชันการกำหนดค่า

เปิดให้ใช้ฟังก์ชัน config(tbl) เพื่อตรวจสอบและจัดเก็บการกำหนดค่า แล้วเรียกใช้ฟังก์ชันนี้ด้วยค่าตารางแบบลิเทอรัลเพื่อให้ไวยากรณ์กระชับและสะอาดตา

local function config(tbl)
  -- validate and store
  return tbl
end
-- config.lua:
return config {
  host = "localhost",
  port = 8080,
  debug = os.getenv("DEBUG") == "1",
}

การกำหนดค่าแบบซ้อนด้วยส่วนต่าง ๆ

รองรับส่วนที่ซ้อนกันเพื่อจัดระเบียบการกำหนดค่า

return config {
  database = { host="db.local", port=5432 },
  cache    = { host="cache.local", ttl=300 },
  logging  = { level="INFO", file="/var/log/app.log" },
}

ฟังก์ชันตัวช่วยในการกำหนดค่า

อนุญาตให้เรียกใช้ฟังก์ชันตัวช่วยภายในการกำหนดค่าเพื่อคำนวณค่า

local function env(name, default)
  return os.getenv(name) or default
end
return config {
  host  = env("DB_HOST", "localhost"),
  port  = tonumber(env("DB_PORT", "5432")),
}

การโหลดการกำหนดค่าในแซนด์บ็อกซ์

เพื่อความปลอดภัย ให้โหลดการกำหนดค่าในสภาพแวดล้อมแบบจำกัดที่อนุญาตให้ใช้เฉพาะฟังก์ชันตัวช่วยที่ปลอดภัย

local function loadConfig(path)
  local safeEnv = {
    config = config,
    env    = env,
    math   = math,
    table  = table,
  }
  local fn, err = loadfile(path, "t", safeEnv)
  if not fn then error(err) end
  return fn()
end

การตรวจสอบสคีมา

ตรวจสอบช่องข้อมูลและชนิดข้อมูลที่จำเป็นหลังจากโหลดแล้ว

local function validate(cfg)
  assert(type(cfg.host) == "string", "host must be string")
  assert(type(cfg.port) == "number", "port must be number")
  assert(cfg.port > 0 and cfg.port < 65536, "port out of range")
end
validate(loadConfig("config.lua"))

ค่าเริ่มต้น

ผสานการกำหนดค่าที่โหลดเข้ากับค่าเริ่มต้น เพื่อให้แน่ใจว่าคีย์ที่จำเป็นทั้งหมดมีค่า

local defaults = {host="localhost", port=8080, debug=false}
local function loadWithDefaults(path)
  local cfg = loadConfig(path)
  for k, v in pairs(defaults) do
    if cfg[k] == nil then cfg[k] = v end
  end
  return cfg
end

การแทนที่จากสภาพแวดล้อม

อนุญาตให้ตัวแปรสภาพแวดล้อมแทนที่ค่าจากไฟล์การกำหนดค่า ซึ่งจำเป็นสำหรับการออกแบบแอปตามแนวทาง 12-factor

การสืบทอดการกำหนดค่า

โหลดการกำหนดค่าพื้นฐานก่อน แล้วซ้อนทับด้วยการกำหนดค่าเฉพาะสภาพแวดล้อม เช่น การพัฒนา การจัดเตรียม และการใช้งานจริง

การกำหนดค่าที่เปลี่ยนแปลงไม่ได้

หลังจากโหลดแล้ว ให้ทำให้ตารางการกำหนดค่าไม่สามารถเปลี่ยนแปลงได้ด้วย __newindex ที่ทำให้เกิดข้อผิดพลาด เพื่อป้องกันการแก้ไขโดยไม่ตั้งใจขณะทำงาน

เอกสารอธิบายในการกำหนดค่า

ใช้ความคิดเห็นและชื่อคีย์ที่มีโครงสร้างเพื่อให้อธิบายตัวเองได้ DSL สำหรับการกำหนดค่าที่ออกแบบมาอย่างดีจะเข้าใจได้ด้วยตัวเองสำหรับทีม DevOps

คำถามเกี่ยวกับ DSL สำหรับการกำหนดค่า

เหตุใดจึงควรโหลดไฟล์การกำหนดค่าด้วย _ENV ในแซนด์บ็อกซ์

ทบทวน: การสร้าง DSL สำหรับการกำหนดค่า

เปิดให้ใช้ฟังก์ชัน config(tbl) รองรับส่วนที่ซ้อนกันและฟังก์ชันตัวช่วย โหลดในสภาพแวดล้อมแบบแซนด์บ็อกซ์ ตรวจสอบช่องข้อมูลและชนิดข้อมูลที่จำเป็น กำหนดค่าเริ่มต้น และอนุญาตให้ตัวแปรสภาพแวดล้อมแทนที่ค่าเพื่อให้สอดคล้องกับแนวทาง 12-factor

คำถามที่พบบ่อย

บทเรียน “การสร้าง DSL สำหรับการกำหนดค่า” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสร้าง DSL สำหรับการกำหนดค่า” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การสร้าง DSL สำหรับการกำหนดค่า”

สร้างภาษากำหนดค่าเชิงประกาศที่โหลดผ่าน dofile() ในแซนด์บ็อกซ์ คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การสร้าง DSL สำหรับการกำหนดค่า” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. หลักการออกแบบ DSL ใน Lua
  2. โอเวอร์โหลดตัวดำเนินการเพื่อการใช้ DSL อย่างคล่องแคล่ว
  3. การสร้าง DSL สำหรับการกำหนดค่า
  4. ตัวแยกวิเคราะห์นิพจน์อย่างง่าย
← กลับไปที่ Lua Academy