Saya punya masalah selanjutnya.
Item dapat memiliki banyak status:
NORMAL = 0000000
DRY = 0000001
HOT = 0000010
BURNING = 0000100
WET = 0001000
COLD = 0010000
FROZEN = 0100000
POISONED= 1000000
Suatu item dapat memiliki beberapa status pada saat yang bersamaan tetapi tidak semuanya
- Tidak mungkin kering dan basah pada saat yang sama.
- Jika Anda DINGIN item WET, itu berubah menjadi BEKU.
- Jika Anda HOT item WET, itu berubah menjadi NORMAL
- Item dapat BURNING dan RACUN
Dll
Saya telah mencoba mengatur bendera biner ke status, dan menggunakan DAN untuk menggabungkan berbagai status, memeriksa sebelumnya apakah mungkin atau tidak melakukannya, atau mengubah ke status lain.
Apakah ada pendekatan konkret untuk menyelesaikan masalah ini secara efisien tanpa harus beralih tanpa henti yang memeriksa setiap negara bagian dengan setiap negara bagian yang baru?
Ini relatif mudah untuk memeriksa 2 keadaan yang berbeda, tetapi jika ada keadaan ketiga itu tidak sepele untuk dilakukan.
c++
rpg
design-patterns
binary
vgonisanz
sumber
sumber
Jawaban:
Ketika saya perlu menggunakan flag, saya biasanya melakukan sesuatu di sepanjang baris ini.
Ini membuat menggunakannya untuk hal-hal seperti apply_cold () sangat mudah dan Anda jelas dapat membangun dalam kondisi Anda seperti kering dan basah.
sumber
Dua pengamatan:
COLD
danHOT
transisi dalam cara Anda menyebutkannya, bukan negara.Menggabungkan pengamatan itu akan menghasilkan sesuatu seperti ini:
sumber
Merepresentasikan status Anda sebagai bitmask seperti yang Anda tulis, Anda bisa menerjemahkan deskripsi kendala ke dalam kode:
Anda bisa membungkusnya menjadi suatu
makeStateConsistent()
yang dapat Anda panggil sebelum menguji bit negara untuk memastikan bahwa negara masuk akal.Namun, satu batasan dari pendekatan ini adalah tidak dapat menjelaskan urutan perubahan negara. Misalnya, jika Anda ingin memiliki hasil berbeda untuk item panas yang menjadi basah daripada untuk item basah yang menjadi panas, Anda tidak bisa melakukannya seperti ini: semua
makeStateConsistent()
metode yang dilihat adalah objek panas dan basah, tanpa informasi tentang cara Pasti seperti itu.Sebaliknya, apa yang bisa Anda lakukan yaitu membuat negara item yang swasta (setidaknya konseptual) dan memanipulasinya melalui serangkaian metode seperti
coolItem()
,heatItem()
,wetItem()
,dryItem()
dan sebagainya. Dengan begitu, metode perubahan negara sendiri dapat menangani setiap perubahan tambahan. Misalnya,heatItem()
metode ini mungkin terlihat seperti ini:Tentu saja, Anda mungkin masih ingin memiliki
makeStateConsistent()
metode sebagai cadangan, kalau-kalau Anda memiliki bug dalam metode perubahan negara Anda.Juga, dalam beberapa kasus Anda mungkin dapat menyederhanakan kode Anda dengan menghilangkan status yang tidak perlu. Sebagai contoh, apakah Anda benar-benar memerlukan
FROZEN
keadaan terpisah , atau apakah itu cukup untuk hanya memperlakukan barang-barang dingin dan basah sebagai beku?sumber