Kapan saya harus mengkode data dibandingkan dengan memuat data eksternal?

36

Saya kira-kira seribu baris kode untuk membuat game berbasis ruang 2D saya sendiri, yang menciptakan jaringan sistem bintang yang dihasilkan secara acak dan mengisinya dengan pilihan acak planet, stasiun, kapal, dan senjata.

Mungkin akan ada ratusan stasiun / kapal / dll yang berbeda yang perlu digunakan game - jadi inilah yang saya ingin tahu. Haruskah saya menghabiskan waktu untuk membuat data-loader 'softcoded', yang akan menyimpan semua informasi ini dalam (misalnya) file XML, dan karena itu akan lebih mudah untuk dimodifikasi nanti, atau haruskah saya hanya pergi dengan apa yang saya punya lakukan sekarang - meng-hardcoding semua objek ke mesin utama gim.

Saya satu-satunya orang di proyek ini, dan seperti yang saya katakan, itu hanya hobi yang saya lakukan di waktu luang jauh dari universitas. Tetapi apakah masyarakat merekomendasikan investasi dalam menciptakan seluruh sistem ekstra untuk menyimpan data dalam file tambahan?

Apa manfaat dari data softcoding dengan cara seperti ini, dibandingkan dengan hanya melakukan hardcoding semua melalui konstruktor? Apakah ada manfaat jangka panjang untuk memiliki file eksternal yang dapat dimodifikasi - jika saya tidak mencari game untuk memiliki 'mod', apakah perlu memiliki file eksternal? Jika itu hanya hobi yang mungkin saya hilangkan dalam beberapa minggu atau bulan, haruskah saya membuang waktu untuk hal ini?

Singular1ty
sumber
10
Istilah yang Anda cari adalah "Data Driven" dan ya, itu jauh lebih cepat dalam jangka panjang untuk membuat stasiun baru dan mengirimkan file XML (atau format apa pun seperti JSON) daripada apa yang Anda lakukan pada proyek yang lebih kecil . Plus nanti Anda dapat menghapus dan mengedit tanpa harus menyentuh kode dan mengkompilasi ulang, untuk penghematan kedua kalinya.
Patrick Hughes
@ PatrickHughes Saat mengetik jawaban saya, Anda sudah memberikan komentar!
MartinTeeVarga
1
Jika kita mencoba melegitimasi "soft-coding" sebagai istilah nyata, saya mengusulkan perusahaan-coding sebagai "menggunakan input hard-coded ke matriks data soft-coded."
Sean Middleditch
1
@ Singular1ty situs ini lebih memaafkan diskusi daripada beberapa UK lainnya. Saya pikir pertanyaan Anda memenuhi syarat untuk status "diskusi-baik".
Seth Battin
2
@ Singular1ty Ah, ini dia. Tidak dapat menemukannya ketika saya memposting komentar pertama saya. blog.stackoverflow.com/2010/09/good-subjective-bad-subjective
Seth Battin

Jawaban:

62

Iya nih. Anda harus menerapkan sistem untuk memuat konten di luar mesin utama Anda.

Header untuk jawaban singkat.

Tidak. Itu tidak menghabiskan terlalu banyak waktu.

Saya pikir pertanyaan apakah itu alokasi yang sah dari waktu terbatas Anda dapat diperdebatkan; bahkan jika hanya untuk fakta bahwa itu akan menjadi sebagian kecil dari total waktu proyek.

Anda akan menghabiskan ratusan (ribuan) jam untuk proyek game yang Anda ambil sampai selesai. Mungkin bukan pada klon Pong, tapi tentu saja untuk game luar angkasa kompleks Anda. Bandingkan dengan pembaca file konfigurasi. Menerapkan sistem untuk mem-pipe XML ke konstruktor utama Anda, dan selanjutnya memulai kembali ke proses gim, mungkin butuh waktu 10 atau 20 jam. Bahkan jika itu membawa Anda 50 atau 100, itu akan menjadi sebagian kecil dari total waktu proyek.

Itu akan menghemat waktu

Itu bukan pengeluaran waktu; ini adalah investasi waktu. Dan itu akan membuahkan hasil.

Workflow penting, dan memiliki config loader akan membuat alur kerja Anda lebih baik. Dengan membuat sistem yang memungkinkan Anda mengedit konfigurasi dengan cepat, Anda akan menghemat pembangunan kembali yang tak terhitung jumlahnya. Anda dapat melihat permainan saat sedang berjalan, tweak XML, dan periksa kembali dalam hitungan detik. Atau Anda dapat melihat kode, menemukan garis kode (di antara ribuan), mengedit nilainya dengan sangat hati-hati (Anda berada di mesin utama, setelah semua), membangun kembali, mengeksekusi, mengembalikan permainan ke status pengujian, berusaha keras untuk ingat seperti apa sebelum perubahan, dan lihat apakah perubahan Anda memiliki efek yang Anda maksudkan. Dengan asumsi tidak ada kerusakan pada mesin Anda, kereta Anda tentu terganggu.

