Je lis "Design Patterns with Ruby" pour améliorer la capacité de conception du programme, et je vais résumer les modèles de conception qui m'intéressent un par un.
Cette fois, j'ai résumé le modèle de méthode de modèle.
Il s'agit d'un modèle qui décrit la partie invariante dans la classe de base et encapsule la partie modifiée dans la méthode définie dans la sous-classe.
Il est basé sur l'idée de conception de séparer ce qui change et ce qui ne change pas.
J'écrirai un exemple de code après mon entraînement musculaire amateur. Le développé couché et la suspension ont le même flux d'entraînement, mais le flux spécifique est différent.
Par conséquent, écrivez un programme qui produit le contenu de chaque formation.
class Training
def initialize(type)
@type = type
end
def start
prepare
execute
cleanup
end
def prepare
if @type == :bench_press
puts 'Démarrer le développé couché'
puts 'Réglez la barre'
elsif @type == :tinning
puts 'Commencez à vous accrocher'
puts 'Montez sur la plateforme'
end
end
def execute
puts 'Train'
end
def cleanup
puts 'Désinfecter avec de l'alcool'
if @type == :bench_press
puts 'Retournez la barre'
elsif @type == :tinning
puts 'Descendez de la plateforme'
end
end
end
Au moment de l'appel, transmettez le type d'entraînement comme argument. Le résultat de l'exécution est le suivant.
bench_press = Training.new(:bench_press)
bench_press.start
#Démarrer le développé couché
#Réglez la barre
#Train
#Désinfecter avec de l'alcool
#Retournez la barre
tinning = Training.new(:tinning)
tinning.start
#Commencez à vous accrocher
#Montez sur la plateforme
#Train
#Désinfecter avec de l'alcool
#Descendez de la plateforme
Branchement par if minutes par variable d'instance @type. Ce serait bien d'avoir deux types de formation, mais à mesure que le nombre de formations augmente, cette branche conditionnelle augmente, ce qui rend une méthode longue et compliquée.
Ensuite, lors de la réécriture en appliquant le modèle de méthode modèle.
class Training
def start
prepare
execute
cleanup
end
def prepare
end
def execute
puts 'Train'
end
def cleanup
puts 'Désinfecter avec de l'alcool'
end
end
class BenchPress < Training
def prepare
puts 'Démarrer le développé couché'
puts 'Réglez la barre'
end
def cleanup
puts 'Retournez la barre'
super
end
end
class Tinning < Training
def prepare
puts 'Commencez à vous accrocher'
puts 'Montez sur la plateforme'
end
def cleanup
super
puts 'Descendez de la plateforme'
end
end
Au moment de l'appel, une instance de la sous-classe est créée et avant d'appliquer le modèle de méthode de modèle, l'élément d'apprentissage a été transmis en tant qu'argument, mais il n'y en a plus. Le résultat de l'exécution est le suivant.
bench_press = BenchPress.new
bench_press.start
#Démarrer le développé couché
#Réglez la barre
#Train
#Désinfecter avec de l'alcool
#Retournez la barre
tinning = Tinning.new
tinning.start
#Commencez à vous accrocher
#Montez sur la plateforme
#Train
#Désinfecter avec de l'alcool
#Descendez de la plateforme
La classe de base Formation définit uniquement le plan de la formation et le contenu de la formation spécifique est défini dans les sous-classes.
Quand j'avais besoin de créer une nouvelle sous-classe, je n'avais qu'à changer la sous-classe sans changer la classe de base, ce qui la rendait plus résistante au changement.
Le modèle de méthode de modèle était un modèle de conception orienté objet utilisant l'héritage.
Personnellement, je pense que c'est le design pattern le plus fréquemment utilisé, donc je veux pouvoir le maîtriser.
Recommended Posts