Menggunakan kelas "teman" dalam pengembangan game


9

Biasanya dalam kecepatan pengembangan game C ++ dinilai lebih dari enkapsulasi, karena itu Anda melihat satu ton anggota kelas yang dapat diakses publik yang benar-benar tidak boleh publik.

Saya tampaknya menemukan dalam banyak kasus bahwa hanya beberapa klausa yang sangat terpilih yang benar-benar perlu mengetahui cara kerja kelas-kelas lain hingga mengubah atau membaca data pribadi mereka.

Membuat getter / setter publik untuk data pribadi ini memaparkan hal-hal yang sebenarnya tidak boleh dimodifikasi mau tak mau.

Akankah kompromi di sini adalah menggunakan kelas teman? atau ada beberapa kelemahan pada kelas teman yang tidak saya lihat.

Jawaban:


8

Ada dua kelemahan utama untuk kelas pertemanan.

  1. Anda tidak dapat memilih dan memilih apa yang ingin Anda paparkan kepada teman-teman Anda. Semuanya atau tidak sama sekali. Hal ini dapat terbukti bermasalah jika Anda mencoba untuk menegakkan penggunaan semacam penyetel tidak penting.
  2. Dua kelas Anda sekarang agak digabungkan dalam arti bahwa teman-er tahu tentang teman itu.

Karena itu, menggunakan kelas teman pasti dapat meningkatkan enkapsulasi, terutama jika alternatifnya adalah pengambil / penentu publik.

Juga, pertanyaan terkait pada SO: /programming/521754/when-to-use-friend-class-in-c


5

Enkapsulasi itu bagus, tetapi pemisahan kekhawatiran lebih baik.

Kelas yang mengakses "beberapa bagian pribadi" dari kelas lain dapat menunjukkan bahwa kode tersebut tidak dirancang dengan baik sejak awal.

Setiap kali Anda menemukan diri Anda di tempat "astaga, saya perlu membuat kelas teman di sini", pertanyaan yang harus Anda tanyakan pada diri sendiri adalah "apakah saya melakukan ini dengan benar, atau ada cara yang lebih bersih?" (alias "Apakah ini akan menggigitku keledai nanti?").

Jika Anda yakin tentang "keramahan", letakkan di sana tanpa ragu-ragu.


Saya mengerti bagaimana menggunakan kelas teman akan secara ketat memasangkan satu kelas dengan kelas lainnya. Saya bertanya-tanya apakah ada pola desain khususnya yang mengurangi masalah, karena hanya membungkus sesuatu dalam pengambil / penyetel berpotensi solusi yang lebih buruk.
David Young

1
Contoh yang menarik adalah pola Pabrik di C ++ memerlukan "teman" karena penggunaan konstruktor pribadi.
David Young

2

Pilihan lain adalah menggunakan idiom PIMPL , di mana bagian dari implementasi struktur adalah pointer ke tipe lain. Sebagian besar pengguna kelas hanya akan menyertakan file header normal, di mana implementasinya adalah pointer buram. Kelas-kelas yang membutuhkan akses ke data pribadi dapat menyertakan header yang mendefinisikan tipe lain, dan menggunakan antarmuka yang disediakannya.

Ini pola umum untuk programmer C yang menginginkan fungsionalitas seperti teman. Menurut pendapat saya, ini juga lebih dekat pada pemikiran tentang pemisahan kekhawatiran (prinsip desain yang umumnya baik yang mengarah pada kode ortogonal yang dapat digunakan kembali) daripada enkapsulasi (teknik khusus OO yang berguna untuk menerapkan pemisahan kekhawatiran, tetapi juga sering disalahgunakan untuk terlalu rumit hal).

Ini memiliki keunggulan dibandingkan teman bahwa itu tidak memasangkan teman ke teman sama sekali. Beberapa orang mungkin mengklaim itu tidak menguntungkan, karena sekarang siapa pun dapat "berteman" dengan kelas Anda. Saya pikir itu adalah ketakutan yang tidak beralasan, karena Anda masih membuat hubungan eksplisit (dengan memasukkan tajuk). Jika Anda takut akan hal itu, Anda takut akan kemampuan Anda (atau rekan kerja) untuk membuat keputusan arsitektur yang cerdas. Tetapi jika Anda tidak bisa mengambil keputusan dengan benar nanti, mengapa Anda memercayai diri Anda sendiri friendsekarang?

Ini memiliki kelemahan dari biaya runtime. Dengan menyimpan data dalam sebuah penunjuk, Anda memiliki koherensi cache yang lebih buruk dan jumlah alokasi yang lebih banyak, dan Anda juga membutuhkan destruktor untuk membersihkannya.


+1 menarik, belum pernah mendengar konsep ini berasal dari latar belakang Java.
David Young
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.