Classe templating & versionning
Cas d'étude
Pour ceux qui ont déjà utilisé ActiveRecord et plus particulièrement les Migrations
Vous avez déjà utilisé des héritages du type :
class CreateUser < ActiveRecord::Migration[5.1]
En Ruby de base
on Hérite une classe via < d'une classe sur une autre alors qu'est-ce que ce [5.1] ?
Remarque : En Ruby tout est objet même une classe via la constante qui la référence donc la ligne est syntaxiquement correct.
Mais si on exécute directement on va obtenir une RuntimeError
.
Exemple :
class MaClasse < TemplateClasse; end
Réponse : une méthode de classe def self.[](version)
de ActiveRecord::Migration
Ceux qu'on veut obtenir ?
Imaginons deux versions du template :
class TestV1
def output
puts 'V1'
end
end
class TestV2
def output
puts 'V2'
end
end
On veut pouvoir choisir le template, tel que
class MyClass < Test[2]; end
test = MyClass::new
test.output
et la sortie doit être :
V2
Alors comment faire ?
La classe Test doit implémenter la fameuse méthode de classe def self.[](version)
class Test
@@versions = {1 => TestV1, 2 => TestV2}
def self.[](version)
return (@@versions.include? version)? @@versions[version] : TestV1
end
end
On vient ici pour simplifier mapper en statique sur une variable de classe les templates, dans un usage concret, d'autres mécanismes seraient utilisables.
si la version n'existe pas alors on Fallback sur TestV1
.
Remarque : Ruby est hautement dynamique chaque template peux être une ré-implémentation, une surcharge, etc ... de Test en lui même, à grand coup de mixin, (include,extend
)