Dari perspektif komputer yang lebih mendasar, cobalah untuk mengingat bahwa bagian yang paling memakan waktu dari perangkat lunak penulisan adalah tidak memiliki beberapa penekanan tombol atau spasi tambahan. Ini pemburuan serangga. Dan jika Anda menghabiskan sedikit waktu ekstra untuk memperjelas dengan menulis lebih banyak kode verbose, Anda menghemat lebih banyak waktu nanti. Dalam kasus Anda, menulis importir konten menghasilkan kode yang lebih bersih yang akan lebih mudah dibaca. Alih-alih bermil-mil nilai hardcoded, sumber Anda akan menampilkan memuat file sederhana. Demikian juga, Anda dapat membaca file konfigurasi tanpa mengarungi kode mesin game. Kedua bagian menjadi lebih mudah dikelola dan lebih mudah untuk di-debug.

Tim satu anggota paling diuntungkan

Jika Anda menyewa seorang artis untuk menghasilkan beberapa konten itu, Anda perlu membuat alat untuk mereka gunakan. Mereka perlu melakukan pengeditan piksel, dan melihat efeknya dengan cepat. Anda tidak akan berani memaksa mereka untuk membangun kembali kode untuk melihat setiap perubahan. Waktu mereka mahal, dan Anda tidak ingin menyia-nyiakannya.

Sekarang bayangkan artis itu sangat tidak terampil dan lambat (artis programmer), dan punya banyak hal lain yang perlu dikhawatirkan karena mereka juga programmer dan musisi utama. Anda pasti tidak ingin membuang waktu itu, atau proyek tidak akan pernah selesai. Dan, artis jelek itu akan membenci pelatihan untuk menjadi artis yang lebih baik, karena mereka menghabiskan seluruh waktu mereka mengganti nama string aset dalam kode.

Jangan lakukan itu untuk dirimu sendiri. Buat alat, dan Anda akan memiliki lebih banyak waktu untuk membuat game.

Seth Battin
sumber
3
Wow, jawaban fantastis lainnya! Terima kasih banyak. Saya pasti setuju dengan kemampuan untuk mengubah nilai dengan cepat - dan juga pada pencarian bug. Melupakan satu atau dua hal kecil dengan cepat berubah menjadi mimpi buruk, dan saya ingin melakukan apa pun yang perlu untuk mengurangi mengulangi baris kode yang sama tanpa henti dengan hanya perubahan kecil antara aliansi, nama, dan nilai lambung / senjata.
Singular1ty
Seth, selamat datang di level privilege baru Anda. Gunakan suara dekat Anda dan buka kembali dengan baik!
MichaelHouse
Saya menghargainya, terima kasih. Saya akan menunggu sebentar untuk menggunakannya. Saya telah mendapatkan beberapa fluktuasi rep dari akun voting up yang dihapus.
Seth Battin
10

Ini adalah pertanyaan yang bagus dan jawaban terbaik yang bisa saya berikan adalah bahwa hanya pengalaman yang bisa benar-benar memberi tahu Anda saat mengambil jalan yang lebih sulit / menyita waktu. Jika ada yang memberi tahu Anda bahwa Anda harus SELALU melakukannya dengan cara yang 'pantas', maka mereka salah.

Anda sudah mengerti bahwa itu adalah tradeoff. Di satu sisi, hardcoding sangat menggoda karena cepat dan mudah digunakan, tetapi dalam jangka panjang menambahkan fitur dan debugging akan menjadi mimpi buruk. Di sisi lain, menulis sistem yang hebat, fleksibel, dapat dikembangkan membutuhkan investasi awal yang besar, tetapi membuat hidup jauh lebih mudah dalam jangka panjang.

