Rupanya boost mengandung dua perpustakaan terpisah untuk mesin-mesin negara: Statechart dan Meta State Machine (MSM). Tagline memberikan deskripsi yang sangat mirip:
- Boost.Statechart - Mesin negara berhingga yang rumit secara arbitrer dapat diimplementasikan dalam kode C ++ yang mudah dibaca dan dipelihara.
- Meta State Machine - Pustaka berperforma sangat tinggi untuk mesin negara hingga UML2 ekspresif.
Apakah Anda tahu apa perbedaan utama dan apa pertimbangan dalam memilih di antara keduanya?
c++
boost
state-machine
boost-statechart
boost-msm
FireAphis
sumber
sumber
Jawaban:
Karena tampaknya ada banyak minat, perkenankan saya memberikan pendapat saya (yang jelas-jelas bias), yang karenanya harus diambil dengan sebutir garam:
Anda dapat membuat diri Anda pendapat yang lebih baik dengan mencari komentar yang diposting selama peninjauan MSM. Subjek ini banyak dibahas dalam daftar pengembang.
sumber
Seperti yang telah disebutkan Christophe, salah satu perbedaan utama antara kedua perpustakaan adalah kinerja runtime. Walaupun MSM mungkin menawarkan yang terbaik yang bisa Anda dapatkan di sini, Statechart secara sadar memperdagangkan memori dan siklus prosesor menuju skalabilitas yang lebih baik.
Dengan Boost.Statechart Anda dapat menyebarkan tata letak (yaitu status, transisi) mesin negara Anda ke beberapa unit terjemahan (file cpp) dengan cara yang tidak dapat Anda lakukan dengan MSM. Ini memungkinkan Anda untuk membuat implementasi FSM besar lebih mudah dikelola dan mendapatkan kompilasi yang jauh lebih cepat daripada dengan MSM.
Apakah overhead kinerja Statechart dibandingkan dengan MSM akan benar-benar signifikan untuk aplikasi Anda, seringkali cukup mudah untuk dijawab ketika Anda bertanya pada diri sendiri berapa banyak acara yang harus diproses aplikasi Anda per detik.
Dengan asumsi FSM yang cukup kompleks diimplementasikan dengan Boost.Statechart, berikut adalah beberapa angka rata-rata:
Mengenai beban CPU, jika jumlah acara untuk diproses jauh lebih rendah dari angka-angka ini, Boost.Statechart overhead dibandingkan dengan MSM hampir pasti tidak akan terlihat. Jika angkanya jauh lebih tinggi, Anda pasti lebih baik dengan MSM.
Informasi lebih mendalam tentang pengorbanan kinerja / skalabilitas dapat ditemukan di sini: http://www.boost.org/doc/libs/1_45_0/libs/statechart/doc/performance.html
sumber
Saat mengkode implementasi PPP saya sendiri, saya menggunakan Statechart karena tiga alasan: 1) Statechart lebih sederhana dan memiliki dokumentasi yang lebih jelas; 2) Saya sangat tidak menyukai UML :)
Boost docs mengatakan MSM setidaknya 20 kali lebih cepat, tetapi kompilasi cukup lambat untuk FSM besar.
sumber
Beberapa waktu lalu saya mulai dengan Statechart dan pindah ke MSM karena lebih mudah digunakan bersama dengan asio dari satu utas. Saya tidak berhasil menyatukan Statechart dan kemampuan multithreading-nya dengan penggunaan saya pada asio - kemungkinan semacam pemula yang tidak memahami Statechart di pihak saya. Saya menemukan bahwa MSM lebih mudah digunakan karena tidak membahas multithreading.
sumber
Sebagai jawaban atas keterlambatan Tim untuk berdiskusi (yang juga membahas salah satu komentar paling awal dari Lev).
Sebagai salah satu dari mereka yang berpendapat untuk keluar dari destruktor di statechart (argumen berdasarkan kasus penggunaan nyata, tentang interaksi dengan dunia nyata yaitu I / O) kembali ketika diajukan ke Boost, saya setuju ada masalah dalam menempatkan keluar logika dalam destruktor. David Abrahams secara mengejutkan membuat argumen persuasif tentang keselamatan pengecualian juga. Karena alasan itu, Statechart tidak mengharuskan Anda untuk menempatkan logika pada destruktor - tetapi memungkinkan Anda untuk - dengan saran yang biasa.
Logika yang seharusnya hanya dijalankan sebagai bagian dari transisi keluar dari keadaan (bukan penghancuran objek statechart secara keseluruhan) dapat (dan harus jika ada juga pembersihan sumber daya yang harus dilakukan) dipisahkan menjadi tindakan keluar () yang terpisah.
Untuk keadaan "tipis" tanpa keadaan aktif (sumber daya), cukup tindakan masuk / keluar untuk dilakukan, Anda dapat melakukan tindakan tersebut dalam ctor dan d'tor dan pastikan konstruktor dan destruktor tidak melempar. Tidak ada alasan bagi mereka untuk - tidak ada negara untuk melakukan RAII - tidak ada kejahatan dalam memiliki penanganan kesalahan di tempat-tempat ini menimbulkan peristiwa yang tepat. Anda mungkin masih perlu mempertimbangkan apakah Anda ingin tindakan keluar yang mengubah keadaan eksternal untuk berjalan pada kehancuran mesin negara ... dan menempatkannya dalam tindakan keluar jika Anda tidak ingin mereka terjadi dalam kasus ini ...
Statechart memodelkan aktivasi sebagai instantiasi objek, jadi jika konstruktor Anda memiliki pekerjaan / aktivasi / instantiasi nyata untuk dilakukan dan jika ia dapat gagal sehingga keadaan tidak dapat dimasukkan, Statechart mendukung itu dengan memberi Anda kemampuan untuk memetakan pengecualian terhadap suatu peristiwa. Ini ditangani dengan cara yang bekerja pada hierarki negara mencari keadaan luar yang menangani peristiwa pengecualian, analog dengan cara tumpukan akan membatalkan untuk model doa berdasarkan panggilan stack.
Ini semua didokumentasikan dengan baik - Saya sarankan Anda membaca dokumen dan mencobanya. Saya menyarankan Anda menggunakan destruktor untuk membersihkan "sumber daya perangkat lunak" dan keluar dari tindakan untuk melakukan "tindakan keluar dunia nyata".
Perlu dicatat bahwa propagasi pengecualian adalah sedikit masalah di semua lingkungan event driven, bukan hanya statechart. Cara terbaik untuk mempertimbangkan dan memasukkan kesalahan / kesalahan dalam desain statechart Anda dan jika dan hanya jika Anda tidak bisa menangani mereka dengan cara lain menggunakan pemetaan pengecualian. Setidaknya itu bekerja untuk saya - ymmmv ....
sumber