0Pricing
Lua Academy · Ders

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 M

Kendine 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 M

Tekil 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 M

Modü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 M

Değ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 M

Modü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 M kullanı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

  1. require İşlevi
  2. Bir Modül Dosyası Yazma
  3. package.path ve package.cpath
  4. Modül Örüntüleri ve En İyi Uygulamalar
← Lua Academy Sayfasına Dön