Pola State
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 49 dari 57.
Pola state memindahkan perilaku yang bergantung pada state object saat ini ke object state yang terpisah. Object utama, context, menyimpan satu state dan meneruskan pemanggilan kepadanya. Sebuah state memberikan jawaban dan menentukan state berikutnya:
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.changeOutput:
light is red
light is green
light is redTanpa pola ini, setiap method pada context memerlukan case untuk nilai status, dan state baru berarti kamu harus mengedit semuanya. Dengan object state, setiap state adalah satu class yang menyimpan aturannya sendiri:
# tanpa pola
def can_go?
case @status
when :red then false
when :green then true
when :yellow then false
end
end
# dengan pola
def can_go?
@state.can_go?
endState dapat menolak event yang tidak sesuai. Di sini, draft tidak dapat langsung diterbitkan. Draft harus melalui peninjauan terlebih dahulu:
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 stateOutput:
cannot publish a draft
publishedclass dasar bersama dapat memberi setiap state jawaban default, seperti menolak setiap event, sehingga setiap state hanya mendefinisikan event yang diterimanya:
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
endTantangan
MudahLengkapi lampu lalu lintas. Setiap status Red, Green, dan Yellow memiliki next_state (merah berubah menjadi hijau, hijau menjadi kuning, kuning menjadi merah), can_go? (hanya hijau) dan to_s (warnanya). TrafficLight dimulai dengan status merah, change berpindah ke status berikutnya, dan status mengembalikan red: stop atau green: go, dengan menanyakan statusnya.
Code yang disediakan membaca perintah change atau status dan mencetak status setelah setiap perintah.
Tulis kodemu di red.rb, green.rb, yellow.rb, dan traffic_light.rb. main.rb berisi code input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
require_relative 'red'
require_relative 'green'
require_relative 'yellow'
require_relative 'traffic_light'
# Kode input/output yang disediakan: biarkan apa adanya
input = []
while (line = gets)
input << line.chomp
end
light = TrafficLight.new
input.each do |cmd|
light.change if cmd == "change"
puts light.status
end
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1class dan object
Bekerja dengan fileMendefinisikan classVariabel instansmethod dan selfto_s dan inspectRingkasan: Kartu Perpustakaan4Enkapsulasi
private methodprotected methodprivate setterMelindungi StatusUlasan, Mesin Penjual Otomatis7Polimorfisme dan Duck Typing
PolimorfismeDuck TypingMethod Abstrakcase dan classRingkasan: Method Pembayaran2Accessor dan self
Pembaca dan PenulisSetter Kustomself dalam methodIdentitas dan KesetaraanRangkuman: Daftar Kontak8Special method
Kesetaraan dan hashOperator methodPengindeksan dan penambahanKoleksi kustomRingkasan: Pecahan11Proyek: Manajemen Perpustakaan
Buku dan AnggotaMeminjam Buku3Method dan Variabel class
Method classVariabel instance classKonstantaMethod pabrikRangkuman: Kode KuponLatihan sendiri: Compiler Ruby online