Bagaimana upaya saya dalam mempelajari cara menggunakan Finite State Machines berjalan lancar.

Satu hal yang ingin saya capai dalam beberapa bulan terakhir adalah pengorganisasian kode dan pola desain yang tepat. Manajemen kode yang tepat bagi saya adalah konsep yang penting untuk dipahami, karena memaksa Anda membuat kode sedemikian rupa sehingga mudah dimanipulasi dan dimengerti. Kegagalan untuk memiliki basis kode yang terorganisir dapat menyebabkan kode Anda menjadi seperti "ini" atau "ini", yang kemudian mengarah pada bentuk kode spageti yang mengerikan.

Salah satu metode ini dikenal sebagai “Pola Negara”, dan merupakan metode yang telah saya coba.

Apa masalahnya?

Bayangkan Anda sedang mengembangkan sistem pergerakan pemain untuk sebuah game. Anda ingin bisa bermalas-malasan, berjalan, berlari, dan melompat. Masing-masing negara bagian ini memiliki pengaturan unik yang tertanam di dalamnya untuk menentukan bagaimana pemain akan bergerak, jika mereka bisa. Berjalan akan membuat Anda bergerak dengan kecepatan sedang, berlari dengan kecepatan lebih cepat, tidak melakukan gerakan sama sekali, dan melompat akan membuat Anda bergerak pada sumbu Y.

Satu hal yang harus kita pastikan dalam sistem seperti ini adalah bahwa negara-negara harus saling eksklusif; Anda tidak bisa berlari dan berjalan pada saat yang bersamaan.

Salah satu cara kita dapat menerapkan sistem tersebut adalah sebagai berikut:

Kami memiliki empat status dari variabel enum, yang dievaluasi dalam serangkaian pernyataan if di loop Pembaruan. Kode ini mungkin terlihat agak menggelikan, tetapi sesuai dengan tujuan kami, kode tersebut berfungsi dengan baik.

Namun kemudian masalah muncul ketika Anda ingin memperluas sistem dengan menambahkan lebih banyak negara bagian atau menambahkan fungsionalitas kompleks untuk setiap negara bagian. Jika kita menambahkan keadaan lain, kita harus menulis fungsinya dalam file yang sama, serta pernyataan if lainnya untuk memeriksa apakah kita dapat bertransisi ke keadaan itu. Ini juga merupakan mimpi buruk jika menyangkut gagasan “Tanggung Jawab Tunggal” untuk kelas ini, karena kelas ini tidak hanya bertanggung jawab atas setiap negara bagian dan fungsinya, tetapi juga transisinya.

Bagaimana cara mengatasi masalah ini?

Di sinilah pola negara membantu. Idenya adalah kita harus membuat kelas untuk setiap keadaan unik dalam pergerakan pemain kita, dan kemudian memasukkannya melalui mesin keadaan yang terbatas.

Diagram mungkin bisa membantu

Ini adalah diagram UML dari pola keadaan. Ini mungkin terlihat menakutkan, tapi saya akan menjelaskannya semampu saya.

Kita mempunyai mesin status, dalam hal ini disebut “Konteks”, yang memasukkan data dalam bentuk “Status” dan berfungsi berdasarkan status tersebut. Negara bagian itu sendiri bertindak sebagai induk bagi “Negara Beton”, yang merupakan negara bagian itu sendiri. Induk negara bagian memiliki fungsi yang konstan di seluruh turunannya, dalam hal ini adalah “handle()”.

Upaya Implementasi Saya

Sekarang saya akan memberikan implementasinya. Ingatlah bahwa tidak ada jawaban yang salah di sini, dan jika Anda yakin kode saya dapat diperbaiki, beri tahu saya.

Dalam kasus kita, kita memiliki kelas “PlayerMovement” yang bertindak sebagai “Konteks”, kemudian kita memiliki kelas abstrak yang disebut “State”, lalu terakhir kita memiliki status pergerakan itu sendiri dalam bentuk “WalkingState”, “IdlingState”, “Status Berlari” dan “Status Lompatan”; semuanya merupakan warisan dari “Negara”.

Mari kita lihat aksinya.

Inilah kelas “PlayerMovement”.

Kemudian kelas “Negara”.

Dan inilah kelas “IdlingState” yang strukturnya identik dengan negara bagian lainnya.

Jadi seperti yang Anda lihat, kami telah memisahkan fungsionalitas dalam satu kelas besar ke beberapa kelas yang lebih kecil. Setiap negara bagian bertanggung jawab atas pergerakan pemain, tetapi dalam interpretasinya sendiri. Mereka juga bertanggung jawab untuk memutuskan kapan akan melakukan transisi ke negara bagian lain.

Metode memisahkan negara bagian ke dalam kelasnya sendiri memungkinkan kita membuat fungsionalitas khusus dengan cara yang kohesif dan bersih.

Bisakah kita memperbaikinya?

Pola status ini sangat baik untuk memisahkan fungsionalitas setiap status, dan memastikan bahwa sistem mudah digunakan, dibaca, dan diperluas. Satu-satunya masalah adalah bahwa hal ini pun menjadi sulit untuk dikelola ketika sejumlah besar negara bagian diperkenalkan.

Ingat; untuk setiap negara bagian, kita juga harus mengonfigurasi transisinya ke negara bagian lain yang relevan, dan dalam beberapa kasus, kita mungkin harus mengulangi upaya tersebut untuk mencapai hal ini.

Berikut ini contohnya; Dapat dikatakan bahwa dari kondisi berjalan, berlari, dan diam, kita seharusnya dapat bertransisi ke kondisi melompat. Masalahnya adalah kita menulis kode yang sama untuk memeriksa apakah kita dapat beralih ke melompat.

Solusinya adalah dengan menerapkan Mesin Status Hierarki,di mana kita mengelompokkan negara-negara terkait yang disebut sub negara bagian menjadi negara super. Negara bagian super tersebut bertindak sebagai pusat fungsi negara bagian umum, dan negara bagian luar dapat bertransisi ke negara bagian super tersebut, namun tidak dapat melakukan transisi ke sub negara bagiannya.

Saya memiliki sedikit pengalaman dalam mesin status hierarki sehingga saya tidak dapat menunjukkan cara penerapannya, namun hal ini adalah sesuatu yang ingin saya sampaikan.

Mesin negara cukup sederhana untuk dipahami, tetapi memahami bagaimana dan kapan menerapkannya bisa jadi cukup menantang. Jika Anda kesulitan, saya sarankan untuk mencoba menerapkan skenario seperti yang telah saya uraikan.

Adakah kasus penggunaan lainnya?

Pola negara sangat fleksibel. Salah satu kasus penggunaan yang paling umum adalah dalam game Artificial Intelligence.

Anda dapat membuat musuh berpindah dari satu negara ke negara lain, dari “Menyerang” ke “Patroli”, “Mengejar” ke “Investigasi”, dll. Anda juga dapat memiliki kondisi kesehatan dengan karakter seperti “Limping”, “Sehat” atau “Kritis ”. Kasus penggunaannya hampir tidak ada habisnya, jadi memahami Finite State Machines pasti dapat memberi Anda keunggulan dalam karier pemrograman Anda.

Terima kasih telah membaca artikel saya, saya harap Anda menikmati membacanya saat saya menulisnya. Saya harap Anda menantikan beberapa posting saya berikutnya.

Sampai jumpa!