Polimorfizm
Kullandığınız getType()
veya bunun gibi bir şey olduğu sürece, polimorfizm kullanmıyorsunuz.
Hangi tipe sahip olduğunuzu bilmeniz gerektiğini hissediyorum. Ama bunu bilerek yapmak istediğiniz herhangi bir çalışma gerçekten sınıfa doğru itilmelidir. Sonra sadece ne zaman yapacağınızı söylersiniz.
Prosedür kodu bilgi alır ve kararlar alır. Nesneye yönelik kod, nesnelere bir şeyler yapmasını söyler.
- Alec Sharp
Bu prensibe söyle denir , sorma . Aşağıdakiler, yazım gibi ayrıntıları yaymamanıza ve üzerinde etkili olan mantık oluşturmanıza yardımcı olur. Bunu yapmak bir sınıfı ters yüz eder. Bu davranışı sınıf içinde tutmak daha iyidir, böylece sınıf değiştiğinde değişebilir.
kapsülleme
Bana başka hiçbir şekle ihtiyaç duyulmayacağını söyleyebilirsin ama sana inanmıyorum ve sen de yapmamalısın.
Enkapsülasyonu takip etmenin güzel bir etkisi, yeni türler eklemenin kolay olmasıdır, çünkü ayrıntıları gösterildikleri koda if
ve switch
mantığa yayılmaz . Yeni bir türün kodu tek bir yerde olmalıdır.
Bir cahil çarpışma tespit sistemi
Size performansı gösteren ve herhangi bir 2D şekli ile çalışan bir çarpışma algılama sistemini nasıl tasarlayacağımı göstereceğim.
Bunu çizmen gerektiğini söyle. Basit görünüyor. Hepsi daireler. Çarpışmaları anlayan bir çevre sınıfı yaratmak caziptir. Sorun şu ki, bu bizi 1000 çevreye ihtiyacımız olduğunda ayrılan bir düşünce çizgisine gönderiyor.
Çevreleri düşünmemeliyiz. Pikselleri düşünmeliyiz.
Bu adamları çizmek için kullandığınız aynı kodun, dokundukları zaman veya hatta kullanıcının tıkladığında algılamak için kullanabileceğiniz şey olduğunu söylersem ne olur?
Burada her daireyi benzersiz bir renkle çizdim (gözleriniz siyah anahattı görecek kadar iyiyse, görmezden gelin). Bu, bu gizli görüntüdeki her pikselin çizdiği şeye geri eşlendiği anlamına gelir. Bir hashmap buna iyi bakar. Aslında polimorfizmi bu şekilde yapabilirsiniz.
Bu görüntüyü asla kullanıcıya göstermeniz gerekmez. Birincisini çeken kodla oluşturursunuz. Sadece farklı renklerle.
Kullanıcı bir daireye tıkladığında tam olarak hangi daireyi biliyorum çünkü sadece bir daire o renktir.
Bir başkasının üzerine bir daire çizdiğimde, üzerine yazmak üzere olduğum her pikseli bir kümeye dökerek hızlı bir şekilde okuyabilirim. Yaptığım zaman çarpıştığı her çembere ayar noktaları ve şimdi çarpışmayı bildirmek için her birini sadece bir kez çağırmam gerekiyor.
Yeni bir tür: Dikdörtgenler
Bunların hepsi dairelerle yapıldı ama size soruyorum: dikdörtgenlerle farklı mı çalışır?
Algılama sistemine hiçbir daire bilgisi sızmamıştır. Yarıçap, çevre veya merkez noktasını umursamıyor. Pikselleri ve renkleri önemsiyor.
Bu çarpışma sisteminin münferit şekillere itilmesi gereken tek kısmı benzersiz bir renktir. Bunun dışında şekiller sadece şekil çizmeyi düşünebilir. Zaten iyi oldukları şey de bu.
Şimdi çarpışma mantığını yazdığınızda hangi alt tipe sahip olduğunuz umurumda değil. Çarpışmasını söylersiniz ve çizdiğini düşündüğü şeklin altında ne bulduğunu söyler. Türü bilmenize gerek yok. Bu, diğer sınıflardaki kodu güncellemek zorunda kalmadan istediğiniz kadar alt tür ekleyebileceğiniz anlamına gelir.
Uygulama seçenekleri
Gerçekten, benzersiz bir renk olması gerekmez. Gerçek nesne referansları olabilir ve bir dolaylı yoldan kaydedilebilir. Ama bu cevapta çizildiklerinde hoş görünmezlerdi.
Bu sadece bir uygulama örneğidir. Kesinlikle başkaları da var. Bunun gösterilmesi gereken şey, bu şekil alt türlerinin ne kadar yaklaştıklarına tek sorumlulukları ile bağlı kalmaları, tüm sistemin daha iyi çalışmasıdır. Muhtemelen daha hızlı ve daha az bellek yoğun çözümler var, ancak beni alt türlerin bilgisini yaymaya zorlarlarsa, bunları performans kazanımlarında bile kullanmaya razı olurum. Açıkça ihtiyaç duymadıkça onları kullanmazdım.
Çift gönderim
Şimdiye kadar çifte sevkiyatı tamamen görmezden geldim . Bunu yaptım çünkü yapabildim. Çarpışma mantığı hangi iki türün çarpıştığına aldırış etmediği sürece buna ihtiyacınız yoktur. İhtiyacınız yoksa, kullanmayın. İhtiyacınız olabileceğini düşünüyorsanız, olabildiğince uzun süre uğraşın. Bu tutuma YAGNI denir .
Eğer gerçekten farklı türden çarpışmalara ihtiyacınız olduğuna karar verirseniz, kendinize n şekil alt türlerinin gerçekten n 2 tür çarpışmaya ihtiyacı olup olmadığını sorun . Şimdiye kadar başka bir şekil alt türü eklemeyi kolaylaştırmak için çok çalıştım. Daireleri, karelerin var olduğunu bilmeye zorlayan bir çift gönderme uygulamasıyla bozmak istemiyorum .
Zaten kaç çeşit çarpışma var? Biraz spekülasyon (tehlikeli bir şey) elastik çarpışmalara (kabarık), esnek olmayan (yapışkan), enerjik (patlayan) ve yıkıcı (zararlı) icat eder. Daha fazlası olabilir ama bu n 2'den küçükse , çarpışmalarımızı fazla tasarlamamıza izin verir.
Bu, torpidoumun hasar kabul eden bir şeye çarpması durumunda, bir uzay gemisine çarptığını bilmek zorunda olmadığı anlamına gelir. Sadece "Ha ha! 5 puan hasar aldın" demek zorunda.
Hasar veren şeyler hasar mesajı kabul eden şeylere hasar mesajı gönderir. Bu şekilde, diğer şekillere yeni şekil hakkında bilgi vermeden yeni şekiller ekleyebilirsiniz. Sonunda sadece yeni çarpışma türlerine yayılırsınız.
Uzay gemisi "Ha ha! 100 puan hasar aldın" torpuna geri gönderebilir. ve "Artık gövdeme yapıştın". Ve torp geri gönderebilir "Eh, bu yüzden beni unutmuşum".
Hiçbir noktada her birinin tam olarak ne olduğunu bilmiyor. Bir çarpışma arayüzü aracılığıyla birbirleriyle nasıl konuşacaklarını biliyorlar.
Şimdi emin olun, çift gönderme, işleri bundan daha yakından kontrol etmenizi sağlar, ancak bunu gerçekten istiyor musunuz?
Bunu yaparsanız, en azından bir şeklin gerçek şekil uygulamasında değil, ne tür çarpışmaların kabul edildiğinin soyutlamalarıyla çifte sevkiyat yapmayı düşünün. Ayrıca, çarpışma davranışı bağımlılık olarak enjekte edebileceğiniz ve bu bağımlılığa delege edebileceğiniz bir şeydir.
Verim
Performans her zaman önemlidir. Ancak bu her zaman bir sorun olduğu anlamına gelmez. Test performansı. Sadece spekülasyon yapmayın. Performans adına her şeyi feda etmek genellikle yine de performans koduna yol açmaz.