Metody fabrykujące
Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 15 z 57.
Metoda fabrykująca to metoda klasowa, która tworzy i zwraca instancję. Nadaje nazwę jednemu ze sposobów tworzenia obiektu. Wewnątrz metody klasowej new oznacza 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.celsiusWynik:
100.0
0Zamienianie tekstu w obiekt to częste zadanie dla fabryki. Parsowanie znajduje się obok klasy, a initialize pozostaje proste:
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").secondsWynik:
90
7205Fabryka może odrzucić nieprawidłowe dane wejściowe. Zwrócenie nil pozwala wywołującemu sprawdzić wynik za pomocą if; zgłoszenie błędu zatrzymuje program, chyba że wywołujący go przechwyci:
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}"
endWynik:
ok #ff8800
not a color: orangeprivate_class_method :new sprawia, że new można wywołać tylko wewnątrz klasy, więc fabryki stają się jedynym sposobem tworzenia obiektu:
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
endWynik:
250
private method `new' called for class MoneyWyzwanie
ŁatwyUzupełnij klasę Duration. initialize(seconds) przechowuje liczbę sekund. Fabryka Duration.parse(text) odczytuje zapis m:ss lub h:mm:ss, fabryka Duration.from_minutes(m) przyjmuje całkowitą liczbę minut, plus(other) zwraca nowy obiekt Duration z sumą, a to_s zwraca zapis h:mm:ss z minutami i sekundami zapisanymi za pomocą dwóch cyfr.
Dostarczony kod odczytuje czasy trwania: wiersze takie jak 45m są obsługiwane przez from_minutes, a pozostałe przez parse. Wypisuje każdy czas trwania, a na końcu total 1:47:10.
Twój kod umieść w pliku duration.rb. Plik main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
require_relative 'duration'
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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) }}"
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasZmienne instancjiMetody i selfto_s i inspectPowtórzenie – karta biblioteczna4Hermetyzacja
Metody prywatneMetody chronionePrywatne setteryOchrona stanuPowtórzenie – automat vendingowy7Polimorfizm i typowanie kacze
PolimorfizmTypowanie kaczeMetody abstrakcyjnecase i klasyPowtórzenie – metody płatności10Wzorce projektowe, część 2
Delegowanie z ForwardableWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Metody dostępowe i self
Gettery i setteryWłasne setteryself w metodachTożsamość i równośćPowtórzenie – lista kontaktów5Dziedziczenie
PodklasyNadpisywanie metodWywoływanie superis_a? i przodkowiePowtórka – lista płac pracowników8Metody specjalne
Równość i hashMetody operatorówIndeksowanie i dodawanieWłasne kolekcjePowtórka – ułamki11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książek3Metody i zmienne klasowe
Metody klasoweZmienne instancji klasyStałeMetody fabrykującePodsumowanie – kody kuponówPoćwicz samodzielnie: Kompilator Ruby online