Apakah Desain Berbasis Domain bagus untuk permainan?


10

Saya baru saja membaca tentang model Domain dan itu memberi saya pencerahan karena saya telah mengembangkan game yang memiliki kelas yang hanya menyimpan data (beberapa perilaku / metode). Saya menugaskan pekerjaan menangani kelas-kelas ini kepada para manajer ... dan sekarang manajer saya tampaknya terlihat seperti objek Dewa. Objek permainan saya yang seharusnya menangani logika hanyalah model domain anemia.

Pola desain saya saat ini adalah di Singleton dan saya ingin melakukan pengodean ulang untuk menyelesaikan masalah ini. Saya belum pernah melihat DDD di game (sampai sekarang) tetapi apakah ini pendekatan yang baik? Saya hanya seorang programmer pemula (cenderung ke game dev't) jadi saya ingin belajar lebih banyak tentang arsitektur yang baik sebelum game terlalu membengkak untuk mendesain ulang.


2
Saya dapat mengatakan bahwa desain yang populer untuk game adalah arsitektur Komponen. Sebuah desain baru yang mendapatkan beberapa bermain di tepi mesin game pendarahan adalah desain berorientasi data (hanya berarti bahwa bagaimana data ditempatkan dalam memori adalah perhatian desain tertinggi sebenarnya). Tapi saya tidak bisa berbicara dengan Domain Driven Design di video game .. jadi karenanya, hanya sebuah komentar.
James

Game bukan aplikasi bisnis. Arsitektur suara dalam aplikasi bisnis (DDD / CQRS) jelas tidak terdengar dalam game, dan sebaliknya. Mengapa tidak meneliti model dekorator, atau model komponen? Itu "bagus" untuk gim dan akan meringankan masalah lajang Anda - bahkan dengan mengatakan bahwa, lajang biasanya baik-baik saja dalam gim; terutama jika Anda melakukan pengembangan indie. Berkonsentrasilah pada penyelesaian sesuatu, kalau tidak Anda akan mendarat seperti saya dengan arsitektur yang hebat, tetapi tidak ada permainan.
Jonathan Dickinson

Terima kasih untuk sarannya. Saya akan membaca tentang desain Komponen. Saya akan menyelesaikan game yang sedang saya kerjakan meskipun desainnya tidak begitu bagus. Saya memiliki tenggat waktu lol bulan November ini. Saya telah menghapus konsep Singleton dan saya menyuntikkan modul ke objek yang membutuhkannya. Saya kira itu sudah cukup untuk saat ini tetapi saya perlu belajar lebih banyak.
Sylpheed

Jawaban:


12

Saya belum pernah mendengar desain berbasis domain sebelum posting Anda. Melihat sekilas pada beberapa referensi - di sini dan di sini - tampaknya menunjukkan bahwa itu hanya nama yang bagus untuk metode pemrograman berorientasi objek tradisional tahun 90-an yang saya ajarkan di universitas, di mana Anda mencoba dan menulis kelas untuk setiap kata benda yang muncul dalam situasi yang Anda coba model dengan perangkat lunak, sehingga struktur perangkat lunak tampaknya mengikuti struktur konsep dunia nyata.

Dengan demikian, jawaban saya untuk ini adalah bahwa itu tidak "baik". Ini biasanya merupakan titik awal yang masuk akal tetapi terbukti tidak memadai saat Anda melanjutkan. Anda jarang memiliki satu domain tetapi beberapa domain berbeda dalam satu perangkat lunak - misalnya, Anda mungkin memiliki domain game (dunia, karakter, item), domain renderer (shader, jerat, bahan-bahan), domain input (sistem file, jaringan, keyboard dan mouse), dan masalah muncul ketika domain tumpang tindih dan saling mempengaruhi. Seringkali dalam perjalanan menggabungkan 2 domain bersama, Anda menyadari bahwa sebenarnya ada ketergantungan di sana yang membutuhkan perubahan, yang berarti salah satu representasi Anda menjadi lebih menjadi beban daripada bantuan.

Contoh samar mungkin adalah perpustakaan matematika di konsol dan karakter dalam game Anda. Perpustakaan matematika Anda akan ingin memiliki daftar data yang besar dan kemudian 1 instruksi untuk dilakukan pada daftar itu, untuk berjalan secara efisien. Karakter dalam gim Anda masing-masing akan memiliki set data verteks sendiri untuk rendering dan animasi, dll. Sekarang, bagaimana Anda mendapatkan daftar panjang semua data verteks dari masing-masing karakter Anda untuk dapat menanganinya dalam sekali jalan? Anda bisa melakukan operasi penyalinan lambat, atau sebaliknya Anda bisa memperbaiki karakter Anda sehingga data mereka lebih dapat diproses oleh perpustakaan matematika - tetapi kemudian salah satu domain Anda mogok untuk memilih yang lain.

Secara pribadi saya sangat waspada terhadap label yang menyerupai "Apapun-Didorong-Desain". Perangkat lunak terlalu luas dan terlalu rumit untuk membuatnya menjadi pendekatan satu ukuran untuk semua. Sebaliknya, ketika mencoba menulis perangkat lunak terbaik yang saya bisa, saya mencoba dan kembali pada prinsip-prinsip SOLID . Ini memberi Anda ide bagus tentang seberapa baik kode Anda, tanpa menjanjikan obat mujarab dari metode yang dapat Anda ikuti dan secara ajaib sampai pada kode yang baik. Sayangnya, tanpa metodologi terlampir seperti itu, dibutuhkan banyak pengalaman sebelum Anda belajar bagaimana menyesuaikan diri dengan pedoman ini, yang mungkin mengapa begitu banyak orang menyukai metodologi ini.

Mengenai masalah Anda memiliki kelas anemia dan objek manajer, ini biasanya adalah sesuatu yang dibahas dalam pelajaran orientasi objek pengantar dan tidak benar-benar mengharuskan Anda mematuhi metodologi khusus untuk 'memperbaikinya'. (Anda mungkin ingin mengambil buku tentang pemrograman berorientasi objek jika Anda baru saja memulai.) Kelas adalah gabungan dari keadaan dan perilaku, di mana perilaku memodifikasi keadaan itu, dan ini disebut enkapsulasi. Secara umum Anda mencoba dan merangkum sebanyak mungkin, yang berarti bahwa negara harus dimanipulasi oleh objek itu sendiri (dan hanya objek itu). Hanya untuk perilaku yang tidak dapat dimodelkan dalam kelas yang akan Anda delegasikan ke kelas eksternal, seperti manajer, itulah sebabnya keberadaan kelas manajer sering dianggap sebagai tanda kode berorientasi objek yang ditulis dengan buruk.

Pola desain saya saat ini adalah di Singleton dan saya ingin melakukan pengodean ulang untuk menyelesaikan masalah ini.

Saya tidak tahu apa yang Anda maksud dengan kalimat itu. Pola desain adalah cara yang terkenal untuk menulis sebagian kecil dari program Anda. Anda tidak akan memiliki pola desain 'saat ini', juga tidak akan membentuk sisa program Anda. Untuk pemula, pola-pola ini berguna untuk membuat Anda berada di jalur yang benar, sedangkan bagi para ahli mereka lebih merupakan cara untuk berkomunikasi tentang situasi kode umum. Namun satu hal penting: lajang hampir selalu merupakan ide yang buruk, dan Anda harus menghindarinya kapan pun memungkinkan. Anda dapat menemukan banyak pendapat tentang lajang di situs ini dan di Stack Overflow, tetapi di sini ada satu pertanyaan praktis dengan jawaban yang membantu Anda menghindari membutuhkannya.


Oke, izinkan saya sedikit mengubah pertanyaan. Apakah ada perbedaan antara model domain dan desain berbasis domain? Gagasan saya tentang model domain adalah bahwa sebuah kelas harus dapat menangani sendiri tanpa mengandalkan pengontrol / manajer sebanyak mungkin. Desain saya saat ini mengalahkan tujuan ini. Saya mungkin salah paham akan sesuatu. Jadi dalam game RPG, kelas pemain saya memiliki domain sendiri dan terdiri dari domain yang berbeda seperti skill, item, dll.
Sylpheed

Ya, sebuah kelas harus dapat menangani dirinya sendiri tanpa mengandalkan pengontrol / manajer sebanyak mungkin, tetapi itu tidak ada hubungannya dengan model domain dan hanya pendekatan standar pemrograman berorientasi objek. Tidak jelas apa yang mungkin Anda salah pahami karena saya tidak tahu mengapa Anda memiliki kelas manajer ini.
Kylotan

Saya tidak melihat bagaimana membuat modul saya berfungsi tanpa manajer atau kelas yang menanyakan objek saya. Sebagai contoh, saya memiliki modul untuk pencarian. Agar saya dapat mengakses pencarian yang tepat, saya harus meminta dari manajer. Jadi bagaimana saya membahas ini tanpa manajer?
Sylpheed

Apa pencarian 'benar'? Bagaimana manajer tahu apa yang benar? Dugaan saya adalah bahwa logika yang membuat keputusan seperti itu mengacu pada objek lain untuk membuatnya, dan objek lain tersebut adalah kandidat yang lebih baik untuk fungsi ini.
Kylotan

Nah sekarang manajer saya bertindak seperti repositori setelah beberapa pembersihan. Misalnya, saya punya 10 pencarian langsung. Saya mengakses pencarian ini melalui ID untuk pengambilan lebih mudah. Jadi pemain saya memiliki komponen untuk pencarian (manajer) dan saya akan mengakses pencarian dari sana. Masih pemain yang mengendalikan pencarian apa yang bisa dia miliki. Apakah ini ide yang buruk?
Sylpheed

6

Paradigma

Pada saat jawaban ini ditulis, jawaban yang diposkan di sini semuanya salah.

Alih-alih bertanya apakah Domain-Driven Design baik untuk game. Anda harus bertanya apakah "Pemodelan Domain" cocok untuk gim.

Apakah pemodelan domain baik untuk game?

Jawabannya adalah: kadang-kadang sangat menakjubkan. Namun, jika Anda membuat game real-time seperti platformer atau FPS atau apa pun (banyak jenis game) maka tidak ada. Ini belum tentu cocok untuk sistem tersebut. Namun, mungkin ada sistem di mana game-game di mana menerapkan pola model domain efektif.

Seperti yang disebutkan orang lain di sini, kerangka kerja komponen-entitas cenderung sangat populer, dan untuk alasan yang baik. Namun, dalam budaya pengembangan game tampaknya ada kekurangan arsitektur berlapis. Sekali lagi, ini untuk alasan yang baik karena sebagian besar permainan yang orang akan kembangkan hanya bermutasi pada entitas dan membiarkan konsekuensi yang muncul menjadi permainan.

SEMUA PERANGKAT LUNAK BUKAN PERANGKAT LUNAK YANG ANDA MENULIS. Beberapa sangat berbeda dari yang lain.

Beberapa contoh domain di mana pemodelan domain berfungsi dengan baik adalah permainan kartu, permainan papan, dan jenis sistem lainnya yang dikendalikan oleh peristiwa.

Game yang dijalankan pada laju bingkai X dengan gerakan dll ditentukan oleh delta waktu sebagai konsep domain inti mungkin tidak cocok. Dalam hal ini, "domain" kami seringkali sangat sederhana sehingga tidak perlu untuk pemodelan domain. Deteksi tabrakan, pemijahan entitas baru, pengaruh kekuatan pada entitas yang ada, dll. Cenderung mencakup sebagian besar permainan.

Namun, ketika segala sesuatunya menjadi rumit, Anda mulai melihat pengembang menerapkan model domain dalam entitas mereka untuk menangani jenis perilaku dan perhitungan tertentu.

Pola model domain dalam arsitektur game

Mesin game Anda (misalnya, Unity3D) seringkali berorientasi komponen-entitas. Di platformer, Anda mungkin memiliki entitas untuk karakter Anda dan kondisinya terus-menerus bermutasi untuk memperbarui posisi dll.

Namun, dalam permainan yang lebih digerakkan oleh peristiwa, lebih mungkin bahwa peran kerangka kerja entitas-komponen lebih hanya ada sebagai Antarmuka Pengguna. Anda berakhir dengan arsitektur berlapis.

UI membuat status permainan kepada pengguna. Pengguna berinteraksi dengan UI, memicu perintah di lapisan layanan. Lapisan layanan berinteraksi dengan objek domain. Objek domain mengangkat peristiwa domain. Pendengar acara mendengar kejadian dan memicu perubahan di UI.

UI> Lapisan Layanan> Model Domain

Singkatnya, berakhir dengan model-view-controller dengan implementasi lapisan layanan.

Menggunakan arsitektur ini, Anda memiliki inti game yang sepenuhnya dapat diuji unit (Jarang terjadi dalam budaya pengembangan game, dan ini menunjukkan) dengan antarmuka yang digerakkan oleh peristiwa.

Ok sekarang, apa itu DDD?

Desain Berbasis Domain secara khusus adalah budaya / gerakan penekanan pada pola analitik yang digunakan untuk mempelajari tentang domain, sehingga Anda benar-benar membangun hal yang benar, dan kemudian pola implementasi yang memberdayakan Anda untuk menerapkan lapisan model yang mewakili konsep dalam model domain menggunakan idiom bahasa Anda. DDD keluar dari komunitas yang bekerja dengan domain rumit dan selalu mencari cara untuk mengelola kompleksitas tinggi dalam aplikasi mereka dengan berfokus pada pemodelan domain.

DDD tidak melakukannya dengan baik jika tujuan Anda hanya memulai pengkodean, bermain-main dengan sistem dan kemudian mencari tahu apa yang ingin Anda bangun nanti, dll. Asumsi bahwa ada lebih atau kurang sebuah domain yang ada. Jadi, jika Anda tidak tahu akan seperti apa permainan Anda .. Lalu, itu tidak akan berhasil.


1
Terima kasih atas wawasannya. Saya sudah menemukan ini mungkin 3 atau 4 tahun yang lalu. Saya naif waktu itu (5 tahun lalu) karena saya selalu berusaha menyesuaikan "pola desain" dengan semua masalah saya. Mempelajari "pola" dan arsitektur ini membantu karena memberi saya lebih banyak pilihan. Saya selalu menempel bagian abstrak kode saya "cukup" sehingga akan mudah bagi desainer (sangat penting), pengujian unit, dan mekanik masa depan. Terlalu banyak arsitektur membuatnya sulit untuk bekerja dengan dan saya belajar itu dengan cara yang sulit. Saat ini saya telah memanfaatkan arsitektur berbasis komponen agar sesuai dengan gaya pengkodean saya. SOLID ftw.
Sylpheed

3

Tidak, saya tidak berpikir DDD, atau arsitektur "kata kunci" lainnya sangat bagus untuk gim. Dengan kemungkinan pengecualian "sistem komponen", yang tampaknya sangat populer di sini.

Ketika saya mendengar pertanyaan dan diskusi seperti ini, saya teringat akan situs ini . Merenungkan berbagai arsitektur kata-kata biasanya akan membuat Anda kurang baik daripada benar-benar merancang dan membuat kode aplikasi Anda sendiri.


1
+1 untuk "sebenarnya mendesain dan mengode aplikasi Anda sendiri." pola-pola itu adalah pedoman dan pemicu pemikiran bagi saya - tidak lebih. Mengubah masalah sehingga cocok menjadi solusi adalah hal yang salah untuk dilakukan.
Jonathan Dickinson

-1

Ya, tetapi Anda harus beradaptasi.

Saat menggunakan DDD Anda akan mendapatkan modularitas dan tanggung jawab tunggal dari setiap domain. Tetapi hal lain hanya membuat segalanya menjadi kompleks.

Lihat jawaban saya di sini


Anda mungkin ingin sedikit memperluas jawaban Anda (mencakup bagian utama dari jawaban), karena sekarang ini hanya jawaban tautan (bahkan jika itu menunjuk ke situs pertukaran tumpukan yang lain).
Vaillancourt
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.