Factory-Methoden
Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 15 von 57.
Eine Factory-Methode ist eine Klassenmethode, die eine Instanz erstellt und zurückgibt. Sie gibt einer Möglichkeit, ein Objekt zu erstellen, einen Namen. Innerhalb einer Klassenmethode bedeutet new self.new:
class Temperature
attr_reader :celsius
def initialize(celsius)
@celsius = celsius
end
def self.from_fahrenheit(f)
new((f - 32) * 5 / 9.0)
end
def self.freezing
new(0)
end
end
puts Temperature.from_fahrenheit(212).celsius
puts Temperature.freezing.celsiusAusgabe:
100.0
0Text in ein Objekt umzuwandeln, ist eine häufige Aufgabe für eine Factory. Das Parsen befindet sich neben der Klasse, und initialize bleibt einfach:
class Duration
attr_reader :seconds
def initialize(seconds)
@seconds = seconds
end
def self.parse(text)
new(text.split(":").map(&:to_i).reduce(0) { |acc, part| acc * 60 + part })
end
end
puts Duration.parse("1:30").seconds
puts Duration.parse("2:00:05").secondsAusgabe:
90
7205Eine Factory kann ungültige Eingaben ablehnen. Die Rückgabe von nil ermöglicht es dem Aufrufer, das Ergebnis mit if zu testen; das Auslösen eines Fehlers beendet das Programm, sofern der Aufrufer ihn nicht abfängt:
class Color
attr_reader :hex
def initialize(hex)
@hex = hex
end
def self.parse(text)
return nil unless text.match?(/\A#[0-9a-f]{6}\z/i)
new(text.downcase)
end
end
["#FF8800", "orange"].each do |text|
color = Color.parse(text)
puts color ? "ok #{color.hex}" : "not a color: #{text}"
endAusgabe:
ok #ff8800
not a color: orangeprivate_class_method :new macht new nur innerhalb der Klasse aufrufbar, sodass die Factory-Methoden die einzige Möglichkeit werden, ein Objekt zu erstellen:
class Money
attr_reader :cents
def initialize(cents)
@cents = cents
end
private_class_method :new
def self.from_cents(cents)
new(cents)
end
end
puts Money.from_cents(250).cents
begin
Money.new(250)
rescue NoMethodError => e
puts e.message
endAusgabe:
250
private method `new' called for class MoneyAufgabe
EinfachVervollständige die Klasse Duration. initialize(seconds) speichert eine Anzahl von Sekunden. Die Fabrikmethode Duration.parse(text) liest m:ss oder h:mm:ss, die Fabrikmethode Duration.from_minutes(m) nimmt ganze Minuten entgegen, plus(other) gibt eine neue Duration mit der Summe zurück, und to_s gibt h:mm:ss mit zweistelligen Minuten und Sekunden zurück.
Der bereitgestellte Code liest Zeitdauern ein: Zeilen wie 45m werden über from_minutes verarbeitet, der Rest über parse. Er gibt jede Zeitdauer aus und schließlich total 1:47:10.
Dein Code gehört in duration.rb. main.rb enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
require_relative 'duration'
# Bereitgestellter Ein-/Ausgabe-Code: belasse ihn wie er ist
input = []
while (line = gets)
input << line.chomp
end
durations = input.map do |line|
line.end_with?("m") ? Duration.from_minutes(line.to_i) : Duration.parse(line)
end
durations.each { |d| puts d }
puts "total #{durations.reduce(Duration.new(0)) { |sum, d| sum.plus(d) }}"
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenInstanzvariablenMethoden und selfto_s und inspectRückblick – Bibliotheksausweis4Kapselung
Private MethodenGeschützte MethodenPrivate SetterZustand schützenRückblick – Verkaufsautomat7Polymorphismus und Duck Typing
PolymorphismusDuck TypingAbstrakte MethodenFälle und KlassenRückblick – Zahlungsmethoden2Getter und Setter sowie self
Leser und SchreiberBenutzerdefinierte Setterself in MethodenIdentität und GleichheitWiederholung – Kontaktliste5Vererbung
UnterklassenMethoden überschreibensuper aufrufenis_a? und VorfahrenRückblick – Gehaltsabrechnung des Personals8Spezielle Methoden
Gleichheit und HashOperator-MethodenIndexieren und AnhängenBenutzerdefinierte CollectionsRückblick – Brüche11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihen3Klassenmethoden und Variablen
KlassenmethodenKlasseninstanzvariablenKonstantenFactory-MethodenZusammenfassung – GutscheincodesÜbe selbstständig: Online-Ruby-Compiler