Keputusan yang bergantung keadaan

Kejadian yang sama dapat berakibat berbeda, dan yang membedakannya keadaan saat kejadian itu datang.

Sebaiknya baca lebih dulu: Memeriksa nilai di dalam rentang.

Kejadian sama, akibat berbeda

Sampai pelajaran sebelumnya, keputusan hanya bergantung pada nilai masukan. Di sini masuk satu hal baru: keputusan juga bergantung pada apa yang sudah terjadi sebelumnya, yang tersimpan sebagai keadaan. Pola ini disebut mesin status.

IngatYang diperiksa bukan kejadiannya saja, melainkan pasangan kejadian dan keadaan saat ini.

Aturan pintu

Sebuah pintu punya tiga keadaan: tertutup, terbuka, dan terkunci. Empat kejadian dapat datang: buka, tutup, kunci, dan bukaKunci. Tidak semua kejadian berlaku pada semua keadaan, dan itu inti aturannya.

  • Keadaan tertutup: buka membuatnya terbuka, kunci membuatnya terkunci.
  • Keadaan terbuka: tutup membuatnya tertutup. Kunci tidak berlaku, pintu terbuka tidak dapat dikunci.
  • Keadaan terkunci: bukaKunci membuatnya tertutup. Buka tidak berlaku, pintu terkunci tetap terkunci.
  • Keadaan awalnya tertutup, dan daftar kejadian yang kosong berarti pintu tetap tertutup.

Perhatikan dua baris yang menyebut tidak berlaku. Kejadian yang tidak berlaku diabaikan, bukan menggagalkan proses. Pintu terkunci yang menerima kejadian buka tetap terkunci, dan pemrosesan lanjut ke kejadian berikutnya seolah tidak terjadi apa apa.

SET status = "tertutup"
FOR EACH event IN events
  IF status == "tertutup" AND event == "buka"
    SET status = "terbuka"
  ELSE IF status == "tertutup" AND event == "kunci"
    SET status = "terkunci"
  ELSE IF status == "terbuka" AND event == "tutup"
    SET status = "tertutup"
  ELSE IF status == "terkunci" AND event == "bukaKunci"
    SET status = "tertutup"
  END
END
OUTPUT status
Setiap cabang memeriksa keadaan DAN kejadian. Tidak adanya ELSE terakhir itu yang membuat kejadian tak berlaku terabaikan tanpa mengubah apa pun.

Melihat kejadian yang terabaikan

SET status = "tertutup"
FOR EACH event IN events
  IF status == "tertutup" AND event == "buka"
    SET status = "terbuka"
  ELSE IF status == "tertutup" AND event == "kunci"
    SET status = "terkunci"
  ELSE IF status == "terkunci" AND event == "bukaKunci"
    SET status = "tertutup"
  END
END
OUTPUT status
statustertutup
eventbelum ada

Keadaan awal: tertutup. Ini berlaku sebelum satu kejadian pun diproses.

Langkah 1 dari 8
Kejadiannya kunci lalu buka. Perhatikan kejadian buka pada langkah terakhir tidak mengubah status sama sekali.

Kejadian buka tadi bukan kesalahan masukan dan tidak perlu ditolak dengan pesan. Ia hanya tidak berlaku pada keadaan itu. Membedakan tidak berlaku dari salah adalah salah satu hal tersulit pada pelajaran ini, dan juga salah satu yang paling sering keliru di kode nyata.

Kesalahan yang paling sering

Hanya memeriksa kejadian

FOR EACH event IN events
  IF event == "buka"
    SET status = "terbuka"
  END
END

Memeriksa keadaan dan kejadian

FOR EACH event IN events
  IF status == "tertutup" AND event == "buka"
    SET status = "terbuka"
  END
END

Kolom kiri membuka pintu terkunci, sebab ia tidak pernah menanyakan keadaan sekarang. Inilah bug yang paling mahal pada mesin status: bukan program yang berhenti, melainkan aturan keamanan yang lenyap tanpa satu pun tanda.

Periksa pemahaman

Kejadiannya buka, kunci, tutup, kunci. Apa status akhir pintu, dimulai dari tertutup?

Ringkasan

  • Keputusan bergantung pada pasangan keadaan dan kejadian, bukan pada kejadian saja.
  • Kejadian yang sama dapat berlaku pada satu keadaan dan terabaikan pada keadaan lain.
  • Kejadian yang tidak berlaku diabaikan, bukan menggagalkan proses.
  • Tidak adanya cabang penutup itulah yang membuat pengabaian terjadi tanpa perlu ditulis.
  • Daftar kejadian kosong menghasilkan keadaan awal apa adanya, dan itu jawaban yang benar.