Durum makineleri özellikle gömülü yazılımlar başta olmak üzere yazılım mühendisliğinde oldukça popüler bir tasarım kalıbıdır(design pattern). Problemi parçalara bölmeyi ve her parçada hangi işlemlerin nasıl yapılacağını kesin çizgilerle belirttiği için anlaşılması ve geliştirilmesi kolay, kod kalitesi açısından ise temiz bir kodlama sağlar. Mikrodenetleyici ve mikroişlemci tabanlı sistemler olay güdümlü(event-driven) çalışmaya elverişli makinelerdir ve olay güdümlü çalışmanın temelinde de durum makineleri yatmaktadır.
Durum makinelerinin günlük hayattaki en bilinen karşılıkları otomatlar, kahve/çay makineleri, çamaşır makineleri gibi cihazlardır. Bu cihazların çalışma rutinlerini incelersek karşımıza aşağıdaki yapı çıkacaktır.
- Cihazlar herhangi bir an için sadece bir durumda bulunmaktadırlar.
- Bir çalışma durumundan bir diğerine geçiş için bir olayın(event) oluşması gerekmektedir.
- Olaylar çoğunlukla cihazların durumlarının değişime sebep olmaktadırlar.
- Cihazların içinde bulundukları durumlar sınırlı sayıdadır ve cihaz tüm çalışma zamanı boyunca bu durumlar arası geçiş yaparak kendisinden bekleneni gerçekleştirmektedir
Yukarıdaki analizimizi detaylandırıp durum makineleri özelinde irdelemek için kendimize örnek bir cihaz seçelim. Yazının devamında ben bir otomat makinesini ele alacağım.
Durum (State)
Bir cihazın zaman içinde alabileceği/aldığı haller durum olarak ele alınmaktadır. Otomat makinesini ele aldığımızda makinenin sahip olacağı bazı haller vardır. Makine çalışmıyordur, para girişi bekliyordur, ürün seçimini bekliyordur, ürün veriyordur veya hata durumuna geçmiştir. Bunların hepsi otomatımız için bir durum olarak değerlendirilir. Elbette durum sayısı daha da artabilir/arttırabiliriz. Otomat çalışırken bu durumlar arasında dolaşması gerekmektedir. Bu dolaşım içinse bir olayın(event) bu geçişi(transition) tetiklemesi gerekmektedir.
Olay (Event)
Olay, bir sistemde etkisi bulunan insan kaynaklı ya da sistemin kendisi tarafından üretilen bir etki olarak tanımlanabilir. Otomata para girişi olması ve tuşlara basılması olayları insan kaynaklı olarak sistemi etkileyen olaylardır. Sistem kullanıcıdan bir veri girişi beklediği durumda uzun bir süre bu giriş oluşmamışsa, sistemin tekrar kullanılabilir olması için üretilen zaman aşımı(timeout) sinyali ise sistemin kendisi tarafından üretilen bir olaydır.
Otomatımız çalışır vaziyette ve para bekleme durumunda olsun. Otomat kullanıcıdan para girişi beklemektedir. Otomata para attığımız anda sistem içinde bu bir olay olarak değerlendirilir ve bakiyemiz attığımız para miktarı kadar olur. Para atım işlemi gerçekleştikten sonra ürün seçmemiz gerekmektedir. O halde makinenin bir başka duruma geçmesi(transition) ardından kullanıcının ürün seçmesini beklemeli ve yorumlamalıdır.
Geçiş (Transition)
Durum makinelerinde durumlar arası geçiş bir aksiyona verilen tepkidir. Problem parçalara (durumlara) bölünerek her durumun sorumluluk alanları belirlenir ve yapılacak işlemler bu durumların altında yapılır. Örneğimizde otomata para atılmasının ardından makine kullanıcıdan ürün seçmesini bekleyecektir. Dolayısıyla makinemizin durumu artık kullanıcıdan seçimi bekleme olacaktır. Ürün seçimi ise otomat üzerinde bulunan tuş takımı(keypad) üzerinde yapılacaktır. Ayrıca seçilen ürünün fiyatının bakiyemiz ile uygunluğu da değerlendirilmelidir. Her şey yolunda ise kullanıcı ürünü seçtikten sonra otomat ürünü verecek ve bir döngü tamamlanmış olacaktır. Otomatın tekrar kullanılabilmesi için otomat bir durum geçişi yaparak para bekleme duruma geçecektir.
Sonlu Durum (Finite State)
Çevremizi incelediğimizde sistemlerin zaman içinde çeşitli durumlar alığı gözlemlenmektedir ve çoğu durumda bu durumlar sınırlı sayıdadır. Yazıdaki cihazlarında aldıkları durumlar sınırlıdır. Bu özelliklerinden dolayı literatür bu durum makinelerini “sonlu durum makineleri (Finite State Machine, kısaca: fsm)” olarak adlandırmaktadır. Otomat makinemizde bir fsm ile ele alınmaktadır.
Otomat makinemizin alabileceği pek çok durum burada ele alınmamıştır. Örneğin para atımı gerçekleştikten sonra cihaz ürünü veremez veya işlemler sürerken sistemsel bir arıza oluşması durumunda paranın iade edilmesi, seçilen ürününden sonra para üstü verilmesi, ikinci bir para girişinin olması veya kullanıcının işlemi iptal etmesi gibi. Otomat makinemizi anlattığımız bu yazımızda son olarak makinemizin UML diyagramını da çizelim.
Yazının ilk bölümünde durum makinesi ve durum makinesine ait kavramları inceledik. Bir sonraki yazıda ise otomat makinemizi bir uygulama üzerinde gerçekleştireceğiz.
Kaynaklar: