Endişesi, çok sayıda sınıfın bir bakım kabusuna dönüşmesiydi. Benim görüşüme göre tam tersi etkiye sahip olacağıydı.
Kesinlikle arkadaşınızın yanındayım, ancak bu bizim etki alanlarımız, çözdüğümüz sorun ve tasarım türleri ve özellikle gelecekte hangi tür şeyleri gerektirmesi muhtemeldir. Farklı problemler, farklı çözümler. Doğru ya da yanlış olduğuna inanmıyorum, sadece programcılar kendi tasarım problemlerini en iyi şekilde çözebilecekleri en iyi yolu bulmaya çalışıyorlar. Oyun motorlarına pek benzemeyen VFX'te çalışıyorum.
Ancak, en azından bir şekilde KATI uyumlu bir mimariden (COM tabanlı) daha fazla olarak adlandırılabilecek bir şeyle mücadele ettiğim sorun, kabaca "çok fazla sınıf" veya "çok fazla işlev" olarak kaynamış olabilir. Arkadaşın tarif edebilir. Özellikle, "çok fazla etkileşim, çok fazla yaramazlık yapabilecek çok fazla yer, yan etkilere neden olabilecek çok fazla yer, değişmesi gerekebilecek çok fazla yer ve onların yaptıklarını düşünmeyecek çok fazla yer" diyeceğim. ."
Bir tekne yükü alt tipi tarafından uygulanan bir avuç soyut (ve saf) arayüzümüz vardı (bu şemayı ECS'in yararları hakkında konuşmak bağlamında sol alt yorumu dikkate almayın):
Bir hareket arayüzü veya bir sahne düğümü arayüzünün yüzlerce alt tip tarafından uygulanabileceği yerler: ışıklar, kameralar, kafesler, fizik çözücüler, gölgelendiriciler, dokular, kemikler, ilkel şekiller, eğriler vb. ). Ve asıl sorun, bu tasarımların o kadar istikrarlı olmamasıydı. Değişen gereksinimlerimiz vardı ve bazen arayüzlerin kendilerinin de değişmesi gerekiyordu ve 200 alt tip tarafından uygulanan soyut bir arayüzü değiştirmek istediğinizde, bu oldukça maliyetli bir değişim. Aralarında bu tür tasarım değişikliklerinin maliyetlerini düşüren soyut temel sınıfları kullanarak azaltmaya başladık, ancak yine de pahalılardı.
Bu yüzden alternatif olarak, oyun endüstrisinde yaygın olarak kullanılan varlık-bileşen sistemi mimarisini keşfetmeye başladım. Bu şekilde olması için her şeyi değiştirdi:
Ve vay! Bu, bakım açısından böyle bir fark oldu. Bağımlılıklar artık soyutlamalara değil , verilere (bileşenlere) doğru akıyordu . Ve benim durumumda, en azından, değişen gereksinimlere rağmen, tasarım açısından en doğru olanı elde etmek için çok daha kararlı ve daha kolaydı (yine de aynı verilerle yapabileceklerimiz sürekli değişen gereksinimlerle değişiyor olsa da).
Ayrıca bir ECS'deki varlıkların miras yerine kompozisyon kullanması nedeniyle aslında işlevsellik içermeleri gerekmez. Bunlar sadece analog "bileşen kabı" dır. Böylece, bir hareket ara yüzünü uygulayan analog 200 alt- tip, bir hareket bileşenini (hareketle ilişkili verilerden başka bir şey olmayan ) saklayan 200 varlık örneğine (ayrı kodlu ayrı tipler değil) dönüşür . A artık ayrı bir sınıf / alt tip değildir. Hiç bir sınıf değil. Bu, sadece uzayda (hareket) bulunduğu yerle ilgili bazı bileşenleri (verileri) ve nokta ışıklarının belirli özelliklerini birleştiren bir varlık örneğidir. Onlarla ilişkilendirilen tek işlev,PointLight
RenderSystem
Sahnenin nasıl oluşturulacağını belirlemek için sahnedeki hafif bileşenleri arar.
ECS yaklaşımı altındaki değişen gereksinimlerle, çoğu zaman yalnızca bu veriler üzerinde çalışan bir veya iki sistemi değiştirmeye ya da sadece yeni bir sistemi uygulamaya koymaya ya da yeni verilere ihtiyaç duyulduğunda yeni bir bileşen sunmaya ihtiyaç duyuluyordu.
Bu yüzden, en azından benim alanım için ve herkes için olmadığından neredeyse eminim, bu durum işleri çok daha kolaylaştırdı çünkü bağımlılıklar dengeye doğru akıyordu (sık sık değişmesi gerekmeyen şeyler). COM mimarisinde, bağımlılıklar soyutlamalara doğru bir şekilde akarken, durum böyle değildi. Benim durumumda, önünüzdeki hareket için hangi verilerin gerekli olduğunu bulmaktan daha kolaydır, bununla birlikte yapabileceğiniz tüm olası şeyler yerine, çoğu zaman yeni gereksinimler ortaya çıktıkça aylar veya yıllar içinde biraz değişir.
OID'de, SOLID ilkelerinin bir kısmının veya tamamının, kodu temizlemek için kendilerini ödünç vermediği durumlar var mı?
Pekala, temiz kod Bazı insanlar temiz kodu SOLID ile eşitleştiği için söyleyemem, ancak kesinlikle ECS'nin yaptığı gibi işlevsellikten verileri ayırmanın ve bağımlılıkları soyutlamalardan veriye yönlendirmenin işleri kesinlikle çok daha kolay hale getirebileceği bazı durumlar vardır. Açıkça birleştirme nedenlerinden dolayı, veriler soyutlamalardan çok daha kararlı olacaksa değiştirin. Elbette verilere olan bağımlılıklar değişmezlerin korunmasını zorlaştırabilir, ancak ECS verilen herhangi bir bileşene erişen sistem sayısını en aza indiren sistem organizasyonu ile bunu en aza indirgeme eğilimindedir.
DIP'nin önerdiği gibi bağımlılıkların soyutlamaya doğru akması gerekmez; Bağımlılıklar gelecekteki değişikliklere ihtiyaç duyması muhtemel olmayan şeylere doğru akmalıdır. Bu, her durumda soyutlamalar olabilir veya olmayabilir (kesinlikle benim değildi).
- Evet, kısmen SOLID ile çatışan OOP tasarım ilkeleri mevcut
- Evet, tamamen SOLID ile çelişen OOP tasarım ilkeleri mevcut.
ECS'nin gerçekten bir OOP tadı olup olmadığından emin değilim. Bazı insanlar bunu böyle tanımlamaktadır, fakat ben onu birleştirme özelliklerinden ve verilerin (bileşenlerin) işlevsellikten (sistemlerden) ve veri kapsülleme eksikliğinden ayrılmasından çok farklı görüyorum. Bir OOP şekli olarak kabul edilirse, bunun SOLID (en azından en katı SRP, açık / kapalı, liskov ikame ve DIP fikirleri) ile çatışmakta olduğunu düşünürdüm. Ancak umarım bu, en azından insanların kendilerini daha tanınabilir bir OOP bağlamında yorumlayacağı gibi, SOLID'in en temel yönlerinin bu kadar uygulanabilir olmayabileceği bir durum ve alanın makul bir örneğidir.
Ufacık Sınıflar
Arkadaşlarımın sürprizine göre, birçok küçük sınıf ve birkaç soyutlama katmanı içeren oyunlarımdan birinin mimarisini açıklıyordum. Bunun, her şeye Tek Sorumluluk vermeye ve aynı zamanda bileşenler arasındaki eşleşmeyi gevşetmeye odaklanmamın sonucu olduğunu savundum.
ECS meydan okudu ve görüşlerimi çok değiştirdi. Sizin gibi, sürdürülebilirlik fikrinin mümkün olan şeyler için en basit uygulamaya sahip olduğunu düşünürdüm, bu da birçok şeyi ima eder, ve ayrıca, birbirine bağımlı olan birçok şey (karşılıklı bağımlılıklar soyutlamalar arasında olsa bile). En basit, basit uygulamayı görmek ve sadece bir sınıfı veya işlevi yakınlaştırıyorsanız, en basit, basit uygulamayı görmek istiyorsanız ve bir tanesini göremezsek, onu yeniden düzenleyebilir ve hatta daha da ayrıştırabilirsiniz. Ancak, sonuç olarak dış dünyayla olan biteni kaçırmak kolay olabilir, çünkü göreceli olarak karmaşık bir şeyi 2 veya daha fazla şeye ayırdığınızda, bu 2 veya daha fazla şey kaçınılmaz olarak birbirleriyle etkileşime girmelidir * (aşağıya bakınız) ya da dışarıdaki bir şeyin hepsi ile etkileşime girmesi gerekir.
Bugünlerde, bir şeyin basitliği ile ne kadar şey olduğu ve ne kadar etkileşimin gerekli olduğu arasında bir dengeleme hareketi olduğunu görüyorum. Bir ECS'deki sistemler, PhysicsSystem
ya RenderSystem
da ya da gibi veriler üzerinde çalışmak için önemsiz olmayan uygulamalarla oldukça ağır olma eğilimindedir GuiLayoutSystem
. Bununla birlikte, karmaşık bir ürünün çok azına ihtiyaç duyması, geri adım atmayı kolaylaştırma ve tüm kod tabanının genel davranışı hakkında neden olma eğilimindedir. Orada, daha az sayıda, daha zorlu sınıfların (hala tartışmalı bir tekil sorumluluk üstlenerek) yanlarına yaslanmanın kötü bir fikir olmadığını düşünebilecek bir şey var. sistem.
Etkileşimler
Diyelim ki "birleşme" yerine "etkileşimler" diyorum (etkileşimleri azaltmak her ikisini de azaltmayı ima ediyor), çünkü iki somut nesneyi ayırmak için soyutlamalar kullanabilirsiniz, ancak yine de birbirleriyle konuşurlar. Bu dolaylı iletişim sürecinde hala yan etkilere neden olabilirler. Sıklıkla bir sistemin doğruluğu hakkında akıl yürütme yeteneğimin, bu "etkileşimlerle" "eşleşme" den daha fazla olduğunu düşünüyorum. Etkileşimin en aza indirilmesi, benim için her şeyden kuşbakışı bakış açısına bakmamı kolaylaştırır. Bu, birbirleriyle hiç konuşmayan şeyler anlamına gelir ve bu anlamda ECS aynı zamanda “etkileşimleri” en aza indirgeme eğilimindedir ve en azından en azından sahip olduğum en az şeyle eşleşmeyi değil
Bu, en azından kısmen ben ve kişisel zayıf yönlerim olabileceğini söyledi. Muazzam ölçekte sistemler yaratmam için en büyük engeli buldum ve yine de onlar için güvenle nedenlerim var, aralarında gezinebilirim ve öngörülebilir bir şekilde herhangi bir yerde istenen herhangi bir potansiyel değişikliği yapabileceğimi hissediyorum, devlet ve kaynak yönetimi ile birlikte yan etkiler. Tamamen kendi başıma yazdığım kod için bile, on binlerce LOC'den yüz binlerce LOC'dan milyonlarca LOC'ye geçerken ortaya çıkmaya başlayan en büyük engel bu. Bir şey beni her şeyden önce sürünmeye yavaşlatacaksa, bu durum uygulama durumu, veriler ve yan etkiler açısından neler olup bittiğini artık anlayamayacağım anlamına geliyor. O' Sistem aklımdaki sebep kabiliyetini aşarsa büyürse, değişimin tüm etkilerini anlayamama kadar beni yavaşlatan bir değişiklik yapmak için gereken robotik zaman değil. Ve etkileşimleri azaltmak, benim için, kişisel olarak bunlardan çok etkilenmeden, çok daha fazla özellik ile ürünün daha fazla büyümesine izin vermenin en etkili yoluydu, çünkü etkileşimleri en aza indirgemek mümkün olan yer sayısını azaltır. uygulama durumunu bile değiştirebilir ve önemli ölçüde yan etkilere neden olabilir.
Böyle bir şeyi döndürebilir (şemadaki her şeyin işlevselliğe sahip olduğu ve açıkçası gerçek dünya senaryosunun birçok kez nesneye sahip olacağı ve bu bir eşleştirme olarak değil, bir eşleştirme değil, bir "etkileşim" şemasıdır. biri arasında soyutlamalar olurdu):
... bunun için sadece sistemlerin işlevselliği olduğu yerler (mavi bileşenler şimdi sadece veridir ve şimdi bu bir bağlantı şemasıdır):
Bunların hepsinde ortaya çıkan ve belki de bu faydaların bazılarını SOLID ile daha uyumlu bir OOP bağlamında çerçevelemenin bir yolu var, ama henüz tasarımları ve kelimeleri henüz bulamadım. Ben terminoloji ben doğrudan OOP ile ilgili tüm etrafa atmak için kullanılan beri zor. Buradaki insanların cevaplarını okuyarak ve kendime göre formüle etmek için elimden gelenin en iyisini yapmaya çalışıyorum ama ECS'nin doğası hakkında parmağımı tam olarak yerleştiremediğim için çok ilginç şeyler var. onu kullanmayan mimarilere bile daha geniş çapta uygulanabilir. Ayrıca, bu cevabın ECS'nin bir promosyonu olarak çıkmadığını da umarım! Bir ECS tasarlamak gerçekten düşüncelerimi ciddi bir şekilde değiştirdiği için çok ilginç buluyorum.