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