Fabrika Metotları
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 15 / 57.
fabrika metodu, bir örnek oluşturan ve döndüren bir sınıf metodudur. Bir nesne oluşturmanın bir yoluna ad verir. Bir sınıf metodunun içinde new, self.new anlamına gelir:
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.celsiusÇıktı:
100.0
0Metni bir nesneye dönüştürmek, fabrika için yaygın bir görevdir. Ayrıştırma sınıfın yanında bulunur ve initialize basit kalır:
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").secondsÇıktı:
90
7205Bir fabrika geçersiz girdiyi reddedebilir. nil döndürmek, çağıranın sonucu if ile test etmesini sağlar; bir hata yükseltmek ise çağıran bunu yakalamadığı sürece programı durdurur:
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}"
endÇıktı:
ok #ff8800
not a color: orangeprivate_class_method :new, new'i yalnızca sınıfın içinde çağrılabilir hâle getirir; böylece bir nesne oluşturmanın tek yolu factory'ler olur:
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
endÇıktı:
250
private method `new' called for class MoneyGörev
KolayDuration sınıfını tamamla. initialize(seconds) saniye sayısını saklar. Duration.parse(text) fabrika metodu m:ss veya h:mm:ss biçimini okur, Duration.from_minutes(m) fabrika metodu tam dakikaları alır, plus(other) toplamı içeren yeni bir Duration döndürür ve to_s, dakika ve saniyeleri iki basamaklı olacak şekilde h:mm:ss döndürür.
Sağlanan kod süreleri okur: 45m gibi satırlar from_minutes üzerinden, diğerleri ise parse üzerinden işlenir. Her süreyi yazdırır ve son olarak total 1:47:10 yazdırır.
Kodun duration.rb dosyasına yazılmalı. main.rb sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'duration'
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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) }}"
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıf TanımlamaÖrnek DeğişkenleriMetotlar ve selfto_s ve inspectÖzet - Kütüphane Kartı7Çok Biçimlilik ve Ördek Tiplemesi
Çok BiçimlilikÖrdek TiplemesiSoyut Metotlarcase ve SınıflarTekrar - Ödeme Yöntemleri2Erişimciler ve self
Okuyucular ve YazıcılarÖzel Setter'larMetotlarda selfKimlik ve EşitlikTekrar - Kişi Listesi5Kalıtım
Alt sınıflarMetotları geçersiz kılmasuper çağrısıis_a? ve üst sınıflarTekrar - Personel Maaşları8Özel Metotlar
Eşitlik ve hashOperatör Metotlarıİndeksleme ve EklemeÖzel KoleksiyonlarTekrar - Kesirler11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç Alma3Sınıf Metotları ve Değişkenleri
Sınıf MetotlarıSınıf Örnek DeğişkenleriSabitlerFabrika MetotlarıTekrar - Kupon KodlarıKendi başına pratik yap: Online Ruby derleyicisi