Modül Örüntüleri ve En İyi Uygulamalar
Yerel M = {} örüntüsünü kullanın ve genel API'yi düzenli şekilde dışa açın.
Modül Örüntüleri ve En İyi Uygulamalar, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.
M = {} Deseni
Evrensel Lua modül deseni: bir yerel tablo bildirin, tabloyu doldurun ve döndürün. Herkese açık tüm simgeler M içine, tüm özel yardımcılar ise sıradan yerel değerlere konur. Bu yaklaşım açık, yalın ve her yerde çalışır.
-- The canonical module pattern
local M = {}
-- Private helper (not exported)
local function validate(x)
return type(x) == "number" and x >= 0
end
-- Public API
function M.sqrt(x)
assert(validate(x), "expected non-negative number")
return math.sqrt(x)
end
M.PI = math.pi
return MKendine Başvuran Modül
Bir modülün içindeki işlevler, diğer modül işlevlerini ada göre (M.foo()) veya yerel değerler olarak çağırabilir. Yerel değerleri kullanmak biraz daha hızlıdır; M.foo() kullanmak ise kullanıcıların M.foo değerini geçersiz kılmasına ve iç çağrının bu geçersiz kılmayı kullanmasına olanak tanır (maymun yamalama).
local M = {}
-- Option A: use M.foo inside (allows override)
function M.double(n) return M.multiply(n, 2) end
function M.multiply(a, b) return a * b end
-- Option B: use local function (faster, no override)
local function mul(a, b) return a * b end
function M.triple(n) return mul(n, 3) end
return MTekil Nesne Deseni
Bir modül tekil nesne gibi davranabilir: tüm çağıranlar tarafından paylaşılan, değiştirilebilir bir iç duruma sahip olur. require modülü önbelleğe aldığı için tüm require("mod") çağrıları aynı duruma sahip aynı nesneyi alır.
-- config.lua (singleton)
local M = {}
local _config = {env="dev", logLevel="info"}
function M.set(key, val)
_config[key] = val
end
function M.get(key)
return _config[key]
end
function M.load(t)
for k,v in pairs(t) do _config[k]=v end
end
return M
-- All callers share the same config:Ad Alanı Olarak Modül
Genel tabloyu kirletmemek için modülü yalnızca bir ad alanı olarak kullanın. İlişkili sabitleri ve yardımcı araçları, diğer dillerdeki paketler gibi tek bir ad altında gruplayın.
-- constants.lua
local M = {
HTTP = {
OK=200, CREATED=201, NO_CONTENT=204,
BAD_REQUEST=400, UNAUTHORIZED=401,
NOT_FOUND=404, SERVER_ERROR=500,
},
COLORS = {RED="#FF0000", GREEN="#00FF00", BLUE="#0000FF"},
MAX_RETRIES = 3,
TIMEOUT_SEC = 30,
}
return M
-- local C = require("constants")
-- if status == C.HTTP.NOT_FOUND then ...Üretici Modül
Sıradan bir tablo yerine üretici işlev dışa aktaran bir modüldür. Üretici, kendi özel durumlarına sahip yeni örnekler oluşturup döndürür. Bu, modül düzeyindeki sınıf desenidir.
-- logger.lua
local M = {}
function M.new(name, level)
level = level or "info"
local levels = {debug=1,info=2,warn=3,error=4}
local self = {}
function self.log(msgLevel, msg)
if levels[msgLevel] >= levels[level] then
print(string.format("[%s][%s] %s", name, msgLevel:upper(), msg))
end
end
function self.info(msg) self.log("info", msg) end
function self.warn(msg) self.log("warn", msg) end
function self.error(msg) self.log("error", msg) end
return self
end
return MModül Başlatma İşlevi
Bazı modüller kullanılmadan önce yapılandırma gerektirir. Yapılandırmayı modülün özel durumunda saklayan bir M.init(config) işlevi sağlayın. Bu, bağımlılık eklemeyi ve test edilebilirliği mümkün kılar.
-- db.lua
local M = {}
local pool = nil
function M.init(config)
pool = {
host = config.host or "localhost",
port = config.port or 5432,
connections = {},
}
print("DB initialized:", pool.host, pool.port)
end
function M.query(sql)
assert(pool, "call db.init() first")
-- ... execute query
return {}
end
return MDeğişmez Modül
Tüm yazma işlemlerini engellemek için __newindex kullanarak kullanıcıların modül API'sini yanlışlıkla değiştirmesini önleyin. Bu, yanlışlıkla yapılan maymun yamalamanın sorunlara yol açabileceği kitaplık modülleri için özellikle kullanışlıdır.
local function freeze(t)
return setmetatable({}, {
__index = t,
__newindex = function(_, k, _)
error("module is read-only, cannot set: " .. tostring(k), 2)
end
})
end
local M = {}
function M.add(a, b) return a + b end
function M.sub(a, b) return a - b end
return freeze(M)LDoc ile Belgeleme
Lua modüllerini belgelemede yaygın bir kural, --- ön ekine sahip LDoc tarzı açıklamalardır. Dil tarafından zorunlu tutulmasalar da bu açıklamalar, belge oluşturma araçlarının API belgelerini otomatik olarak üretmesini sağlar.
--- A utility module for string operations.
-- @module stringutils
local M = {}
--- Trim leading and trailing whitespace.
-- @param s string The input string.
-- @return string The trimmed string.
function M.trim(s)
return s:match("^%s*(.-)%s*$")
end
--- Count occurrences of a substring.
-- @param str string The string to search.
-- @param sub string The substring to count.
-- @return number Count of occurrences.
function M.count(str, sub)
local _, n = str:gsub(sub, "")
return n
end
return MModülleri Test Etme
Bir modülü gerektirip her işlevini çalıştırarak test edin. Basit bir test çalıştırıcısı veya Lua test çatısı olan busted kullanın. Testleri, modülün yolunu yansıtan ayrı bir dosyada tutun.
-- test/test_stringutils.lua
local su = require("stringutils")
local function test(name, fn)
local ok, err = pcall(fn)
if ok then print("[PASS] " .. name)
else print("[FAIL] " .. name .. ": " .. err)
end
end
test("trim removes spaces", function()
assert(su.trim(" hello ") == "hello")
end)
test("trim empty string", function()
assert(su.trim("") == "")
end)
test("count occurrences", function()
assert(su.count("banana", "a") == 3)
end)Modülleri Birleştirme
Karmaşık sistemler birden çok modülü birleştirir. Bir ana giriş noktası, alt modülleri gerektirip birbirine bağlar. Bu sorumluluk ayrımı, her modülün odaklanmış ve bağımsız olarak test edilebilir olmasını sağlar.
-- app.lua (main entry point)
local config = require("config")
local db = require("db")
local server = require("server")
-- Configure from environment
config.load({
dbHost = os.getenv("DB_HOST") or "localhost",
port = tonumber(os.getenv("PORT")) or 8080,
})
-- Wire modules together
db.init({host=config.get("dbHost"), port=5432})
server.init({port=config.get("port"), db=db})
server.start()Hızlı Kontrol
local M = {} ... return M modül deseninin temel amacı nedir?
Özet: Modül En İyi Uygulamaları
Özet:
- Her zaman
local M = {} ... return Mkullanın - Özel = dosya düzeyindeki yerel değerler; herkese açık = M alanları
- Tekil nesnede require, modül örneğini önbelleğe alır
- Örnek başına durum için üretici işlevler kullanın
- Değiştirmeyi önlemek için modülleri __newindex ile dondurun
- Ayrı dosyalarda test edin; --- açıklamalarıyla belgeleyin
Sıkça Sorulan Sorular
“Modül Örüntüleri ve En İyi Uygulamalar” dersi ücretsiz mi?
Evet — “Modül Örüntüleri ve En İyi Uygulamalar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.
“Modül Örüntüleri ve En İyi Uygulamalar” dersinde ne öğreneceğim?
Yerel M = {} örüntüsünü kullanın ve genel API'yi düzenli şekilde dışa açın. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Lua Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Modül Örüntüleri ve En İyi Uygulamalar” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- require İşlevi
- Bir Modül Dosyası Yazma
- package.path ve package.cpath
- Modül Örüntüleri ve En İyi Uygulamalar