Metodi factory
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 15 di 57.
Un metodo factory è un metodo di classe che crea e restituisce un’istanza. Dà un nome a uno dei modi per creare un oggetto. All’interno di un metodo di classe, new significa 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.celsiusOutput:
100.0
0Trasformare il testo in un oggetto è un compito comune per una factory. L'analisi si trova accanto alla classe e initialize resta semplice:
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").secondsOutput:
90
7205Una factory può rifiutare input non valido. Restituire nil permette al chiamante di verificare il risultato con if; sollevare un errore interrompe il programma, a meno che il chiamante non lo intercetti:
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}"
endOutput:
ok #ff8800
not a color: orangeprivate_class_method :new rende new chiamabile solo all'interno della classe, quindi le factory diventano l'unico modo per creare un oggetto:
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
endOutput:
250
private method `new' called for class MoneySfida
FacileCompleta la classe Duration. initialize(seconds) memorizza un numero di secondi. La factory Duration.parse(text) legge m:ss o h:mm:ss, la factory Duration.from_minutes(m) accetta minuti interi, plus(other) restituisce una nuova Duration con la somma e to_s restituisce h:mm:ss con minuti e secondi a due cifre.
Il codice fornito legge le durate: le righe come 45m passano per from_minutes, le altre per parse. Stampa ogni durata e infine total 1:47:10.
Il tuo codice va in duration.rb. main.rb contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
require_relative 'duration'
# Código de entrada/salida proporcionado: mantenlo tal como está
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) }}"
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiVariabili d'istanzaMetodi e selfto_s e inspectRipasso - Tessera della biblioteca4Incapsulamento
Metodi privatiMetodi protettiSetter privatiProteggere lo statoRiepilogo - Distributore automatico7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMetodi astratticase e classiRiepilogo - Metodi di pagamento10Pattern di progettazione Parte 2
Delegazione con ForwardablePattern DecoratorPattern BuilderPattern State2Metodi di accesso e self
Metodi di lettura e scritturaSetter personalizzatiself nei metodiIdentità e uguaglianzaRiepilogo - Elenco contatti5Ereditarietà
SottoclassiRidefinizione dei metodiChiamare superis_a? e antenatiRiepilogo - Paghe del personale8Metodi speciali
Uguaglianza e hashMetodi degli operatoriIndicizzazione e appendCollezioni personalizzateRiepilogo - Frazioni11Progetto: Gestione della biblioteca
Libri e iscrittiPrendere in prestito i libri3Metodi e variabili di classe
Metodi di classeVariabili di istanza della classeCostantiMetodi factoryRiepilogo - Codici couponEsercitati da solo: Compilatore Ruby online