Unity'de Liskov İkame İlkesini atlama ve koşma stiliyle kullanma
Nesnelerin yukarıdan aşağıya düştüğü küçük bir oyun programlayacağız. Bunun için 3 farklı obje sağlıyoruz. Açık renkli bir ahşap kutu, koyu ahşap bir kutu ve bir altın para. Ekranın ortasında "Is Trigger" etkinleştirilmiş bir çarpıştırıcı bulunur ve bu, düşen nesneleri idare ederek iç değerlerini toplar. Size bir sır vereceğim: Bu prensibi doğru kullanırsanız, milyonlarca farklı nesne kullanabilirsiniz, ancak işleme sınıfı her zaman aynı olacaktır. Eski kod ayarlaması yok, kodun yeniden yazılması yok!
Aşağıdaki resim sahne görünümünü (solda) oyun görünümünü (sağda) ve görüntülenen nihai sonucun konsolunu (altta) gösterir.
Konsol şunları yazdıracaktır: Tür: Nesnenin türü, ID: nesnenin kimliği ve Toplam: bu nesnede depolanan değerlerin toplamı. Daha sonra ayrıntılara gireceğiz.
Konsolu incelerseniz: 3 farklı mesaj vardır, her satırın sağ ucunda içinde bunu belirten bir sayı bulunan bir blob vardır. Aynı içeriğe sahip mesajlar daraltıldı. Bunları eklemek, sahnede sahip olduğumuz aynı miktarda farklı nesne ile sonuçlanır. İşleme fonksiyonuna sahip çarpıştırıcı, nesnelerin özelliklerine bağlı olarak bir mesaj yazdırır. Aslında türetilmiş sınıflar hakkında hiçbir şey bilmeden. Yalnızca BaseClass “GeoObject” ile ilgilidir.
Aşağıdaki topolojiye bakın:
Veri kaplarına ve mantığa bölünmüş yalnızca 5 komut dosyasına ihtiyacımız var. 3 veri kabı GeoObject, Circle ve Square'dir, oysa 2 mantıksal komut dosyası tepki veren komut dosyası ve örnekleme betiği olmalıdır. Reaktör yalnızca bir türe tepki verecektir: GeoObject.
GeoObject'ten Circle ve Square sınıfları türetiyoruz ve prensibin teorisini hatırlayın, ebeveynlerinin yerine geçebilir. Anlık yaratan, Daire veya Kare türünde bir nesne oluşturacaktır. Ama üçüncü ayrımı nasıl elde ederiz? - Daha sonra!
Uygulamalarınızın istek ve isteklerinize göre gerçekten ölçeklenebilen SOLID temelini oluşturun. Oraya ulaşmak için I of My Unity - SOLID Serisi ile devam ediyoruz.UNITY & SOLID - S - Single Responsibility UNITY & SOLID Principles - SOLID- I UNITY & Solid Principles Dependency Inversion
Liskov İkame İlkesi (LSP), alt sınıf nesnelerinin, uygulamanın bütünlüğünden ödün vermeden üst sınıf nesnelerinin yerini alabilmesi gerektiğini belirtir. Başka bir deyişle, davranışını değiştirmeden temel sınıfın nesnelerini değiştirebilen türetilmiş sınıf nesnelerinin yaratılması için çaba gösterin. Bunu bu şekilde yapmazsak, kalıtım uygulama bütünlüğümüzü bozabilir.
İki sınıfa ve ana işleve bakın:
Bu örnek bir GeoObject temel sınıfı ve GeoObject'ten türetilen bir Square sınıfı sağlar ve yalnızca bu tarafları toplayarak, geriye kalan 0 (GeoObject modulo 3 ve Square modulo 2) gösteri amaçlı).
Türlerin sorgulanması söz konusu olduğunda, hepimiz çocuk sınıfın üst sınıfından miras aldığını biliyoruz, teknik olarak ana sınıftır. Main fonksiyonuna bir göz atın: Bir Square sınıfını 2 kere somutlaştırdık. İlkini Square türünde bir değişkene saklarız. Ve ikincisini GeoObject türünde bir değişken içinde saklarız. Alt sınıfı ana sınıfın bir değişkeninde saklarsak ve AdditionOfValues işlevini çağırırsak, sonuç beklenen gibi olmaz (sonuç da 10 olmalıdır, çünkü bir karenin uzunluğunu hesaplamak istiyoruz) ve yanlış hesaplanır. Bunun nedeni, bir Square örneğini oluşturmamıza rağmen, üst sınıftan AdditionOfSideLengths yönteminin çağrılmasıdır. Bu nedenle, çocuklar ebeveynin yerine geçmez ve şimdi program mantığını yok eder. Liskov İkame İlkesinin devreye girdiği nokta budur.
Bu, sahne hiyerarşisi ve sahnedeki oyun nesnelerinin hizalanmasıdır:
Baştan aşağı:
Basit kısımla başlıyoruz:
Kısa soru: Bu komut dosyası ne yapacak?
Oyun nesneleri yaratın! Hepsi aynı anda değil, ancak belirli bir zaman aralığında, bu nedenle 3 alana ihtiyacımız var:
Zamanlayıcı her çalıştığında, bu komut dosyası, prefab değişkeninin içinde saklanan prefabrik referansını yumurtlama konumunda dünyaya örneklendirir .
Bu Liskov ikame ilkesinin kutsal kasesidir: Soyut bir sınıf. Temel sınıfların program mantığını bozmadan çocukları aracılığıyla ikame edilmesini sağlamak.
Soyut sınıflar somutlaştırılamadığından, onlardan miras almalıyız ve türetilen her sınıf teknik olarak ana sınıftır. Bunları şimdi ana sınıfın bir değişkenine kaydetmek, program mantığını geçersiz kılınan "AdditionOfValues" -Method'u çağırmaya zorlar çünkü soyut olduğu için bir GeoObject örneği olamaz!
Bir tamsayı değer dizisi (Değerler) ve id (Id) olarak bir tamsayıya ihtiyacımız var. Bu sınıf aynı zamanda GeoObject alt öğelerini Unity GameObjects'e eklemek adına MonoBehaviour'dan miras almalıdır.
Daha iyi anlamak için kurucuyu “public GeoObject” tutuyoruz, ancak bu gereksizdir, çünkü sınıf MonoBehaviour'dan türediğinden, birlik kendi yaşam döngüsü içinde somutlaştırılması ve başlatılmasıyla ilgilenecektir.
Şimdi ilk mirasımıza geliyoruz:
Kimliği ve değerleri olan bir daire oluşturuyoruz. "AdditionOfValues ()" işlevi çağrıldığında, "Sum ()" dizisinin standart uygulaması da bu dizinin tüm üyelerinin toplamını vermek için çağrılır.
Söylemesi gereken önemli, temel sınıfın işlevlerinin soyut olduğu ve bunları türetilmiş olanlarımız içinde geçersiz kılmamız gerektiğidir. Ayrıca, Unity yaşam döngüsü Awake () yöntemini çağırdığında temel sınıfın alanlarının üzerine yazılır. Burada bir kurucuya gerek yok.
Kare, açık veya koyu ahşap bir kutu olarak ortaya çıktığı ve biraz daha fazla kod işlemesi gerektiği için biraz daha karmaşıktır, ancak genel olarak neredeyse aynıdır:
Temel sınıf alanına 2 ile 3 arasında rastgele bir kimlik yazmak ve renge karar vermek. Ayrıca temel sınıfın içine bir dizi değer yazılır. "AdditionOfValues ()" yöntemi, altın renkli ve gümüş renkli kasalar için farklı değerler oluşturmak üzere kimlikle bir modulo hesaplaması yapmak yerine, dizinin tüm değerlerini toplamaz!
Bunu bir oyunda hayal ediyorsanız: Think of Gems, 1 temel Gem-Class yapmanıza ve her renk veya varyasyon için Purple-Gem-Class veya Red-Gem-Class aka ruby gibi başka bir sınıfa türetmeye gerek yok. 1 soyut Gem-Sınıfı oluşturun ve ondan türetin ve işleme yöntemlerinin sonuca karar vermesine izin verin.
Daha önce de bahsettiğim gibi, hepsine tepki verecek 3 nesne ve bir komut dosyası var. Bu komut dosyası soyut sınıfın farkında olmalı ve daha fazlası olmamalıdır. Bu nesne türünü bekliyor, bu nedenle program mantığını bozmadan herhangi bir türetilmiş sınıfı değiştirebiliriz:
Çarpışan herhangi bir nesneyi, GeoObject türündeki referans değişkeni myGeoObject içinde saklayacaktır ve bu, null değerine eşit değilse, GeoObjectReact (GeoObject myGeoObject) işlevi çağrılır ve daha önce gördüğümüz çıktıyı konsolda yürütür.
Diğer komut dosyalarını eklemeden önce, oluşturabileceğimiz bazı oyun nesneleri hazır yapılarına ihtiyacımız var:
Bunun için, varsayılan bir Rigidbody2D ve bir varsayılan BoxCollider2D içeren basit bir oyun nesnesine ihtiyacımız var. Kutu hareketli grafik içeren bir hareketli grafik oluşturucu.
Komut dosyamızı (Square.cs) aldığımız için, onu buraya ekleyebiliriz:
Dairenin bir SpriteRenderer'a, bir CircleCollider2D'ye, bir varsayılan Rigidbody2D'ye ve bir Circle.cs betiğine ihtiyacı vardır, daha çekici hale getirmek için coin sprite ekleyin ( buradan alın ).
Bundan bir prefabrik oluşturmak için aşağıdakileri yapın: Sahne hiyerarşisindeki iki oyun nesnesinin her birini proje pencerenize sürükleyin ve oraya bırakın. İki hazır yapı oluşturduktan sonra, her iki nesneyi de sahneden silin.
Reacter komut dosyasını “Reacter gameObject” e ekleyin.
Şimdi, Spawner (1) ve Spawner (2) 'a örnekleme için komut dosyalarını ekleyebiliriz:
Spawner (1), her iki yumurtlamayı da temsil eder: InitTime alanına her yumurtlama arasındaki saniye için bir süre girin. Hazır yapılarınızdan birini Prefabrik alanına sürükleyip bırakın.
Şimdi oyuna basın ve sonuç bu olmalı!
Beni yanlış anlamayın, eğitimin tamamı "kolay ve hızlı yapılmış bir varyasyondur";)
Şimdi kod yazmayı ve birçok sınıf yerine tek bir soyut temel sınıfa bağlı olmayı ve varyasyona ulaşmayı öğrendik. Miras alınan sınıflardaki bir değişikliğin uygulamanın bütünlüğünü bozabileceğini ve miras almamız için her zaman soyut bir temel sınıfa sahip olmamız gerektiğini öğrendik. Diğer bir anahtar kelime "çok biçimlilik" olacaktır. Bu kelimeyi biliyorsanız veya daha önce yaptıysanız, bilinçaltında biraz Liskov İkame İlkesini kullandınız.
Unity'de SOLID İlkeleri serisini okuduğunuz için teşekkür ederiz. Bu eğitimleri hazırlarken çok eğlendim ve umarım siz de beğenmişsinizdir! Öğrenme etkisi, öğrendiğiniz konularla eğlenirseniz en iyi şekilde gerçekleşir! Bu sağlam ilkelerle Unity'de kendi oyununuzu yapın ve bunu bana bildirin.
Kod incelemeleri yapıyorum, kurslar hazırlıyorum, YouTube eğitimleri oluşturuyorum ve canlı kodlama oturumları sırasında oyun geliştirmeyi gösteriyorum. Her zaman yardım etmekten memnuniyet duyarım, bana her zaman ulaşın!
Sonraki dizide görüşmek üzere.UNITY & SOLID - S - Single Responsibility UNITY & SOLID Principles - SOLID- I UNITY & Solid Principles Dependency Inversion
Teknoloji dünyasında, işletmeler sürekli olarak siber suçluların şeytani faaliyetlerinin tuzağına düşme riski altındadır. Endişe verici derecede sık hale gelen böyle bir taktik, kimlik bilgilerini doldurmaktır.
Kasım 2020'nin başlarında SalesForce, açıklanamayacak şekilde JARM adlı yeni bir aktif TLS parmak izi alma aracını duyurdu. JARM'ın temeli, bir hedef sunucu özel olarak hazırlanmış çeşitli farklı TCP "İstemci merhaba" paketleri kullanılarak tarandığında, elde edilen yanıtların birleştirilip, paylaşılan veya benzer bir uygulama veya sunucunun göstergesi olan bir parmak izi sağlamak için karma hale getirilebilmesidir. yığını.
Harika geliştiriciler yapan teknik olmayan şeyler Bir süredir bu makaleyi yazmayı erteliyorum - yazmak için hiç nitelikli hissetmedim. Bugün onu yazma zamanının geldiğini düşündüm.
Teknoloji endüstrisindeki bir pozisyon için mülakat yaparken, herhangi bir teklif değerlendirilmeden önce genellikle en az üç tur mülakattan geçeceksiniz. Mermiler genellikle şuna benzer: Eğer öyle düşünüyorsan, yanılıyorsun.
Pragmatik Programcı ilk olarak 1999'da yayınlandı ve o zamandan beri tüm zamanların en iyi programlama kitabı seçildi. Yazarlar Andy Hunt ve David Thomas, Agile Manifesto'nun orijinal yazarları arasındaydı ve bazı ciddi referanslara sahipler.