Lua Academy · पाठ

मिक्सिन पैटर्न

कई स्रोत टेबल से मेथड कॉपी करके व्यवहार को संयोजित करें।

पाठ 3, कुल 4 में से12 चरण

मिक्सिन पैटर्न, CoddyKit पर Lua Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Lua Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Lua Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

मिक्सिन क्या है

मिक्सिन विधियों की एक तालिका होती है, जिसे कई वर्गों में कॉपी किया जा सकता है। वंशागति के विपरीत, मिक्सिन किसी अभिभावक-बालक संबंध को स्थापित किए बिना व्यवहार जोड़ते हैं। एक वर्ग कई मिक्सिन से व्यवहारों को जोड़ सकता है।

local Flyable={}
function Flyable:fly()
  print(self.name.." is flying!")
end
function Flyable:land()
  print(self.name.." landed.")
end

local Bird={} Bird.__index=Bird
-- Mix in Flyable
for k,v in pairs(Flyable) do Bird[k]=v end

function Bird.new(name)
  return setmetatable({name=name},Bird)
end
Bird.new("Eagle"):fly()

एकाधिक मिक्सिन

सरल हिस्सों से जटिल व्यवहार बनाने के लिए एक ही वर्ग पर कई मिक्सिन लागू कीजिए। इसे क्षैतिज संयोजन कहते हैं — प्रत्येक मिक्सिन स्वतंत्र होता है।

