Menangani masalah web jika Anda dapat membuat mesin aturan di mana setiap aturan spesifik dikodekan secara independen. Penyempurnaan lebih lanjut untuk ini adalah membuat bahasa khusus domain (DSL) untuk membuat aturan, namun DSL sendiri hanya memindahkan masalah dari satu basis kode (utama) ke yang lain (DSL). Tanpa struktur, DSL tidak akan berjalan lebih baik daripada bahasa asli (Java, C # dll), jadi kami akan kembali ke sana setelah kami menemukan pendekatan struktural yang ditingkatkan.
Masalah mendasar adalah bahwa Anda mengalami masalah pemodelan. Setiap kali Anda menghadapi situasi kombinatorial seperti ini, itu adalah tanda yang jelas bahwa model abstraksi Anda yang menggambarkan situasinya terlalu kasar. Anda kemungkinan besar menggabungkan elemen yang seharusnya dimiliki oleh model yang berbeda dalam satu entitas.
Jika Anda terus mendobrak model Anda, pada akhirnya Anda akan sepenuhnya melarutkan efek kombinatorial ini. Namun ketika mengambil jalan ini mudah tersesat dalam desain Anda menciptakan kekacauan yang lebih besar, perfeksionisme di sini belum tentu teman Anda.
Mesin negara terbatas dan mesin aturan hanyalah contoh bagaimana masalah ini dapat dipecah dan dibuat lebih mudah dikelola. Gagasan utama di sini adalah bahwa cara yang baik untuk menghilangkan masalah kombinatorial seperti ini adalah sering membuat desain dan mengulanginya ad-mual di tingkat abstraksi bersarang sampai sistem Anda berkinerja memuaskan. Sejalan dengan bagaimana fraktal digunakan untuk membuat pola yang rumit. Aturannya tetap sama tidak masalah jika Anda melihat sistem Anda dengan mikroskop atau dari pandangan mata burung yang tinggi.
Contoh penerapan ini ke domain Anda.
Anda mencoba memodelkan bagaimana sapi bergerak melalui medan. Meskipun pertanyaan Anda tidak memiliki rincian, saya akan menebak bahwa jumlah besar Anda jika termasuk fragmen keputusan seperti if cow.isStanding then cow.canRun = true
tetapi Anda terjebak ketika Anda menambahkan rincian daerah misalnya. Jadi untuk setiap tindakan yang ingin Anda ambil, Anda harus memeriksa setiap aspek yang dapat Anda pikirkan dan ulangi verifikasi ini untuk tindakan selanjutnya yang mungkin.
Pertama kita perlu desain berulang kami, yang dalam hal ini akan menjadi FSM untuk memodelkan keadaan yang berubah dari simulasi. Jadi hal pertama yang akan saya lakukan adalah menerapkan referensi FSM, mendefinisikan antarmuka negara , antarmuka transisi , dan mungkin konteks transisiyang dapat berisi informasi yang dibagikan agar tersedia bagi dua lainnya. Implementasi FSM dasar akan beralih dari satu transisi ke yang lain terlepas dari konteksnya, di sinilah mesin aturan masuk. Mesin aturan bersih merangkum kondisi yang harus dipenuhi jika transisi akan berlangsung. Mesin aturan di sini bisa sesederhana daftar aturan yang masing-masing memiliki fungsi evaluasi mengembalikan boolean. Untuk memeriksa apakah suatu transisi harus kita lakukan, lakukan iterasi pada daftar aturan dan jika ada yang salah, transisi tersebut tidak terjadi. Transisi itu sendiri akan berisi kode perilaku untuk mengubah keadaan FSM saat ini (dan tugas-tugas lain yang mungkin).
Sekarang, jika saya mulai mengimplementasikan simulasi sebagai FSM besar tunggal pada level ALLAH saya berakhir dengan BANYAK keadaan yang mungkin, transisi dll. Jika-selain kekacauan terlihat seperti sudah diperbaiki tetapi sebenarnya hanya tersebar, masing-masing JIKA adalah sekarang aturan yang melakukan pengujian terhadap informasi spesifik konteks (yang pada titik ini cukup banyak mengandung segalanya) dan setiap badan IF berada di suatu tempat dalam kode transisi.
Masukkan rincian fraktal: langkah pertama adalah membuat FSM untuk setiap sapi di mana negara bagian adalah keadaan internal sapi itu sendiri (berdiri, berlari, berjalan, merumput dll) dan transisi di antara mereka akan dipengaruhi oleh lingkungan. Ada kemungkinan bahwa grafik tidak lengkap, misalnya penggembalaan hanya dapat diakses dari status tegakan, setiap transisi lain tidak disetujui karena hanya tidak ada dalam model. Di sini Anda secara efektif memisahkan data dalam dua model berbeda, sapi dan medan. Masing-masing dengan properti itu sendiri diatur. Rincian ini memungkinkan Anda menyederhanakan desain mesin secara keseluruhan. Sekarang alih-alih memiliki mesin aturan tunggal yang memutuskan semua yang Anda miliki, mesin aturan lebih sederhana (satu untuk setiap transisi) yang memutuskan detail yang sangat spesifik.
Karena saya menggunakan kembali kode yang sama untuk FSM, ini pada dasarnya adalah konfigurasi FSM. Ingat ketika kami menyebutkan DSL sebelumnya? Di sinilah DSL dapat melakukan banyak hal baik jika Anda memiliki banyak aturan & transisi untuk ditulis.
Lebih dalam
Sekarang ALLAH tidak lagi harus berurusan dengan semua kerumitan dalam mengelola kondisi internal sapi, tetapi kita bisa mendorongnya lebih jauh. Sebagai contoh, masih ada banyak kerumitan dalam mengelola medan. Di sinilah Anda memutuskan di mana kerusakan cukup. Jika misalnya dalam ALLAH Anda, Anda akhirnya mengelola dinamika medan (rumput panjang, lumpur, lumpur kering, rumput pendek dll) kami dapat mengulangi pola yang sama. Tidak ada yang mencegah Anda menanamkan logika seperti itu di medan itu sendiri dengan mengekstraksi semua keadaan medan (rumput panjang, rumput pendek, berlumpur, kering, dll.) Ke FSM medan baru dengan transisi antara negara dan mungkin aturan sederhana. Misalnya untuk mencapai kondisi berlumpur, mesin aturan harus memeriksa konteks untuk menemukan cairan, jika tidak, itu tidak mungkin. Sekarang ALLAH masih lebih sederhana.
Anda dapat melengkapi sistem FSM dengan membuat mereka otonom dan memberi mereka masing-masing utas. Langkah terakhir ini tidak perlu tetapi memungkinkan Anda untuk mengubah interaksi sistem secara dinamis dengan menyesuaikan bagaimana Anda mendelegasikan pengambilan keputusan Anda (meluncurkan FSM khusus atau hanya mengembalikan negara yang ditentukan sebelumnya).
Ingat bagaimana kami menyebutkan bahwa transisi juga dapat melakukan "tugas lain yang mungkin"? Mari kita telusuri dengan menambahkan kemungkinan model yang berbeda (FSM) untuk berkomunikasi satu sama lain. Anda dapat menetapkan serangkaian acara dan memungkinkan setiap FSM untuk mendaftarkan pendengar acara ini. Jadi, jika, misalnya seekor sapi memasuki hex medan, hex dapat mendaftarkan pendengar untuk perubahan transisi. Di sini menjadi sedikit rumit karena setiap FSM diimplementasikan pada tingkat yang sangat tinggi tanpa sepengetahuan domain spesifik yang disimpannya. Namun Anda dapat mencapai ini dengan meminta sapi itu menerbitkan daftar peristiwa dan sel dapat mendaftar jika ia melihat peristiwa yang dapat bereaksi. Hirarki acara keluarga yang baik di sini adalah investasi yang bagus.
Anda dapat mendorong lebih dalam lagi dengan memodelkan tingkat nutrisi dan siklus pertumbuhan rumput, dengan ... Anda dapat menebaknya ... rumput FSM yang tertanam dalam model patch medan sendiri.
Jika Anda mendorong gagasan itu cukup jauh, ALLAH hanya memiliki sedikit hal untuk dilakukan karena semua aspeknya cukup banyak dikelola sendiri, membebaskan waktu untuk dihabiskan untuk hal-hal yang lebih saleh.
Rekap
Seperti yang dinyatakan di atas FSM di sini bukan solusi, hanya sarana untuk menggambarkan bahwa solusi untuk masalah seperti itu tidak ditemukan dalam kode per katakan tetapi bagaimana Anda memodelkan masalah Anda. Kemungkinan besar ada solusi lain yang mungkin dan kemungkinan besar jauh lebih baik daripada proposisi FSM saya. Namun pendekatan "fraktal" tetap merupakan cara yang baik untuk mengelola kesulitan ini. Jika dilakukan dengan benar, Anda dapat secara dinamis mengalokasikan tingkat yang lebih dalam di mana itu penting sambil memberikan model yang lebih sederhana di mana itu kurang penting. Anda dapat mengantri perubahan dan menerapkannya saat sumber daya tersedia. Dalam urutan tindakan mungkin tidak terlalu penting untuk menghitung transfer nutrisi dari sapi ke tambalan rumput. Namun Anda dapat merekam transisi ini dan menerapkan perubahan di lain waktu atau hanya perkiraan dengan tebakan yang berpendidikan hanya dengan mengganti mesin aturan atau mungkin mengganti implementasi FSM sama sekali dengan versi naif yang lebih sederhana untuk elemen yang tidak berada dalam bidang langsung dari bunga (bahwa sapi di ujung lain lapangan) untuk memungkinkan interaksi yang lebih rinci untuk mendapatkan fokus dan sumber daya yang lebih besar. Semua ini tanpa pernah meninjau kembali sistem secara keseluruhan; karena setiap bagian terisolasi dengan baik, menjadi lebih mudah untuk membuat penggantian drop-in yang membatasi atau memperluas kedalaman model Anda. Dengan menggunakan desain standar, Anda dapat mengembangkannya dan memaksimalkan investasi yang dibuat dalam alat ad-hoc seperti DSL untuk menetapkan aturan atau kosa kata standar untuk acara, sekali lagi mulai dari tingkat yang sangat tinggi dan menambahkan penyempurnaan yang diperlukan. karena setiap bagian terisolasi dengan baik, menjadi lebih mudah untuk membuat penggantian drop-in yang membatasi atau memperluas kedalaman model Anda. Dengan menggunakan desain standar, Anda dapat mengembangkannya dan memaksimalkan investasi yang dibuat dalam alat ad-hoc seperti DSL untuk menetapkan aturan atau kosa kata standar untuk acara, sekali lagi mulai dari tingkat yang sangat tinggi dan menambahkan penyempurnaan yang diperlukan. karena setiap bagian terisolasi dengan baik, menjadi lebih mudah untuk membuat penggantian drop-in yang membatasi atau memperluas kedalaman model Anda. Dengan menggunakan desain standar, Anda dapat mengembangkannya dan memaksimalkan investasi yang dibuat dalam alat ad-hoc seperti DSL untuk menetapkan aturan atau kosa kata standar untuk acara, sekali lagi mulai dari tingkat yang sangat tinggi dan menambahkan penyempurnaan yang diperlukan.
Saya akan memberikan contoh kode tetapi ini yang bisa saya lakukan saat ini.