Tujuannya adalah untuk menyelesaikan sesuatu, dan jika Anda terjebak dalam membuat sistem yang hebat, tujuannya akan surut lebih lanjut dan Anda akan kehilangan motivasi. Hal-hal yang sulit dikodekan baik-baik saja dalam beberapa keadaan tetapi Anda harus memahami konsekuensi dari melakukannya. Berikut adalah beberapa alasan mengapa hardcoding adalah ide yang buruk:

  • Anda mungkin berpikir proyek Anda kecil, tetapi ada kemungkinan proyek itu tumbuh saat Anda memutuskan untuk menambah lebih banyak fitur. Jika Anda memulai hardcoding, akan tiba saatnya ketika energi yang dibutuhkan untuk mempertahankannya (memperbaruinya dengan hal-hal baru dan memperbaiki segudang bug yang tak terhindarkan) akan mulai secara serius melebihi keuntungan awal.

  • Hal-hal yang sulit dikodekan menurut definisi khusus untuk proyek saat ini. Untuk proyek selanjutnya, Anda harus mulai dari awal lagi, mungkin melakukan hardcoding lagi (karena itulah yang membuat Anda nyaman). Jika Anda telah memasukkan waktu ke dalam sistem pemuatan yang layak, Anda dapat melewati pekerjaan itu dan sakit kepala untuk semua proyek di masa depan.

  • Anda mungkin bekerja sendiri saat ini, tetapi mungkin ada saatnya Anda ingin membawa orang lain ke dalam proyek. Apakah Anda akan meluangkan waktu untuk menjelaskan sistem parokial menjijikkan Anda dan menulis dokumentasi untuk itu?

  • Hard-coding sering melibatkan harus tahu apa angka ajaib tertentu, atau dependensi kelas yang rumit. Anda mungkin dapat menyimpan semuanya dalam pikiran Anda sekarang, tetapi tunggulah sampai Anda berada jauh dari kode untuk sementara waktu. Bahkan dengan komentar yang luas, struktur yang dirancang dengan buruk adalah neraka untuk kembali.

Saya akan mengatakan Anda harus merasa bebas untuk hal-hal kode keras hanya pada detail terkecil. Jika Anda memiliki gagasan sekecil apa pun tentang elemen yang sedang Anda kerjakan digunakan oleh orang lain, tumbuh jauh lebih besar, atau digunakan dalam proyek lain, maka luangkan waktu untuk melakukannya dengan benar, sekarang.

Di sisi lain, saya membuat prototipe seperti orang gila dan mengkodekan hal-hal tertentu dengan cepat dan mudah dan membuat Anda bebas berkonsentrasi untuk bereksperimen. Itu agak tergantung pada gaya kerja Anda.

DaleyPaley
sumber
Terima kasih atas jawabannya. Saya sudah menemukan bahwa sistem saya semakin tidak terkendali. Karena memperluas hal-hal di java, kelas saya sering memiliki sekitar sepuluh hingga lima belas argumen konstruktor, dan saya selalu lupa urutan yang masuk. Saya terbiasa melakukan hal-hal 'cepat dan kotor', karena rentang perhatian saya sangat singkat, tetapi Saya ingin benar-benar menyelesaikan proyek untuk sekali. Ditambah lagi jika saya merasa perlu untuk mengubah statistik untuk hal-hal di kemudian hari, saya tidak ingin terjebak dengan memukau melalui ribuan baris objek yang dikodekan ...
Singular1ty
@ Singular1ty Dalam hal ini, hentikan apa yang Anda lakukan sekarang. Sudah waktunya untuk refactor seperti orang gila. Lupakan segala konten baru dan berkonsentrasilah pada peningkatan struktur keseluruhan yang ada. Saya bekerja di perusahaan game dan saya selalu mendorong untuk mengambil nafas dan refactoring. Tapi tentu saja, itu jatuh di telinga tuli dan kami selalu berakhir berderak seperti orang gila, mengarungi bug / hack quagmir penuh. Ho hum
DaleyPaley
8

Apa yang Anda bicarakan adalah pemrograman berbasis data .

Untuk proyek-proyek kecil, mungkin tidak sepadan dengan investasi waktu, karena seringkali ada fitur yang jauh lebih penting yang dapat Anda tingkatkan.

Namun, pemrograman berbasis data bisa SANGAT mudah diimplementasikan. Jika Anda serius tentang hal itu, Anda mungkin harus menggunakan XML, JSON, atau YAML, tetapi Anda juga dapat menggunakan file teks biasa.

Pemrograman Berbasis Data

Pro

  1. Mengizinkan desainer mengakses dan mengubah data game tanpa pengetahuan pemrograman
  2. Anda dapat melakukan modifikasi pada gim tanpa harus mengkompilasi ulang . Ini tidak boleh diremehkan, karena Anda dapat mengembangkan game dengan lebih cepat dengan cara ini. Game bagus datang setelah banyak iterasi.

Cons

  1. Butuh waktu dan upaya untuk mengimplementasikannya.
  2. Ini dapat meningkatkan kompleksitas program.
Nick Caplinger
sumber
Ini hanya beberapa pro dan kontra yang bisa saya pikirkan saat ini; beri tahu saya jika Anda memikirkan lebih banyak!
Nick Caplinger
1
Saya menyetujui suntingan Anda untuk judul saya.
Singular1ty