local Serializable={}
function Serializable:toCSV(fields)
  local row={}
  for _,f in ipairs(fields) do row[#row+1]=tostring(self[f]) end
  return table.concat(row,",")
end

local Loggable={}
function Loggable:log(msg)
  print("["..os.date("%H:%M").."]["..self.name.."] "..msg)
end

local Entity={} Entity.__index=Entity
for k,v in pairs(Serializable) do Entity[k]=v end
for k,v in pairs(Loggable) do Entity[k]=v end

function Entity.new(n,v) return setmetatable({name=n,value=v},Entity) end
local e=Entity.new("item",42)
e:log("created"); print(e:toCSV({"name","value"}))

मिक्सिन के टकराव

जब दो मिक्सिन एक ही विधि-नाम परिभाषित करते हैं, तो बाद में लागू किया गया मिक्सिन प्रभावी होता है। किस मिक्सिन का संस्करण रखना है, यह स्पष्ट रूप से चुनकर या दोनों को कॉल करने के लिए उन्हें रैप करके टकरावों का समाधान कीजिए।

local A={speak=function(self) print(self.name.." (A)") end}
local B={speak=function(self) print(self.name.." (B)") end}

local C={} C.__index=C
for k,v in pairs(A) do C[k]=v end
for k,v in pairs(B) do C[k]=v end  -- B.speak overwrites A.speak

-- Explicit resolution:
local origA, origB = A.speak, B.speak
function C:speak() origA(self); origB(self) end  -- call both

local c=setmetatable({name="X"},C)
c:speak()

include() सहायक

एक सहायक फ़ंक्शन मिक्सिन लागू करने को अधिक सुव्यवस्थित बनाता है: include(Class, Mixin) मिक्सिन की विधियों को वर्ग में कॉपी करता है और पहले से मौजूद फ़ील्ड को छोड़ देता है, इसलिए मौजूदा विधियाँ अधिलेखित नहीं होतीं।

local function include(cls, mixin)
  for k, v in pairs(mixin) do
    if cls[k] == nil then
      cls[k] = v
    end
  end
  return cls
end

local Comparable={
  equals=function(a,b) return a:compareTo(b)==0 end,
  lt=function(a,b) return a:compareTo(b)<0 end,
}

local Temp={} Temp.__index=Temp
include(Temp, Comparable)
function Temp.new(c) return setmetatable({c=c},Temp) end
function Temp:compareTo(other) return self.c-other.c end

local a,b=Temp.new(100),Temp.new(50)
print(b.lt and b:lt(a))  -- true (b < a)

स्थिति वाला मिक्सिन

प्रति-इंस्टेंस स्थिति की आवश्यकता वाले मिक्सिन उसे अपनी आरंभीकरण फ़ंक्शन में प्रारंभ करते हैं। वर्ग का कन्स्ट्रक्टर मिक्सिन के आरंभीकरण फ़ंक्शनों को कॉल करके इंस्टेंस पर प्रत्येक मिक्सिन की स्थिति तैयार करता है।

local Observable={}
function Observable._init(self)
  self._listeners={}
end
function Observable:on(event,fn)
  self._listeners[event]=self._listeners[event] or {}
  self._listeners[event][#self._listeners[event]+1]=fn
end
function Observable:emit(event,...)
  for _,fn in ipairs(self._listeners[event] or {}) do fn(...) end
end

local Button={} Button.__index=Button
for k,v in pairs(Observable) do Button[k]=v end

function Button.new(label)
  local self=setmetatable({label=label},Button)
  Observable._init(self)
  return self
end

local btn=Button.new("OK")
btn:on("click",function() print("Clicked!") end)
btn:emit("click")

मिक्सिन मॉड्यूल

मिक्सिन के व्यवहार को अलग-अलग मॉड्यूल फ़ाइलों में पैकेज कीजिए। उन्हें वर्ग मॉड्यूल में आवश्यक कीजिए और लागू कीजिए। इससे प्रत्येक व्यवहार-संबंधी चिंता अपनी फ़ाइल में रहती है और कोडबेस व्यवस्थित रहता है।

-- In a real project:
-- local Loggable = require("mixins.loggable")
-- local Cacheable = require("mixins.cacheable")
-- local MyClass = {}
-- for k,v in pairs(Loggable) do MyClass[k]=v end
-- for k,v in pairs(Cacheable) do MyClass[k]=v end

local TimestampMixin={}
function TimestampMixin:setCreated() self.createdAt=os.time() end
function TimestampMixin:age() return os.time()-self.createdAt end

local Record={} Record.__index=Record
for k,v in pairs(TimestampMixin) do Record[k]=v end
function Record.new(data)
  local self=setmetatable(data or {},Record)
  self:setCreated()
  return self
end
print(Record.new({}).createdAt>0)

भूमिका-आधारित मिक्सिन

मिक्सिन फ़ंक्शनों को चुनिंदा रूप से लागू करके रनटाइम पर ऑब्जेक्ट को भूमिकाएँ दीजिए। इससे व्यवहार वर्ग-आधारित होने के बजाय प्रति-इंस्टेंस कॉन्फ़िगर किया जा सकता है।

local Roles={}
Roles.admin={deleteUser=function(self) print(self.name.." deletes user") end}
Roles.editor={editPost=function(self) print(self.name.." edits post") end}
Roles.viewer={viewPost=function(self) print(self.name.." views post") end}

local User={} User.__index=User
function User.new(name,...)
  local self=setmetatable({name=name},User)
  for _,role in ipairs({...}) do
    for k,v in pairs(Roles[role] or {}) do self[k]=v end
  end
  return self
end

local alice=User.new("Alice","admin","editor")
alice:deleteUser(); alice:editPost()

मिक्सिन के अनुप्रयोग की जाँच

किसी वर्ग पर लागू किए गए मिक्सिन का रिकॉर्ड एक सेट से रखिए। इससे उन्हें दोबारा लागू करने से बचा जा सकता है और वर्ग की क्षमताओं का निरीक्षण किया जा सकता है।

local function applyMixin(cls, mixin, name)
  cls._mixins = cls._mixins or {}
  if cls._mixins[name] then return end  -- already applied
  for k,v in pairs(mixin) do
    if k~="_init" then cls[k]=cls[k] or v end
  end
  cls._mixins[name] = true
end

local Fly={fly=function(self) print(self.name.." flies") end}
local Bird={} Bird.__index=Bird
applyMixin(Bird,Fly,"Fly")
applyMixin(Bird,Fly,"Fly")  -- no-op, already applied
print(Bird._mixins.Fly)  -- true

मिक्सिन बनाम वंशागति बनाम संयोजन

संयोजन की तीन शैलियाँ हैं: वंशागति (यह-है, कठोर पदानुक्रम), मिक्सिन (विधियों की कॉपी, सपाट संरचना), और संयोजन (इसके-पास-है, प्रत्यायोजन)। संबंध के आधार पर चुनिए: animal CAN creature नहीं, बल्कि animal IS-A creature (वंशागति), creature CAN fly (मिक्सिन), car HAS engine (संयोजन)।

-- Inheritance: "is-a"
-- local Dog = extends(Animal)

-- Mixin: "can-do"
-- include(Dog, Swimmable)

-- Composition: "has-a"
-- local Dog = {}
-- function Dog.new()
--   return {collar=Collar.new(),chip=Chip.new()}
-- end

print("Pick the right tool for the relationship")

मिक्सिन टेम्पलेट

एक मानक मिक्सिन टेम्पलेट में मिक्सिन तालिका की विधियाँ, प्रति-इंस्टेंस स्थिति के लिए एक वैकल्पिक _init, और टकराव का पता लगाने के लिए एक नाम फ़ील्ड होता है। एकसमान पैटर्न का पालन करने से मिक्सिन अलग-अलग परियोजनाओं में संयोज्य बने रहते हैं।

-- Standard mixin template:
local EventMixin = {}
EventMixin._name = "EventMixin"

function EventMixin._init(self)
  self._events = {}
end

function EventMixin:on(e, fn)
  self._events[e] = self._events[e] or {}
  self._events[e][#self._events[e]+1] = fn
end

function EventMixin:trigger(e, ...)
  for _, fn in ipairs(self._events[e] or {}) do fn(...) end
end

-- return EventMixin
print("EventMixin ready for use")

मिक्सिन प्रश्न

आप किसी वर्ग पर मिक्सिन कैसे लागू करते हैं?

पुनरावृत्ति: मिक्सिन पैटर्न

मिक्सिन स्रोत तालिका से विधियों को लक्ष्य वर्ग में कॉपी करते हैं और वंशागति के बिना व्यवहारों को संयोजित करते हैं। इनका उपयोग क्रमांकन, लॉगिंग और इवेंट प्रबंधन जैसी कई हिस्सों को प्रभावित करने वाली चिंताओं के लिए कीजिए।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Lua सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
40
पाठ
159

अक्सर पूछे जाने वाले प्रश्न

क्या “मिक्सिन पैटर्न” पाठ निःशुल्क है?

हाँ — Lua Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “मिक्सिन पैटर्न” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Lua Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“मिक्सिन पैटर्न” में मैं क्या सीखूँगा?

कई स्रोत टेबल से मेथड कॉपी करके व्यवहार को संयोजित करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Lua Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Lua Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Lua Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“मिक्सिन पैटर्न” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Lua Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Lua Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. __index चेनिंग से एकल इनहेरिटेंस
  2. super से पैरेंट मेथड कॉल करना
  3. मिक्सिन पैटर्न
  4. ओवरराइडिंग और बहुरूपता
← Lua Academy पर वापस जाएँ