Oyun geliştirmede “arkadaş” sınıflarını kullanma


9

Genellikle C ++ oyun geliştirme hızı kapsülleme üzerinden değerlenir, bu nedenle gerçekten kamuya açık olmaması gereken bir ton kamuya açık sınıf üyesi görürsünüz.

Çoğu durumda, sadece çok seçkin birkaç sınıfın başka bir sınıfın iç işleyişini özel verilerini değiştirme veya okuma noktasına kadar bilmesi gerektiğini buluyorum.

Bu özel veriler için kamu alıcıları / belirleyicileri oluşturmak, gerçekten değiştirilmemesi gereken şeyleri ortaya çıkarır.

Burada uzlaşma arkadaşlık sınıflarını kullanmak mı? ya da görmediğim arkadaşlık sınıflarının bazı dezavantajları var mı?

Yanıtlar:


8

Arkadaşlık sınıflarının iki büyük dezavantajı vardır.

  1. Arkadaşlarına ne göstermek istediğini seçip seçemezsin. Ya hep ya hiç. Bu, bir tür önemsiz olmayan ayarlayıcının zorunlu kullanımını zorunlu tutmaya çalışıyorsanız sorunlu olabilir.
  2. İki sınıfınız, arkadaşınızın arkadaşını bilmesi anlamında bir şekilde birbirine bağlıdır.

Bununla birlikte, arkadaş sınıflarının kullanılması, özellikle alternatif kamu alıcıları / belirleyicileri ise, kapsüllemeyi kesinlikle geliştirebilir.

Ayrıca, SO ile ilgili soru: /programming/521754/when-to-use-friend-class-in-c


5

Kapsülleme güzeldir, ancak endişelerin ayrılması daha iyidir.

Diğer sınıfın "bazı özel bölümlerine" erişen bir sınıf, kodun ilk etapta iyi tasarlanmadığını gösterebilir.

Kendinizi "tanrım, burada bir arkadaş sınıfı yapmam" yerinde bulduğunuzda, kendinize sormanız gereken soru "bunu doğru mu yapıyorum yoksa daha temiz bir yol var mı?" (aka "Bu beni daha sonra kıçından ısıracak mı?").

"Dostu" hakkında eminseniz, tereddüt etmeden oraya koy.


Bir arkadaş sınıfı kullanmanın bir sınıfı diğerine nasıl sıkıca birleştireceğini anlıyorum. Sorunu hafifleten bir tasarım deseni olup olmadığını merak ediyordum, çünkü sadece bir alıcı / ayarlayıcıya bir şey sarmak potansiyel olarak daha kötü bir çözümdür.
David Young

1
İlginç bir örnek, özel kurucuların kullanımı nedeniyle C ++ 'daki Fabrika şablonunun "arkadaş" gerektirmesidir.
David Young

2

Başka bir seçenek, yapının uygulamasının bir kısmının başka bir türe işaretçi olduğu PIMPL deyimini kullanmaktır . Sınıfın çoğu kullanıcısı, uygulamanın opak bir işaretçi olduğu normal başlık dosyasını içerir. Özel verilere erişmesi gereken sınıflar, diğer türü tanımlayan üstbilgiyi içerebilir ve sağladığı arabirimi kullanabilir.

Bu, arkadaş benzeri işlevsellik isteyen C programcıları için ortak bir modeldir. Benim düşünceme göre, kapsüllemeden ziyade endişelerin ayrılmasını ( yeniden kullanılabilir, dikey bir koda yol açan genel olarak iyi bir tasarım ilkesi) düşünmeye daha yakından bakmaktadır (endişelerin ayrılmasını uygulamak için yararlı olan, ancak sıklıkla yanlış kullanılmış şeyleri aşırı karmaşık hale getirmek için).

Arkadaşa arkadaşla arkadaş-ee'yi eşleştirmemesi bir arkadaşa göre avantajlıdır. Bazı insanlar bunun bir dezavantaj olduğunu iddia edebilir, çünkü şimdi herkes sınıfınıza "arkadaş" olabilir. Bence bu, haksız bir korku çünkü hala ilişkiyi açıklığa kavuşturuyorsunuz (üstbilgiyi dahil ederek). Bundan korkuyorsanız, (veya iş arkadaşınızın) akıllı mimari kararlar verme yeteneğinizden korkuyorsunuz. Ancak bu kararları daha sonra düzgün bir şekilde veremiyorsanız, neden friendşimdi kendinize güveniyorsunuz ?

Çalışma zamanı maliyetinin dezavantajı vardır. Verileri bir işaretçide depolayarak daha kötü önbellek tutarlılığına ve daha fazla ayırma sayısına sahip olursunuz ve ayrıca temizlemek için bir yıkıcıya ihtiyacınız vardır.


+1 ilginç, Java arka planından gelen bu kavramı duymadım.
David Young
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.