Finite-State Machine Nedir?
Merhaba,
Bu içeriğimizde Finite-State Machine kavramı üzerine duruyor olacağız. Özünde bu kavram, bir sonraki kaleme alacağımız microservice yapılanmalarında distributed transaction’ı sağlayabilmek için Saga pattern’ın Orchestrator implemantasyonunu ele alırken istifade edeceğimiz bir yapılanmaya karşılık gelmektedir. Haliyle bizler bu kavramı salt bir şekilde değerlendirmişken bir yandan da sonraki içeriğimize temel niteliğinde bir içerik ortaya koymuş olacağız. O halde buyrun başlayalım…
Finite-State Machine Nedir?
Finite-State Machine‘in ne olduğunu anlayabilmek için öncelikle State kavramına tam hakim olmak gerekmektedir.
State Nedir?
State, bir nesnenin o anki durumunu ifade eden değerleridir/değerler bütünüdür. Yani burada söylemek istenileni daha da açarsak eğer bir nesnenin herhangi bir t anındaki değerlerinin t + 1 anında kullanılan değerlerle tanımlanabilmesini sağlayan değerleridir. Bunu hemen aşağıdaki örnekle zenginleştirelim;
Yukarıdaki nesnelerden herhangi birinin state’ini değiştirmek için herhangi bir değerinin değiştirilmesi yeterlidir. Misal olarak;
![]() |
![]() |
Görüldüğü üzere p1 nesnenin ‘Name’ değeri herhangi bir t anında ‘Ali’ iken t + 1 anında ‘Veli’ olarak değiştirilmiştir. Haliyle böylece ilgili nesnenin state’i değiştirilmiştir. |
Tabi burada ilgili nesnenin state’ini değiştirebilmek için manuel bir yaklaşım sergilenmiştir. Bu işlem ayrıca aşağıdaki gibi bir metot ya da farklı bir event kullanılarak da gerçekleştirilebilirdi.
![]() |
![]() |
Dikkat edilirse p1 nesnesinin state’i bu sefer ‘SetName’ metodu aracılığıyla değiştirilmektedir. |
Yukarıdaki örnekte bildirilen ‘SetName’ metodu çağrıldığı an ilgili nesnenin değerini değiştirecektir. Dolayısıyla bu da state’inin değiştiği anlamına gelecektir.
Hocam, bizler günlük hayatta state olarak bir nesnenin kullanılabilirlik durumunu ifade etmiyor muyuz?
Yazımız boyunca bir nesnenin state’inden kastettiğimiz nesnenin bütünsel değeriydi. Halbuki günlük hayatta bir nesnenin state’i yukarıdaki sorunuz mantığında değerlendirilmektedir ve o nesnenin aktiflik/pasiflik yahut başarılı/başarısız gibi sınıflandırma niteliğinde tanımlamalar amacıyla kullanılmaktadır. Amma velakin bu kullanım yine ilgili nesnenin bütünsel anlamda durumunu ifade edeceğinden dolayı herhangi bir mantıksal farklılık doğurmamaktadır. Yani demek istediğim o ki, bir nesnenin aktiflik/pasiflik yahut başarılı/başarısız gibi sınıflandırmalar olmaksızın bütünsel anlamda mevcut değerleriyle de state’i ifade edilebilmektedir.
FINITE-State Machine Nedir?
Evet… Artık State kavramının ne olduğu hakkında istişare eylediğimize göre esas sualimizi tekrar masaya yatırabiliriz. Finite-State Machine; aldığı input’a göre durum değiştiren makinelerdir. Hmmm… 🙄😕 Anlamadım hocam🥴 Evet, tahmin edebiliyorum 🙂 Yukarıda state’i anlatmaya çalışırken verilen örneklerden birinde ‘SetName’ metoduyla, çağrıldığı anda ilgili nesnenin state’ini değiştiriyorduk hatırladınız mı? Heh işte o ‘SetName’ gibi ilgili nesne üzerinde değişiklikler yaratan tüm aparatlara(metot, property, event vs.) input diyoruz… Ne diyormuşuz? Input.
Şimdi aynı açıklamayı tekrardan yaparsak eğer:
Finite-State Machine; aldığı input’a göre durum değiştiren makinelerdir. Sanırım daha anlaşılır olmuştur kanaatindeyim 🙂 Evet, Finite-State Machine bir nesneden ziyade, bir makinedir. Yazılımsal açıdan değerlendirirsek eğer başlı başına bir durum kontrol merkezidir.
Yandaki görseli incelerseniz eğer bir State Machine’in basit bir şekilde şematize edilmiş halini göreceksiniz. Belirli eylemler/inputlar/eventler neticesinde şartlara göre durumun değişmesini sembolize eden bir State Machine çizilmiştir.
Mealen incelersek eğer; bir kapının açık veya kapalı durumlarına istinaden durum kontrolünü sağlayan bir State Machine mevzu bahistir. Eğer kapı kapalıysa ve ‘kapıyı_aç’ eylemi neticesinde kapı açılıyorsa durumu ‘açıldı’ olarak değiştirilmektedir. Yok eğer kapı açıksa ve ‘kapıyı_kapa’ eylemi neticesinde kapı kapanıyorsa bu seferde durumu ‘kapandı’ olarak değiştirilmektedir. İşte buradaki durum bilgisini tutan yapılanma State Machine’dir.
Bu örnekte kapının açılıp kapanması eylemine istinaden ‘açıldı’ ve ‘kapandı’ olmak üzere iki adet state mevcuttur. Haliyle buradan yola çıkarak State Machine yapılanmalarında state’lerin sınırlı olduğunu düşünebiliriz.
State Machine; aldığı input’a göre durum değiştiren ve sınırlı sayıda duruma sahip olan makinelerdir.
State Machine’i mantıksal olarak daha da güçlendirebilmek için farklı bir teorik örnek vermek gerekirse eğer buna internet üzerinden yapılan herhangi bir sipariş durumunu sunabiliriz.
- Ürünler sepete eklendi ve sipariş oluşturuldu (Siparis Olusturuldu state’i)
- Alınan ürünlerin stok bilgileri güncellendi (Stok Güncellendi state’i)
- Ödeme işlemi başarıyla gerçekleştirildi (Sipariş Tamamlandı state’i)
- Yetersiz stoktan dolayı sipariş iptal edildi (Sipariş Stok İptal state’i)
- Bakiye yetersizliğinden dolayı ödeme gerçekleştirilemedi (Sipariş Ödeme İptal state’i)
State Machine’ler durum geçiş tabloları veya diyagramlarla gösterilirler.
Aslında günlük hayatta State Machine mantığı çoğu yerde kullanılmaktadır. Buna metrolardaki turnikeler örnek olarak verilebilir. Bu turnikelerin ‘açık’ ve ‘kapalı’ olmak üzere iki durumları bulunmaktadır. Eylemsel açıdan inputları yolcuların kartlarını basmaları üzerinedir. Eğer kartta yeterli bakiye mevcutsa turnike ‘açık’ duruma gelir, yok eğer bakiye yetersizse ‘kapalı’ kalmaya devam eder. ‘açık’ durumda olan turnikeler birisinin geçmesi kaydıyla bir tur döndükten sonra ‘kapalı’ duruma geçerler.
Bir başka örnek vermemiz gerekirse eğer trafik ışıklarını ele alabiliriz. Mantıksal olarak belirli periyodik süreler zarfında inputlar devreye girer ve yeşil, sarı ve kırmızı durumlarına göre trafiği yönlendirmektedirler.
State Machine’i Pratik Örneklendirelim
Yazılımsal olarak State Machine’e dair onlarca farklı senaryoda pratik örnek sunabiliriz. Lakin bizler bu içeriğimizde iterasyonel mantıkta bir örnek sunuyor olacağız. Biliyorsunuz ki, C# programlama dilinde foreach
iterasyonu mevcuttur. Bu iterasyona verilen koleksiyon yahut dizi içerisindeki elemanlar sıralı bir şekilde elde edilerek işleme tabii tutulabilir. Taa ki sonuncu eleman elde edilene denk! Sonuncu elemandan sonra iterasyon sonlanır Peki iterasyon sonuncu elemanda sonlanacağını nereden bilebilir? İşte bu sorunun cevabı State Machine’de saklıdır…
Programatik açıdan iterasyon, yapısal olarak bir koleksiyondaki verilerin sıralı bir şekilde elde edilmesini sağlayan ve o andaki verinin devamında başka bir verinin olup olmamasına göre tetiklenen işlevselliğe sahip bir mantıktır. Yani sonraki veri varsa çalışmakta, yoksa durmaktadır. Buradan yola çıkarak iterasyon yapısında iki durum(state) olduğunu görebilmekteyiz. Sonraki veri ‘var’ ya da ‘yok’. İterasyonun ne olduğunu daha iyi anlayabilmek için C#’ta Iterator Kavramı ve yield Anahtar Sözcüğü başlıklı makalemi okuyabilirsiniz.
Şimdi gelin benzer mantıkta bir iterasyonel çalışma sergileyelim ve State Machine ile ilgili kısmını hep beraber görelim;
class Program { static void Main(string[] args) { ValueEnumerable v = new(); v.Add(1); v.Add(2); v.Add(3); while (v.MoveNext()) Console.WriteLine(v.Current); } } class ValueEnumerable { List<object> objects = new(); int currentIndex = -1; public void Add(object @object) => objects.Add(@object); public bool MoveNext() => currentIndex++ + 1 < objects.Count; public object Current => objects[currentIndex]; }
(Daha profesyonel bir iterasyonel tasarım için Iterator Design Pattern‘i inceleyebilirsiniz)
Yukarıdaki kod bloğunu derleyip, çalıştırırsanız eğer yandaki ekran çıktısıyla karşılaşacaksınız. Dikkat ederseniz ‘ValueEnumerable’ sınıfına verilen değerler her ne ise while
döngüsünde o kadarı ekrana yazdırılmış ve sonra ilgili döngüden çıkılarak akış sonlandırılmıştır. İşte burada mantıksal olarak döngüden çıkaran yapı State Machine ile ilgilidir. Mantığı ise şöyledir; ‘MoveNext’ metodu kendi içerisinde ‘currentIndex’ değerine bağlı bir şekilde ‘objects’ koleksiyonundaki eleman sayısına karşılık hangi hanede olduğunu kontrol etmekte ve sonrasında gelecek olan bir veri varsa geriye true döndürmektedir. Yani yukarıda bahsettiğimiz gibi sonraki veri için ‘var’ durumu söz konusudur. Aksi taktirde false döndüğünde ise ‘yok’ durumu söz konusu olmakta ve döngüden çıkılmaktadır. İşte burada ‘MoveNext’in her tetiklendiğinde ‘currentIndex’in değerinin +1 artması ve duruma göre sonucu belirlemesi input’ken, bu olayı kontrol eden genel yapılanma State Machine’dir.
Nihai olarak;
Bu makinelerin en önemli özelliği determinist olmalarıdır. Yani sürekli aynı input değerlerine karşılık hep aynı sonuçları üretmektedirler ve bu da aynı durumlara geçiş yapmaları anlamına gelir. Yani ne yapacakları/yapabilecekleri önceden bellidir/belirlenebilir. Haliyle teorik ve pratik açıdan ele almış ve günlük hayatta nerelerde, hangi mantıkla kullanıldığı üzerine bir nebze hasbihalde bulunmuş olduğumuz State Machine kavramını sizlere elimden geldiğince anlaşılır kılmaya çalıştım. Özellikle muhtemelen bu makalenin akabinde ele alacağımız Saga pattern’ın Orchestrator implemantasyonu içeriğinde State Machine kavramı merkezi rol üstlenecektir. Haliyle basitte olsa bu yapıya dair bilgili olmak bundan sonraki tüm çalışmalarımızda bizlere maksimum verimi sağlatacak ve faydalanma imkanı tanıyacaktır.
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
1 Cevap
[…] için State kavramını anlamak gerekmektedir. Bizler, önceden kaleme almış olduğumuz Finite-State Machine Nedir? başlıklı makalemizde bir program/yazılım için state’in ne manaya geldiğine […]