Saya sudah memikirkan hal ini selama berhari-hari dan saya masih tidak yakin apa yang harus saya lakukan. Saya mencoba untuk memperbaiki sistem pertarungan di PHP (... maaf.) Inilah yang ada sejauh ini:
- Ada dua (sejauh) jenis entitas yang dapat berpartisipasi dalam pertempuran. Sebut saja mereka pemain dan NPC. Data mereka sudah ditulis dengan cukup baik.
- Ketika terlibat dalam pertempuran, entitas ini dibungkus dengan objek lain dalam DB yang disebut
Combatant
, yang memberi mereka informasi tentang pertarungan tertentu. Mereka dapat terlibat dalam banyak pertarungan sekaligus. - Saya mencoba menulis mesin logika untuk pertempuran dengan menyuntikkan para petarung ke dalamnya.
- Saya ingin bisa mengejek segalanya untuk pengujian.
Untuk memisahkan logika dan data, saya ingin memiliki dua antarmuka / kelas dasar, yang satu ICombatantData
dan yang lainnya ICombatantLogic
. Dua pelaksana data akan menjadi satu untuk objek nyata yang disimpan dalam database, dan yang lainnya untuk objek tiruan saya.
Saya sekarang menghadapi ketidakpastian dengan mendesain sisi logis dari banyak hal. Saya dapat memiliki satu pelaksana untuk masing-masing pemain dan NPC, tetapi kemudian saya memiliki masalah. Seorang pejuang harus dapat mengembalikan entitas yang dibungkusnya. Haruskah metode pengambil ini menjadi bagian dari logika atau data? Saya merasa sangat bahwa itu harus dalam data, karena bagian logika digunakan untuk mengeksekusi pertempuran, dan tidak akan tersedia jika seseorang hanya mencari informasi tentang pertarungan yang akan datang. Tetapi kelas data hanya memisahkan tiruan dari DB, bukan pemain dari NPC. Jika saya mencoba memiliki dua kelas anak-anak dari pelaksana data DB, satu untuk setiap jenis entitas, lalu bagaimana cara membuat arsitek itu sambil menjaga tiruan saya di loop? Apakah saya memerlukan antarmuka ketiga seperti IEntityProvider
yang saya masukkan ke dalam kelas data?
Juga dengan beberapa ide yang telah saya pertimbangkan, saya merasa seperti saya harus meletakkan cek di tempat untuk memastikan Anda tidak cocok, seperti membuat logika untuk NPC tanpa sengaja membungkus data untuk pemain. Apakah itu masuk akal? Apakah itu situasi yang bahkan mungkin terjadi jika arsitekturnya benar, atau akankah desain yang tepat melarang itu sepenuhnya sehingga saya tidak perlu memeriksanya?
Jika seseorang dapat membantu saya hanya membuat diagram kelas atau sesuatu untuk ini, itu akan banyak membantu saya. Terima kasih.
sunting
Juga berguna untuk dicatat, kelas data tiruan tidak benar-benar membutuhkannya Entity
, karena saya hanya akan menentukan semua parameter seperti statistik pertarungan secara langsung. Jadi mungkin itu akan mempengaruhi desain yang benar.
sumber
Combatant.entity
tidak digunakan selama pertempuran dan karena itu seharusnya tidak ada. Mungkin Anda memerlukan kelas lain sepertiEntityVsEntityCombat
yang membungkus logika tempur, berisiEntity <--> Combatant
pemetaan danEntity
status pembaruan setelah pertempuran selesai? Mungkin beberapa info lebih lanjut tentang arsitektur Anda saat ini dapat membantu.Jawaban:
Bagian dari cara saya mendekati ini di masa lalu adalah, daripada memiliki representasi yang sepenuhnya terpisah untuk pemain dan NPC sementara mengharuskan mereka berdua mengimplementasikan antarmuka yang sama, mendorong menuju konvergensi representasi di antara mereka sejauh yang saya bisa, karena dengan mensubklasifikasi mereka dari
Character
model umum ke mana saya mendorong sebanyak mungkin tentang mereka sehingga masuk akal untuk menggeneralisasi. Ini membantu menghindari masalah dengan menjalankan operasi NPC pada pemain dan seperti itu dengan membuat operasi lebih umum berlaku, karena ada kecenderungan yang kurang alami untuk representasi berbeda daripada jika mereka sepenuhnya implementasi independen. Leveraging dasar polimorfisme membantu menangani kasus-kasus yang harus menyimpang (misalnya, jika Anda membuatnyaCombatantLogic
bertanggung jawab untuk menangani apa yang terjadi ketika seseorang meninggal, Anda harus melakukan pemeriksaan ketik untuk memastikan Anda menggunakan logika yang benar; jadi jangan, minta pemain dan NPC menerapkandie()
metode terpisah yang sesuai ).Saya setuju bahwa Anda
Entity
adalah bagian dari data. Namun, berdasarkan apa yang saya katakan, saya benar-benar akan cenderung menghilangkan atau membatasi peran AndaCombatantData
demi memiliki logika tempur menarik nilai langsung dariEntity
, mungkin denganCombatantData
hanya menyimpan nilai-nilai yang dihitung mahal, spesifik-tunggal-pertempuran-dihitung. Maket uji Anda kemudian akan lebih berorientasi pada penyediaanEntity
model palsu daripada pada populasiCombatantData
. (MemilikiCombatantData
duplikat banyak informasi dariEntity
saya mengganggu dengan cara yang sama seperti database denormalized. Namun, jika Anda percaya pada Hukum Demeter, yang saya tidak sukai, Anda tidak akan ingin melakukan hal-hal seperti saya Saya menyarankan. Tentu saja, jika Anda percaya pada Hukum Demeter, saya tidak yakinCombatantData
bahkan harus menyediakan akses keEntity
.)sumber