Durum Deseni
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 49 / 57.
durum deseni, bir nesnenin mevcut durumuna bağlı olan davranışı ayrı durum nesnelerine taşır. Ana nesne olan bağlam, bir durumu tutar ve çağrıları ona iletir; bir durum yanıt verir ve sıradaki durumun hangisi olacağına karar verir:
class Red
def next_state
Green.new
end
def to_s
"red"
end
end
class Green
def next_state
Yellow.new
end
def to_s
"green"
end
end
class Yellow
def next_state
Red.new
end
def to_s
"yellow"
end
end
class TrafficLight
def initialize
@state = Red.new
end
def change
@state = @state.next_state
self
end
def to_s
"light is #{@state}"
end
end
light = TrafficLight.new
puts light
puts light.change
puts light.change.changeÇıktı:
light is red
light is green
light is redDesen olmadan, bağlamın her yöntemi bir durum değeri üzerinde case ifadesine ihtiyaç duyar ve yeni bir durum, bunların hepsini düzenlemek anlamına gelir. Durum nesneleriyle her durum, kendi kurallarını barındıran bir sınıftır:
# desen olmadan
def can_go?
case @status
when :red then false
when :green then true
when :yellow then false
end
end
# desen ile
def can_go?
@state.can_go?
endDurumlar, kendilerine uymayan bir olayı reddedebilir. Burada bir taslak doğrudan yayımlanamaz; önce incelemeden geçmesi gerekir:
class Draft
def submit
Review.new
end
def publish
raise ArgumentError, "cannot publish a draft"
end
def to_s
"draft"
end
end
class Review
def publish
Published.new
end
def to_s
"in review"
end
end
class Published
def to_s
"published"
end
end
state = Draft.new
begin
state.publish
rescue ArgumentError => e
puts e.message
end
state = state.submit
state = state.publish
puts stateÇıktı:
cannot publish a draft
publishedPaylaşılan bir temel sınıf, her duruma her olayı reddetmek gibi varsayılan yanıtı sağlayabilir; böylece her durum yalnızca kabul ettiği olayları tanımlar:
class State
def submit
raise ArgumentError, "cannot submit #{self}"
end
def approve
raise ArgumentError, "cannot approve #{self}"
end
end
class Review < State
def approve
Published.new
end
endGörev
KolayTrafik ışığını tamamla. Red, Green ve Yellow durumlarının her birinde next_state (kırmızı yeşile, yeşil sarıya, sarı kırmızıya geçer), can_go? (yalnızca yeşilde) ve to_s (renk) bulunur. TrafficLight kırmızıdan başlar, change bir sonraki duruma geçer ve status duruma sorarak red: stop veya green: go döndürür.
Sağlanan kod change veya status komutlarını okur ve her komuttan sonra durumu yazdırır.
Kodun red.rb, green.rb, yellow.rb ve traffic_light.rb dosyalarına yazılmalıdır. main.rb sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'red'
require_relative 'green'
require_relative 'yellow'
require_relative 'traffic_light'
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input = []
while (line = gets)
input << line.chomp
end
light = TrafficLight.new
input.each do |cmd|
light.change if cmd == "change"
puts light.status
end
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