Statecharts: Hiyerarşik durum makineleri
(statecharts.dev)- Karmaşık sistemlerin davranışını görsel olarak yapılandıran bir biçimdir; temel state machine kavramını genişleterek state explosion sorununu ele alacak şekilde güçlendirilmiştir
- Davranış ile bileşenlerin ayrılması mümkün hale gelir; böylece davranışı değiştirmek ve kod üzerinde akıl yürütmek kolaylaşır, ayrıca bileşenden bağımsız test ve istisna durumlarını keşfetme için de uygundur
- Statechart oluşturma sürecinde olası durumların tamamı incelenir; ayrıca statechart tabanlı kodun geleneksel koda göre daha az hata içerdiğini gösteren araştırma sonuçları da vardır
- SCXML standardı ile çeşitli dillerdeki araç ve kütüphaneler sayesinde modeli okuyabilir, yazabilir ve çalıştırabilirsiniz; bu da entry/exit action gibi işlem sıralarının doğru ele alınmasına yardımcı olur
- Çalıştırılabilir machine format kullanılırsa tek bir tanım single source of truth olarak alınabilir; böylece çalışma zamanı davranışı ile diyagram birlikte korunur ve uygulama ile tasarımın senkron kalması önemli hale gelir
Statecharts genel bakış
- Statechart, karmaşık sistemleri ele almak için kullanılan görsel bir biçimdir ve temel state machine yapısının genişletilmiş halidir
- State machine büyüdükçe ortaya çıkan state explosion sorununu ele alacak şekilde güçlendirilmiştir
- Davranış diyagramla ifade edilebilir, ancak yazılım mühendisliğinde bu yaklaşım görselleştirmenin kendisinden çok davranış modelleme ve yapılandırmaya yakındır
- İlgili temel açıklamalar What is a state machine? ve What is a statechart? sayfalarında devam ediyor
Neden Statecharts kullanılır?
- Kolay anlaşılır bir yapı sunduğu için birçok başka kod biçimine göre kavraması daha kolaydır
- Davranış ile bileşenlerin ayrılması mümkündür
- Davranışı değiştirmek kolaylaşır
- Kod üzerinde akıl yürütmek kolaylaşır
- Davranış, bileşenden bağımsız olarak test edilebilir
- Statechart oluşturma sürecinde olası durumların tamamı incelenir
- Statechart tabanlı kodun geleneksel koda göre daha az hata içerdiğini gösteren araştırmalar vardır
- Gözden kaçması kolay istisna durumlarını ele almak için uygundur
- Karmaşıklık arttıkça ölçeklenebilirliği daha iyi olur
- Geliştirici olmayan kişilerin de anlaması kolaydır; QA ise bunu bir keşif aracı olarak kullanabilir
- Zaten birçok kod tabanı örtük olarak state machine içerir; statechart ise bunu açıkça görünür kılan bir yaklaşım olarak çalışır
Statecharts'un yükü ve itiraz nedenleri
- Yeni bir öğrenme maliyeti gerektirir
- Temel kavram olan state machine birçok programcıya zaten tanıdık olabilir
- Mevcut kodlama biçimlerinden oldukça farklı olduğu için alışılmadık bir paradigma gibi gelebilir
- Takım düzeyinde direnç oluşabilir
- Küçük statechart'larda davranışı ayırma süreci nedeniyle kod satırı sayısı artabilir
- Yaygın kullanılmamasının nedenleri arasında farkındalık eksikliği ve YAGNI birlikte etkili olur
- Yaygın karşı argümanlar arasında buna gerçekten gerek olmaması, belirli teknoloji akışlarına uymaması ve kütüphane sayısını artırması sayılır
- Web uygulamalarında yükleme süresi artabilir
- Bu artı ve eksiler birlikte değerlendirildiğinde bile benimsemenin etkisi genel olarak net pozitif olmaya yakındır
Kullanım şekli ve SCXML
- SCXML, 2005'ten 2015'e kadar W3C tarafından standartlaştırılmış bir biçimdir; statechart'ın çeşitli anlam kurallarını ve edge case işleme davranışlarını tanımlar
- Farklı dillerde SCXML okuyup yazabilen ve çalıştırabilen araçlar vardır
- Aynı modeli koruyup yalnızca sözdizimi farklı olan türev biçimler de bulunur
- Farklı platformlar için statechart kütüphaneleri vardır ve bunlar SCXML anlam kurallarını farklı düzeylerde destekler
- Bu tür kütüphaneler, entry/exit action gibi işlem sıralarının doğru ele alınmasına yardımcı olur
- Ek kullanım rehberi how to use statecharts sayfasında devam ediyor
Çalıştırılabilir Statecharts
- Statechart'ları yalnızca belge olarak kullanmak yerine, çalıştırılabilir machine format hem tasarımda hem çalışma zamanında birlikte kullanılabilir
- Tek bir tanım single source of truth olarak alınabilir; böylece gerçek çalışma zamanı davranışı ile görsel diyagram birlikte işletilebilir
- Diyagramı koda dönüştürme işi ortadan kalkar
- Elle çeviriden kaynaklanan hatalar azaltılabilir
- Diyagram ile uygulama her zaman senkronize durumda kalır
- Diyagram daha hassas hale gelir
- Buna karşılık diyagram oldukça karmaşık hale gelebilir
- Çalıştırılabilir statechart'lar için biçim ve araç seçenekleri sınırlıdır
- Statechart ile bileşenler arasındaki tip güvenliğini güçlü biçimde garanti etmek zordur
- Statechart tanımı kodun içindeyse, bu ifade kullanılarak görsel statechart otomatik üretilebilir
- Tanım JSON veya XML gibi ayrı bir dosyada olduğunda bu daha da basitleşir
Topluluk ve ek kaynaklar
- Topluluk sohbeti gitter.im üzerinde sürüyor ve giriş yapmadan da sohbet görüntülenebiliyor
- Soru-cevap niteliğindeki tartışmalar statecharts GitHub discussions üzerinde devam ediyor
- Kitaplar ve sunum materyalleri resources sayfasında toplanmış durumda
- Kendi hazırladığınız materyalleri GitHub Discussions üzerinde paylaşabilirsiniz
-
Ek okumalar
- Use case: Statecharts in User Interfaces
- Concepts — statechart'ın temel kavramları ve diyagramdaki görünümleri
- Glossary — sık kullanılan terimler ve tanımlar
- FizzBuzz — FizzBuzz üzerinden statechart kavramlarını ele alır
- Acknowledgements
1 yorum
Hacker News yorumları
statecharts'ın yeniden ilgi görmeye devam ettiğini görmek sevindirici
JS/TS için durum makineleri ve statecharts yazma/çalıştırma/görselleştirme kütüphanesi XState'i ben yaptım; şurada bulunabilir: https://github.com/statelyai/xstate
10 yıldan uzun süredir bunun üzerinde çalışırken öğrendiğim en önemli şey, statecharts'ın en büyük değerini onları basit bir doküman olarak değil, çalıştırılabilir davranış olarak ele aldığınızda sunduğudur
Her yerde kullanmak gerekmiyor; özellikle "sırada ne olacak?" sorusunun hem mevcut duruma hem de olaya bağlı olduğu durumlarda çok güçlü
Bu tür çizelgeler, "şu an bu durumdayken bu olay gelirse bir sonraki durum nedir ve hangi etkiler çalışır?" sorusunu yanıtlayan bir oracle gibi kullanılabilir
XState'in bir sonraki büyük sürüm alfası da neredeyse hazır; ergonomics, tip güvenliği, composability ve yeni visualizer/editor üzerine odaklanıyor
Temel açık kaynak görselleştirme aracı burada: https://sketch.stately.ai
Biçimsel belirtim tarafında SCXML okumaya değer: https://www.w3.org/TR/scxml
David Harel'in orijinal makalesi de çok değerli: https://www.weizmann.ac.il/math/harel/sites/math.harel/files/users/user50/Statecharts.pdf
Laracon'da state machines ve statecharts hakkındaki düşüncelerimi toparlayıp anlattığım bir konuşma videosu da var
https://www.youtube.com/watch?v=1A1xFtlDyzU
Özellikle çalıştırılabilir içerikte XML zorunluluğunu kaldırırken SCXML'e epey yakın duran, oldukça olgun bir implementasyon
prior art bölümünde XState de referans örneklerden biri olarak geçiyor
Bunu lit.js ile birlikte, sayfa genişliğine tepki veren ve çok sayıda props ile iç durum barındıran drawer tarzı bir navigasyon bileşeninde kullandım; XState olmasa ne kadar korkunç olacağını düşünmek bile istemiyorum
Sonraki sürümü de merakla bekliyorum, gerçekten teşekkürler
Otomatik TS tip çıkarımı oldukça iyi, bu yüzden hafif durum makinesi mantığı gereken yerlerde kullanması rahat
Eskiden frontend/UI ecosystem içinde statecharts'ın yavaş yavaş ivme kazandığı hissi vardı; nedense o akışın kaybolmuş olması üzücü
UI etkileşimlerinde durum makineleri, özellikle de statecharts gibi durum makinesi bileşimleri kullanmak, karmaşık akışları akıl yürütmeyi çok daha kolaylaştırıyor
Buna yeni başlıyorsanız Ian Horrucks'un "Constructing the user interface with statecharts" kitabını özellikle tavsiye ederim
1999 tarihli olsa da, bunu pratikte nasıl uygulayıp kullanmanız gerektiğini anlatan giriş düzeyi bir kaynak olarak hâlâ en iyilerden biri
https://archive.org/details/isbn_9780201342789/mode/2up
Haftalık npm indirmeleri 4 milyonu aşıyor; Rive ve LottieFiles gibi animasyon araçları da durum makinesi özelliklerini güçlü biçimde öne çıkarıyor
LangGraph gibi yapay zeka araçları da durum makinesi tabanlı bir yapı üzerine kurulu
Bu uygulama ve araçların statecharts'ın potansiyelini tam olarak açığa çıkarması zaman alacaktır ama başlangıç iyi
https://github.com/derkork/godot-statecharts
Giriş kaynaklarında sık atlanan konulardan biri history pseudo-states
H ve H kullanırsanız, dışarıdan bakıldığında statechart biçimsel olarak deterministik olmaktan çıkar
Genelde "mevcut durum, girdinin saf bir fonksiyonudur" diye anlatılır ama history bu varsayımı bozar
Üst duruma H üzerinden yeniden girerseniz, en son aktif olan çocuğa dönersiniz; dolayısıyla aynı olay ve aynı dış durum altında farklı iç durumlara girmeniz mümkündür
Gizli duran o "son aktif çocuk" da aslında bir durumdur ama genelde diyagramda çizilmez
Harel'in orijinal makalesi de bunu kabul ediyor; SCXML ve XState de bunu uyguluyor ama nedense bu kısım neredeyse hiç konuşulmuyor
Bu yüzden deep history ile alt ağaç durumunu yeniden girişte koruyorsanız, bookkeeping işini çizelge motoru tarafına taşımış oluyorsunuz
Bu makul bir tercih ama yalnızca şekle bakarak tüm davranışı açıklayamıyorsunuz; history geçişleri de diğer durum mantıkları gibi ayrıca test edilmeli
İkinci yorum benimsenirse makine tamamen deterministiktir ve deep history pointer da sadece durum makinesi durumunun bir parçasıdır
Örneğin H ve H düğümlerini birden fazla düğüme açabilir, H'yi de her düğümün önüne eklenen bir write-ahead log gibi düşünebilirsiniz
Temporal, DBOS, Restate gibi durable execution motorlarıyla statecharts'ı birleştirmenin mümkün olup olmayacağını merak ediyorum
Şirkette onboarding ve payment workflow'larını yönetirken Cloudflare Workflows kullanıyoruz; otomatik üretilen flowchart diyagramları sayesinde workflow davranışını hızlıca anlamak mümkün oluyor
Bu da sonuçta statecharts'ın hedeflediği değere oldukça benziyor
https://zindex.ai/
Yapay zekanın ürettiği diyagramlar çoğunlukla bir kez oluşturulup bırakılan Mermaid/SVG/PNG çıktıları oluyor; yani güncellenebilen, doğrulanabilen, diff alınabilen ve yeniden kullanılabilen kalıcı diyagram durumu bulunmuyor
Zindex diyagramın kendisini yapılandırılmış bir durum olarak ele alıyor
Agent'lar Diagram Scene Protocol (DSP) üzerinden node, edge, group, relation, constraint ve revision'ları patch ediyor; Zindex ise validation, layout, rendering, versioning ve storage işlerini üstleniyor
Böylece bunun Temporal/DBOS/Restate/Cloudflare Workflows yanına eklenebileceğini düşünüyoruz; yürütmenin asıl gerçeğini motor korurken, Zindex koddan veya yürütme geçmişinden türetilen kalıcı ve denetlenebilir görsel modeli yönetebilir
Aslında durable execution eklendiğinde statecharts da bunu rahatlıkla yapabilir
Cloudflare bir süre durable object actor modeli yönüne gidiyor gibiydi ama o projeyi kapatıp kapatmadıklarını bilmiyorum
Bu Cloudflare Workers içine yerleşik bir özellik mi, yoksa ekip içinde sizin geliştirdiğiniz bir şey mi?
XState'i gerçekten çok seviyorum
Birçok kod tabanında sayısız sorunu çözmeme yardımcı oldu; son dönemde de bankacılık için geliştirdiğimiz bir ses uygulamasının ana omurgası haline geldi
Buna bu kadar zaman ve emek harcayıp böylesine iyi bir araç çıkardığınız için teşekkürler
Sonlu durum makineleri deneyimimi ve XState + Mastra ile kurduğumuz mimariyi blogda biraz yazmıştım
Yayınlandıktan sonra Mastra'dan Pipecat'e geçtik
https://blog.davemo.com/posts/2026-02-14-deterministic-core-agentic-shell.html
Bunu da ekleyeyim
ETL State Chart ve Hierarchial FSM:
https://www.etlcpp.com/state_chart.html / https://www.etlcpp.com/hfsm.html
Quantum Leaps:
https://www.state-machine.com
Bunları daha çok safety-critical sistemlerde kullandım; burada karmaşıklık, zamanlama ve davranışın doğrulanabilirliği özellikle önemli
Karar verme ile eylemi ayırabilmek büyük fayda sağlıyor
"Şu anda bu durumdayken bu olay gelirse sırada ne yapacağız?" diye kararları sadeleştirme yaklaşımı, alışılmış program yapısından biraz farklı ama iyi bir ayrım sağlıyor ve farklı koşullarda davranışı akıl yürütmeyi kolaylaştırıyor
Durum makinelerinin daha yaygın benimsenmesini hep istedim
Yapay zekanın ürettiği kodu, insanların yazdığı kod kadar derinlemesine anlamadığımız bir dönemde state'in görsel olarak anlaşılması giderek daha önemli hale geliyor
Yine de frontend framework'lerinde store tabanlı reactive state daha çok tercih ediliyor gibi görünüyor
Ben de bunu varsayılan olarak kullanma eğilimindeyim; xstate gibi kütüphanelerin sözdizimini öğrenmenin daha zor ve daha ayrıntılı olduğu algısı da var
Ama yapay zeka ile bu engel neredeyse ortadan kalkıyor; bu yüzden gözden kaçırdığım başka nedenler mi var, yoksa statechart'lar hâlâ zirvesine ulaşmadı mı diye merak ediyorum
API yüzeyi küçülecek, öğrenme eğrisi düşecek ve hem geliştiricilerin hem de agent'ların yazması kolaylaşacak
Aynı zamanda güncel frontier modeller XState kodunu şimdiden epey iyi yazabiliyor
https://github.com/xlnfinance/xln projesi üzerinde çalışırken, gerçek ağı deterministik olarak emüle etmenin bir yoluna ihtiyaç duyduğumu fark ettim
Sonra tüm blockchain'lerin aslında birer replicated state machine olduğunu düşündüm; o halde neden her kullanıcı düğümünü Runtime -> Entity -> Account şeklinde 3 kademeli bir durum makinesi hiyerarşisi içine sarmayalım?
Dış makine içtekini tamamen kontrol ediyor; yani farklı uzlaşma modlarına sahip bir "blockchain içinde blockchain" resmi gibi
Sonrasında "hierarchical state machines" diye aratırken statecharts'a rastladım ve iki fikrin oldukça benzer olduğunu düşündüm
Bence daha fazla yazılım, determinizm eksikliğinin ürettiği en kötü hataları azaltmak için durum makinesi hiyerarşilerini kullanmalı
Otomotiv alanında bu yaklaşım uzun zamandır kullanılıyor
matlab/simulink'e bakarsanız, algoritmaları durum makinesi olarak çizip oradan kod üretmek mümkün
Yakın zamanda CSS transition'lar üzerinden birden çok görsel durum arasında gidip gelen epey karmaşık bir React bileşenini yönetmek için ben de bir durum makinesi uyguladım
Durum makinesinin kendisi çok zor değildi ama insanlar buna yeterince aşina değil gibi görünüyor
Şirkette ben Postgres iç yorumlayıcısını yaptıktan sonra tüm iş süreçlerini statecharts ile yürütmeye başladık
Deneyim çok iyiydi; süreçler değişime karşı oldukça dayanıklı hale geldi ve birkaç yıl sonra dönüp bakınca bile anlaması kolay kaldı
Kütüphaneyi de açık kaynak olarak yayımladım
https://github.com/kronor-io/statecharts