Memisahkan logika dan data dalam game browser

8

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 ICombatantDatadan 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 IEntityProvideryang 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.

Tesserex
sumber
Dugaan saya Combatant.entitytidak digunakan selama pertempuran dan karena itu seharusnya tidak ada. Mungkin Anda memerlukan kelas lain seperti EntityVsEntityCombatyang membungkus logika tempur, berisi Entity <--> Combatantpemetaan dan Entitystatus pembaruan setelah pertempuran selesai? Mungkin beberapa info lebih lanjut tentang arsitektur Anda saat ini dapat membantu.
Torious

Jawaban:

1

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 Charactermodel 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 membuatnyaCombatantLogicbertanggung 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 menerapkan die()metode terpisah yang sesuai ).

Saya setuju bahwa Anda Entityadalah bagian dari data. Namun, berdasarkan apa yang saya katakan, saya benar-benar akan cenderung menghilangkan atau membatasi peran Anda CombatantDatademi memiliki logika tempur menarik nilai langsung dari Entity, mungkin dengan CombatantDatahanya menyimpan nilai-nilai yang dihitung mahal, spesifik-tunggal-pertempuran-dihitung. Maket uji Anda kemudian akan lebih berorientasi pada penyediaan Entitymodel palsu daripada pada populasi CombatantData. (Memiliki CombatantDataduplikat banyak informasi dari Entitysaya 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 yakinCombatantDatabahkan harus menyediakan akses ke Entity.)

kekacauan
sumber
CombatantData tidak benar-benar menduplikasi data entitas, itu termasuk keadaan entitas dalam pertempuran, seperti kesehatan saat ini dan semua efek status di dalamnya.
Tesserex
@ Tesserex: Ah, baiklah. Jika keadaan itu tidak bertahan di antara pertempuran, maka itu masuk akal. Abaikan bagian itu, kalau begitu. :) Apakah semua yang saya katakan masuk akal?
kekacauan