Mixins simples
Fait partie de la section Programmation orientée objet du Journey Lua de Coddy. Leçon 51 sur 70.
La composition vous permet de placer des objets dans d’autres objets. Mais que faire si vous voulez partager un comportement entre des classes sans lien entre elles ?
Un Player et un MenuItem peuvent tous deux avoir besoin d’une méthode :describe(), mais ils n’ont pas de classe parente commune. C’est là que les mixins entrent en jeu.
Un mixin est simplement une table contenant des fonctions. Tu « mélanges » ces fonctions à une classe en les copiant :
local Printable = {}
function Printable:describe()
print("Object: " .. tostring(self))
end
function Printable:log(message)
print("[LOG] " .. message)
endPour appliquer ce mixin à une classe, vous copiez chaque fonction de la table du mixin dans la table de la classe :
local function applyMixin(class, mixin)
for key, value in pairs(mixin) do
class[key] = value
end
end
local Player = {}
Player.__index = Player
applyMixin(Player, Printable) -- Player possède maintenant :describe() et :log()Après avoir appliqué le mixin, toute instance de Player peut appeler ces méthodes comme si elles étaient définies directement dans la classe :
local p = setmetatable({}, Player)
p:log("Player created") -- [LOG] Player crééContrairement à l’héritage, les mixins ne créent pas de relation parent-enfant. Tu copies simplement des fonctions d’une table à une autre.
Cela rend les mixins parfaits pour partager des comportements utilitaires, comme la journalisation, la sérialisation ou des méthodes de description, entre des classes qui n’ont autrement rien en commun.
Défi
FacileCréons un système d’étiquetage à l’aide de mixins ! Tu vas créer un mixin Taggable qui peut être appliqué à n’importe quelle classe et qui donne aux objets la capacité de gérer une collection d’étiquettes, utile pour classer des éléments, des publications ou toute entité qui a besoin d’étiquettes.
Tu vas répartir ton code dans trois fichiers :
Taggable.lua: crée une table de mixin contenant deux méthodes ::addTag(tag): ajoute une étiquette àself.tags(en supposant que la table existe):listTags(): affiche toutes les étiquettes au formatTags: tag1, tag2, tag3(ouTags: nonesi elle est vide)
Article.lua: crée une classe Article avec un constructeur:new(title)qui stocke le titre et initialise une tabletagsvide. Inclue une méthode:getTitle()qui renvoie le titre de l’article.main.lua: écris ici la fonction utilitaireapplyMixin, puis applique le mixin avecapplyMixin(Article, Taggable)pour donner aux instances d’Article des capacités d’étiquetage. Lis ensuite les entrées correspondant au titre d’un article et à deux étiquettes. Crée un Article, ajoute-lui les deux étiquettes, affiche le titre et liste toutes les étiquettes.
Tu recevras trois entrées :
- Le titre de l’article (une chaîne de caractères)
- La première étiquette à ajouter (une chaîne de caractères)
- La deuxième étiquette à ajouter (une chaîne de caractères)
Ta sortie doit afficher le titre de l’article suivi de ses étiquettes :
Title: {title}
Tags: {tag1}, {tag2}Par exemple, si les entrées sont Lua Basics, programming et tutorial, la sortie doit être :
Title: Lua Basics
Tags: programming, tutorialN’oublie pas : les méthodes du mixin fonctionnent parce que les instances d’Article ont une table tags sur laquelle les méthodes du mixin peuvent agir. Le mixin ne crée pas cette table. C’est le constructeur Article qui le fait. Le mixin fournit simplement le comportement partagé !
Essayez vous-même
-- Fichier principal du système d’étiquetage
local Taggable = require('Taggable')
local Article = require('Article')
-- TODO: Implémenter la fonction applyMixin
-- Cette fonction doit copier toutes les méthodes d’une table mixin vers une table cible
function applyMixin(target, mixin)
-- TODO: Parcourir le mixin et copier chaque méthode dans target
end
-- TODO: Appliquer le mixin Taggable à Article à l’aide de applyMixin
-- Lire les entrées
local title = io.read()
local tag1 = io.read()
local tag2 = io.read()
-- TODO: Créer un Article avec le titre donné
-- TODO: Ajouter les deux étiquettes à l’article
-- TODO: Afficher le titre au format : Title: {title}
-- TODO: Lister toutes les étiquettes à l’aide de la méthode listTags
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Le concept de « self »
Tables avec fonctions« self » expliciteLa syntaxe avec deux-pointsPoint vs deux-pointsRécapitulatif - Point mobile4Projet : Banque numérique
Configuration du projetMéthode de dépôt7Polymorphisme et Redéfinition
Redéfinition de méthodesAppeler des méthodes parentesDuck TypingInterface communeVérification du typeRécapitulatif - Rôles des employés10Projet : Gestionnaire de formes
Configuration du projetClasse RectangleClasse CercleMéthode PérimètreCollection de formesAire totaleFiltrer les formes2Modèle de prototype de classe
Le concept de prototypeLiaison avec __indexLe constructeur :new()Initialisation des attributsInstances indépendantesRécapitulatif - Usine de voitures5Surcharge d'opérateurs en POO
Additionner des objetsSoustraire des objetsConcaténer des objetsComparer des objets (<, >)Récapitulatif - Calculs de portefeuille8Encapsulation
Conventions de nommageClosures pour la confidentialitéAccès via les ClosuresTables en lecture seuleLogique de validationRécapitulatif - Coffre-fort sécurisé11Patrons de conception (Lite)
Fonctions FactoryTable SingletonPatron IteratorObserver (Écouteur)Récapitulatif - Logger Factory3État et comportement des objets
Variables d'instanceMéthodes GetterMéthodes SetterPropriétés calculéesFormatage de chaînesVérifications d'égalitéRécapitulatif - Note de l'étudiant6Bases de l'héritage
Mise en place de l'héritageHériter des méthodesÉtendre le constructeurAjouter des méthodes enfantsPartagé vs UniqueRécapitulatif - Hiérarchie des formes9Composition et Mixins
Relation 'A un'DélégationMixins simplesAppliquer plusieurs MixinsMixins vs HéritageRécapitulatif - Assemblage de robotsEntraînez-vous par vous-même : Compilateur Lua en ligne