Ich lese "Entwurfsmuster mit Ruby", um die Entwurfsfähigkeit des Programms zu verbessern, und ich werde die Entwurfsmuster, die mich interessieren, einzeln zusammenfassen.
Dieses Mal habe ich das Muster der Vorlagenmethode zusammengefasst.
Es ist ein Muster, das den invarianten Teil in der Basisklasse beschreibt und den geänderten Teil in der in der Unterklasse definierten Methode kapselt.
Es basiert auf der Entwurfsidee, zu trennen, was sich ändert und was nicht.
Ich werde nach meinem Hobby-Muskeltraining einen Beispielcode schreiben. Sowohl das Bankdrücken als auch die Federung haben den gleichen Trainingsfluss, aber der spezifische Fluss ist unterschiedlich.
Schreiben Sie daher ein Programm, das den Inhalt jedes Trainings ausgibt.
class Training
def initialize(type)
@type = type
end
def start
prepare
execute
cleanup
end
def prepare
if @type == :bench_press
puts 'Starten Sie das Bankdrücken'
puts 'Stellen Sie die Langhantel'
elsif @type == :tinning
puts 'Fangen Sie an zu hängen'
puts 'Steig auf die Plattform'
end
end
def execute
puts 'Zug'
end
def cleanup
puts 'Mit Alkohol desinfizieren'
if @type == :bench_press
puts 'Gib die Langhantel zurück'
elsif @type == :tinning
puts 'Verlasse die Plattform'
end
end
end
Übergeben Sie zum Zeitpunkt des Aufrufs den Trainingstyp als Argument. Das Ausführungsergebnis ist wie folgt.
bench_press = Training.new(:bench_press)
bench_press.start
#Starten Sie das Bankdrücken
#Stellen Sie die Langhantel
#Zug
#Mit Alkohol desinfizieren
#Gib die Langhantel zurück
tinning = Training.new(:tinning)
tinning.start
#Fangen Sie an zu hängen
#Steig auf die Plattform
#Zug
#Mit Alkohol desinfizieren
#Verlasse die Plattform
Verzweigung nach if Minuten nach Instanzvariable @type. Es wäre schön, zwei Arten von Training zu haben, aber wenn die Anzahl der Trainings zunimmt, nimmt dieser bedingte Zweig zu, was eine Methode lang und kompliziert macht.
Als nächstes beim Umschreiben durch Anwenden des Musters der Vorlagenmethode.
class Training
def start
prepare
execute
cleanup
end
def prepare
end
def execute
puts 'Zug'
end
def cleanup
puts 'Mit Alkohol desinfizieren'
end
end
class BenchPress < Training
def prepare
puts 'Starten Sie das Bankdrücken'
puts 'Stellen Sie die Langhantel'
end
def cleanup
puts 'Gib die Langhantel zurück'
super
end
end
class Tinning < Training
def prepare
puts 'Fangen Sie an zu hängen'
puts 'Steig auf die Plattform'
end
def cleanup
super
puts 'Verlasse die Plattform'
end
end
Zum Zeitpunkt des Aufrufs wird eine Instanz der Unterklasse erstellt, und bevor das Muster der Vorlagenmethode angewendet wird, wurde das Trainingselement als Argument übergeben, aber das ist weg. Das Ausführungsergebnis ist wie folgt.
bench_press = BenchPress.new
bench_press.start
#Starten Sie das Bankdrücken
#Stellen Sie die Langhantel
#Zug
#Mit Alkohol desinfizieren
#Gib die Langhantel zurück
tinning = Tinning.new
tinning.start
#Fangen Sie an zu hängen
#Steig auf die Plattform
#Zug
#Mit Alkohol desinfizieren
#Verlasse die Plattform
Die Grundklasse Training definiert nur den Umriss des Trainings, und der spezifische Trainingsinhalt wird in Unterklassen definiert.
Wenn ich eine neue Unterklasse erstellen musste, musste ich nur die Unterklasse ändern, ohne die Basisklasse zu ändern, wodurch sie widerstandsfähiger gegen Änderungen wurde.
Das Muster der Vorlagenmethode war ein objektorientiertes Entwurfsmuster unter Verwendung von Vererbung.
Persönlich denke ich, dass es das am häufigsten verwendete Designmuster ist, also möchte ich es beherrschen können.
Recommended Posts