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
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
Keadaan awal: tertutup. Ini berlaku sebelum satu kejadian pun diproses.
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.