İşlevsel bir programlama dilinde durumu (genel olarak) ele almak için ortak bir teknik var mı? Küresel durumu idare etmek için her (fonksiyonel) programlama dilinde çözümler var, ancak bundan olabildiğince kaçınmak istiyorum.
Tamamen işlevsel bir şekilde tüm durumlar fonksiyon parametreleridir. Bu yüzden, tüm oyun durumunu (dünya, oyuncular, pozisyonlar, puan, varlıklar, düşmanlar, ... ile devasa bir hashmap), belirli bir giriş veya tetikleyicide dünyayı manipüle etmek isteyen tüm işlevlere bir parametre olarak koymam gerekiyor . İşlevin kendisi, gamestate blobundan ilgili bilgileri alır, onunla bir şeyler yapar, gamestate'i manipüle eder ve gamestate'i iade eder. Ama bu sorun için kötü bir çözüm gibi görünüyor. Tüm oyun alanını tüm fonksiyonlara koyarsam, küresel değişkenlerin veya zorunlu yaklaşımın aksine benim için hiçbir faydası olmaz.
Sadece ilgili bilgileri fonksiyonlara koyabilir ve verilen girdi için yapılacak işlemleri geri gönderebilirim. Ve tek bir işlev tüm eylemleri oyun oyununa uygular. Ancak çoğu işlevin bir çok "ilgili" bilgiye ihtiyacı vardır. move()
nesne pozisyonuna, hıza, çarpışma haritasına, tüm düşmanların pozisyonuna, mevcut sağlığa, ... yani bu yaklaşım da işe yaramıyor gibi görünüyor.
Öyleyse sorum şu: İşlevsel bir programlama dilinde büyük miktarda durumu nasıl ele alacağım - özellikle oyun geliştirme için?
EDIT: Clojure'da oyun oluşturmak için bazı oyun çerçeveleri var. Bu sorunu kısmen çözme yaklaşımı , oyundaki tüm nesneleri "varlıklar" olarak işleyip büyük bir torbaya koymaktır. Bir gigant ana işlevi ekranını düzenliyor ve kurum ve sap olaylar ( :on-key-down
, :on-init
bu varlıklar için, ...) ve ana ekran döngü çalıştırın. Ama bu aradığım temiz çözüm değil.
move()
muhtemelen en 'güncel' nesnesinde geçirerek edilmelidir (ya da bunun için bir tanımlayıcı) yanı sıra birinci sadece içinde hareket ve oluyor, türetmek anki konumunu ve hızını ... çıkış en azından daha sonra tüm fizik dünyası ya değiştirilen nesnelerin listesi.