Benim için bu bir bağlantı sorunu ve tasarımın ayrıntı düzeyi ile ilgili. En gevşek bağlantı şekli bile bir şeyden diğerine bağımlılıklar getirir. Bu yüzlerce ila binlerce nesne için yapılıyorsa, hepsi nispeten basit olsa bile, SRP'ye bağlı kalın ve tüm bağımlılıklar istikrarlı soyutlamalara doğru akıyor olsa bile, birbiriyle ilişkili bir bütün olarak akıl yürütmesi çok zor olan bir kod tabanı verir.
Teorik SE'de sıkça tartışılmayan bir kod tabanının karmaşıklığını ölçmenize yardımcı olan pratik şeyler vardır, tıpkı sona ulaşmadan önce çağrı yığınına ne kadar derin girebileceğiniz ve yapabileceğinizden önce ne kadar derine gitmeniz gerektiği gibi büyük bir güven, bir istisna durumu da dahil olmak üzere, çağrı yığınının bu düzeyinde oluşabilecek tüm olası yan etkileri anlayın.
Ve sadece tecrübelerime göre, daha sığ çağrı yığınlarına sahip düz sistemlerin akıl yürütmenin çok daha kolay olduğunu gördüm. Aşırı bir örnek, bileşenlerin sadece ham veri olduğu bir varlık bileşeni sistemidir. Sadece sistemlerin işlevselliği vardır ve bir ECS'nin uygulanması ve kullanılması sürecinde, yüz binlerce kod satırını kapsayan karmaşık kod tabanlarının temelde birkaç düzine sisteme kaynadığına dair şimdiye kadarki en kolay sistemi buldum. tüm işlevselliği içerir.
İşlevselliği Sağlayan Çok Fazla Şey
Önceki kod tabanlarında çalıştığım zamanki alternatif, yüzlerce ila binlerce çoğunlukla küçük nesneye sahip bir sistemdi, birkaç düzine hantal sistemin aksine, sadece bir nesneden diğerine mesaj iletmek için kullanılan bazı nesneler Message
vardı ( örneğin, kendi genel arayüzü). Temel olarak, ECS'yi bileşenlerin işlevselliğe sahip olduğu bir noktaya geri döndürdüğünüzde analog olarak elde ettiğiniz şeydir ve bir varlıktaki her benzersiz bileşen kombinasyonu kendi nesne türünü verir. Ve bu, ufacık fikirleri modelleyen sonsuz nesne kombinasyonları ( Particle
nesne vs.Physics System
, Örneğin). Bununla birlikte, kod tabanında aslında bir şeyler yapabilen ve bu nedenle yanlış bir şeyler yapabilen çok fazla şey olduğu için, geniş düzeyden ne olduğu hakkında mantık yürütmeyi zorlaştıran karmaşık bir bağımlılıklar grafiği sunma eğilimindedir. - "veri" tipi olmayan, ancak ilişkili işlevlere sahip "nesne" tipi olan türler. İlişkili işlevselliği olmayan saf veri işlevi gören türler, kendi başlarına hiçbir şey yapamayacakları için yanlış gidemezler.
Saf arayüzler bu anlaşılabilirlik problemine o kadar yardımcı olmaz çünkü "derleme zamanı bağımlılıkları" daha az karmaşık hale gelse ve değişim ve genişleme için daha fazla nefes alanı sağlıyor olsa bile, "çalışma zamanı bağımlılıkları" ve etkileşimleri daha az karmaşık hale getirmez. İstemci nesnesi, çağrılsa bile somut bir hesap nesnesindeki işlevleri çağırmaya devam eder IAccount
. Çok biçimlilik ve soyut arabirimlerin kullanımları vardır, ancak herhangi bir noktada devam edebilecek tüm yan etkiler hakkında gerçekten mantıklı olmanıza yardımcı olacak şekilde şeyleri ayırmazlar. Bu tür etkili ayrıştırmayı başarmak için, işlevsellik içeren çok daha az şey içeren bir kod tabanına ihtiyacınız vardır.
Daha Fazla Veri, Daha Az İşlev
Bu yüzden, ECS yaklaşımını, tamamen uygulamadığınız halde bile, son derece yardımcı olmak için buldum, çünkü yüzlerce nesnenin ne olacağını, daha kaba tasarlanmış, daha kaba tasarlanmış, işlevsellik. "Veri" türlerinin sayısını en üst düzeye çıkarır ve "nesne" türlerinin sayısını en aza indirir ve bu nedenle sisteminizde gerçekten yanlış gidebilecek yer sayısını kesinlikle en aza indirir. Sonuç, karmaşık bir bağımlılık grafiği olmayan, sadece bileşenlere sistem, asla tersine ve asla diğer bileşenlere bileşen olmayan çok "düz" bir sistemdir. Temelde çok daha ham veri ve kod tabanının işlevselliğini anahtar alanlara, anahtar soyutlamalara merkezileştirme ve düzleştirme etkisine sahip çok daha az soyutlama.
Karmaşık şey kendi başına dururken bu 30 basit şeyin birbiriyle ilişkili olması durumunda, 30 basit şeyin akıl yürütmesi mutlaka 1'den daha karmaşık olan şeyden daha kolay değildir. Bu yüzden benim önerim aslında karmaşıklığı nesneler arasındaki etkileşimlerden ve daha fazlasını kitlesel ayrıştırmayı elde etmek için başka herhangi bir şeyle etkileşime girmek zorunda olmayan daha hantal nesnelere (monolitlere ve tanrı nesnelerine değil, aklınıza gelen ve 200 yöntemli sınıflar değil, minimalist bir arayüze sahip olmasına rağmen a Message
veya a'dan oldukça yüksek bir şey Particle
). Ve daha sade eski veri türlerini tercih edin. Bunlara ne kadar bağımlı olursanız, o kadar az bağlantı elde edersiniz. Bu bazı SE fikirleriyle çelişse bile, gerçekten çok yardımcı olduğunu buldum.