İf web problemini ele alarak , her bir kuralın bağımsız olarak kodlandığı bir kural motoru oluşturabilirsiniz. Bunun için bir başka ayrıntı da, kuralları oluşturmak için alana özgü bir dil (DSL) oluşturmak olacaktır, ancak yalnızca DSL yalnızca sorunu bir kod tabanından (ana) diğerine (DSL) alır. Yapı olmadan DSL, anadilden (Java, C # vb.) Daha iyi sonuç almayacaktır, bu yüzden gelişmiş bir yapısal yaklaşım bulduktan sonra geri döneceğiz.
Temel sorun, bir modelleme probleminiz olması. Bu gibi birleşimsel durumlarla karşılaştığınızda, durumu tanımlayan model soyutlamanızın çok kaba olduğunun açık bir işaretidir. Büyük olasılıkla farklı modellere ait olması gereken unsurları tek bir varlıkta birleştiriyor olabilirsiniz.
Modelinizi parçalamaya devam ederseniz, sonuçta bu kombinasyon etkisini tamamen çözeceksiniz. Ancak bu yolu seçerken tasarımınızda daha da büyük bir karmaşa yaratarak kaybolmak kolaydır, burada mükemmeliyetçilik mutlaka arkadaşınız değildir.
Sonlu durum makineleri ve kural motorları, bu problemin nasıl çözülebileceğine ve yönetilebilir hale getirildiğinin sadece bir örneğidir. Buradaki ana fikir, bunun gibi bir birleşim probleminden kurtulmanın iyi bir yolunun, genellikle bir tasarım oluşturmak ve sisteminizi tatmin edici bir şekilde yerine getirene kadar iç içe geçmiş soyutlama seviyelerinde tekrarlamaktır . Fraktalların karmaşık desenler oluşturmak için nasıl kullanıldığına benzer. Sisteminize mikroskopla veya yüksek kuş bakışı bir bakışla bakarsanız, kurallar aynı kalır.
Bunu etki alanınıza uygulama örneği.
İneklerin bir arazide nasıl hareket ettiğini modellemeye çalışıyorsunuz. Sorunuzda ayrıntı bulunmasa da, büyük miktarda ifs'in if cow.isStanding then cow.canRun = true
örneğin arazi detaylarını ekledikçe tıkanıp kalmış gibi karar parçasını içerdiğini tahmin ediyorum . Bu nedenle, almak istediğiniz her eylem için, düşünebileceğiniz her yönü kontrol etmeniz ve bir sonraki olası eylem için bu doğrulamaları tekrar etmeniz gerekir.
İlk önce, bu durumda simülasyonun değişen durumlarını modellemek için bir FSM olacak olan tekrarlanabilir tasarımımıza ihtiyacımız var. Bu yüzden yapacağım ilk şey referans FSM uygulamak, durum arayüzü, geçiş arayüzü ve belki de geçiş bağlamını tanımlamak.diğer ikisine sunulacak paylaşılan bilgiler içerebilir. Temel bir FSM uygulaması, içeriğe bakılmaksızın bir geçişten diğerine geçecektir, bu bir kural motorunun girdiği yerdir. Kural motoru, geçiş gerçekleşmesi durumunda yerine getirilmesi gereken şartları temiz bir şekilde kapsar. Buradaki bir kural motoru, her biri bir boole döndüren bir değerlendirme işlevine sahip olan bir kural listesi kadar basit olabilir. Bir geçişin gerçekleşmesi gerekip gerekmediğini kontrol etmek için, kuralların listesini yineleyin ve herhangi biri yanlış olarak değerlendirilirse, geçiş gerçekleşmez. Geçişin kendisi , FSM'nin (ve diğer olası görevlerin) mevcut durumunu değiştirmek için davranış kodunu içerecektir .
Şimdi, simülasyonu GOD seviyesinde tek bir büyük FSM olarak uygulamaya başlarsam, bir sürü muhtemel durum, geçiş vb. İle sonuçlanır. If-else karmaşası sabit gibi görünür, ancak aslında sadece yayılır: her bir IF Şimdi bağlamın belirli bir bilgisine karşı test yapan bir kural (bu noktada hemen hemen her şeyi içerir) ve her IF kuruluşu geçiş kodunda bir yerdedir.
Fraktallar dağılımına girin: ilk adım, devletlerin ineğin kendi iç durumları olduğu (ayakta durma, koşma, yürüme, otlatma vb.) Ve aralarındaki geçişlerin çevreden etkileneceği her inek için bir FSM oluşturmak olacaktır. Grafiğin tamamlanmamış olması mümkündür, örneğin otlatma sadece durgun durumdan erişilebilir, başka herhangi bir geçiş engellenmiştir, çünkü basitçe modelden yoktur. Burada, verileri inek ve arazi olmak üzere iki farklı modelde etkili bir şekilde ayırıyorsunuz. Her biri kendi özelliklerine sahip. Bu arıza, genel motor tasarımınızı basitleştirmenizi sağlayacaktır. Şimdi, hepsine karar veren tek bir kural motoruna sahip olmak yerine, çok özel detaylara karar veren birden fazla, daha basit kural motorlarına (her geçiş için bir tane) sahip olduğunuza karar verin.
Çünkü FSM için aynı kodu kullanıyorum, bu temel olarak FSM'nin bir yapılandırması. DSL'den daha önce bahsettiğimizi hatırlıyor musun? Yazmak için çok fazla kural ve geçişiniz varsa DSL çok iyi şeyler yapabilir.
Daha derine gitmek
Artık ALLAH, ineğin iç durumlarını yönetme konusundaki tüm karmaşıklıkla uğraşmak zorunda değil, ancak daha da ileri götürebiliriz. Örneğin, araziyi yönetmede hala çok fazla karmaşıklık var. Yıkımın nerede olduğuna karar verdiğin yer Örneğin, TANRI'nızda, arazi dinamiklerini (uzun ot, çamur, kuru çamur, kısa ot vb.) Yönetiyorsanız, aynı modeli tekrarlayabiliriz. Tüm arazi durumlarını (uzun ot, kısa ot, çamurlu, kuru, vb.) Devletler arasındaki geçişler ve basit kurallar ile yeni bir arazi FSM'sine çıkararak bu tür bir mantığı araziye yerleştirmenizi engelleyen hiçbir şey yoktur. Örneğin çamurlu duruma gelmek için kural motoru sıvıları bulmak için bağlamı kontrol etmelidir, aksi takdirde mümkün değildir. Şimdi ALLAH daha da kolaylaştı.
FSM sistemini özerk hale getirerek tamamlayabilir ve her birine bir iş parçacığı verebilirsiniz. Bu son adım gerekli değildir ancak karar verme kararınızı nasıl delege edeceğinizi ayarlayarak (özel bir FSM başlatmak veya önceden belirlenmiş bir durumu geri getirmek için) sistemin etkileşimini dinamik olarak değiştirmenize olanak sağlar.
Geçişlerin "diğer olası işler" de yapabileceğinden nasıl bahsettiğimizi hatırlıyor musunuz? Farklı modellerin (FSM) birbirleriyle iletişim kurma olasılığını ekleyerek bunu keşfedelim. Bir olay kümesi tanımlayabilir ve her FSM'nin bu olaylara dinleyici kaydetmesine izin verebilirsiniz. Bu nedenle, örneğin bir ineğin altıgen arazisine girmesi durumunda, altıgen geçiş değişiklikleri için dinleyicileri kaydedebilir. Burada biraz zorlaşıyor çünkü her FSM, barındırdığı belirli alan hakkında herhangi bir bilgi olmadan çok yüksek bir seviyede uygulanıyor. Bununla birlikte, ineğe bir olaylar listesi yayınlamasını sağlayarak başarabilir ve tepki gösterebileceği olayları görürse hücre kayıt olabilir. Burada olay ailesi iyi bir hiyerarşi iyi bir yatırımdır.
Çimenin besin düzeylerini ve büyüme döngüsünü modelleyerek daha da derinlere itebilirsiniz, tahmin ettiğiniz ... arazi yamasının kendi modeline gömülü bir çim FSM'si.
Fikri yeterince zorlarsanız, ALLAH'ın yapması gereken çok şey yoktur, çünkü tüm yönler kendi kendine yönetilir ve daha tanrısal şeyler için vakit ayırır.
tekrarlamak
Yukarıda FSM'de belirtildiği gibi, çözüm değildir, sadece böyle bir sorunun çözümünün söylenen kodda bulunmadığını, ancak sorununuzu nasıl modellediğinizi göstermenin bir yolu. FSM önerimden daha muhtemel ve en büyük olasılıkla daha iyi olan başka çözümler de var. Bununla birlikte, "fraktallar" yaklaşımı bu zorluğun üstesinden gelmek için iyi bir yol olmaya devam etmektedir. Doğru şekilde yapılırsa, daha az önemli olduğu yerlerde daha basit modeller verirken, önemli olduğu yerlerde daha derindeki seviyeleri dinamik olarak tahsis edebilirsiniz. Değişiklikleri sıraya koyabilir ve kaynaklar daha uygun hale geldiğinde uygulayabilirsiniz. Bir eylem dizisinde inekden ot yamaya kadar besin transferini hesaplamak o kadar da önemli olmayabilir. Bununla birlikte, bu geçişleri kaydedebilir ve değişiklikleri daha sonra uygulayabilirsiniz veya sadece kural motorlarını değiştirerek veya doğrudan FSM uygulamasını doğrudan alanda olmayan elemanlar için daha basit bir saf sürümle değiştirerek, eğitimli bir tahminle yaklaşık olarak uygulayabilirsiniz. ilginin (alanın diğer ucundaki inek) odaklanmasını ve kaynakların daha büyük bir bölümünü elde etmesini sağlamak için daha ayrıntılı etkileşimlere izin vermesidir. Bütün bunlar sistemi bir bütün olarak tekrar ziyaret etmeden; Her parça iyi bir şekilde izole edildiğinden, modelinizin derinliğini sınırlayan veya genişleten bir drop-in değiştirme oluşturmak daha kolay hale gelir. Standart bir tasarım kullanarak, bunun üzerine kurabilir ve DSL gibi geçici araçlara yapılan yatırımları en üst düzeye çıkarmak ve gerektiğinde iyileştirmeleri eklemek için kurallar veya etkinlikler için standart bir kelime haznesi oluşturabilirsiniz. Her parça iyi bir şekilde izole edildiğinden, modelinizin derinliğini sınırlayan veya genişleten bir drop-in değiştirme oluşturmak daha kolay hale gelir. Standart bir tasarım kullanarak, bunun üzerine kurabilir ve DSL gibi geçici araçlara yapılan yatırımları en üst düzeye çıkarmak ve gerektiğinde iyileştirmeleri eklemek için kurallar veya etkinlikler için standart bir kelime haznesi oluşturabilirsiniz. Her parça iyi bir şekilde izole edildiğinden, modelinizin derinliğini sınırlayan veya genişleten bir drop-in değiştirme oluşturmak daha kolay hale gelir. Standart bir tasarım kullanarak, bunun üzerine kurabilir ve DSL gibi geçici araçlara yapılan yatırımları en üst düzeye çıkarmak ve gerektiğinde iyileştirmeleri eklemek için kurallar veya etkinlikler için standart bir kelime haznesi oluşturabilirsiniz.
Bir kod örneği verirdim ama şu anda yapabileceğim tek şey bu.