İşlevsel dillerde UI kalıpları


11

ClojureScript ile uğraşmaya başlamak istiyorum, ancak bazı noktalar hakkında şaşkınım. Benim sorunum, işlevsel olarak çalışmaya çalışırken, kullanıcı etkileşiminden gelen durum değişiklikleriyle başa çıkmanın iyi bir yolu.

Birkaç örnek vereyim. Tarayıcıda çalışan uygulamaları göz önünde bulunduruyorum, ancak sorunun daha genel olduğunu düşünüyorum. Tabii ki bir şeyler değişecek - en azından DOM. Ama değişmez veri yapılarıyla çalışmak için kodun geri kalanını nasıl organize edeceğimizi öğrenmek istiyorum.

1) Diyelim ki bazı DOM nesnelerine bazı olaylar eklemek istiyorum. Bunu çoğunlukla işlevsel bir şekilde yapmak zor değildir: Düğümü oluşturduğunuzda, çeşitli olay işleyicileri ile bir karma haritası eklersiniz. Ancak olay yetkisi kullandığınız durumu düşünün. Sonra yeni bir düğüm oluşturduğunuzda, büyük olasılıkla zaten varolan bir üst düğüme bir olay işleyicisi ekleyebilirsiniz. Bu nedenle, zaten var olan düğümle ilişkili karmayı değiştirmeniz gerekir.

2) Bir giriş alanı için otomatik tamamlama modülü tasarladığımı varsayalım. Kullanıcı bir tuşa her bastığında, önerileri almak için sunucuyu arayabilirim. Bu kolay. Ama şimdi biraz optimize etmek istediğimi varsayalım. Eşleşen tüm sonuçları biliyorsam foo, eşleşen tüm sonuçlar için tekrar sormanın bir anlamı yoktur foobar; İlkine filtre uygulayabilirim. Bu yüzden bir çeşit önbellek oluşturmam gerekiyor. Bu önbellek, kullanıcı daha önce girilen kelimelerin üst kümesi olmayan yeni bir sözcük eklediğinde güncellenir. Tekrar: önbelleği nasıl modelleyebilirim? En makul yol, kelimeleri sonuçlarla eşleyen karma bir harita gibi görünmektedir, ancak değişebilir olmalıdır.

Kullanıcı etkileşimi nedeniyle değişiklikleri işlevsel bir tasarıma dahil etmeyi kolaylaştıracak bazı modeller önerebilir misiniz?


4
"Fonksiyonel Reaktif Programlama" konusuna bakın.
dan_waterworth

Bu tamamen aynı şey değil, ancak bir kullanıcı tarafından başlatılan DOM olaylarıyla eşleşen (yan etkisi olmayan) XSLT şablonları ile Saxon-CE'de benzer bir sorunla karşı karşıyayız. Görmek istediğim yol, kullanıcının XSLT'yi değil, durumdaki değişikliği tetiklemesi. Anahtar, kullanıcı etkileşimini yöneten kodun ve sonraki durum değişikliklerinin diğerlerinden çok farklı olmasını sağlamaktır.
pgfearo

@pgfearo Kullanıcı etkileşiminin diğerlerinden yeterince ayrı tutulması için kodu nasıl düzenleyeceğiniz konusunda tavsiyeleriniz var mı?
Andrea

Fonksiyonel programlama vatansız olduğu için, işlevsel olarak çalışırken durum değişiklikleriyle başa çıkmanın iyi bir yolu yoktur .
Old Pro

3
@Old Pro: Bu tamamen doğru değil. Fonksiyonel programlamada, yan etki yerine fonksiyon uygulamasını kullanarak bir hesaplama tanımlarken, sonunda hesaplamanın sonucunu bir yere kaydetmeniz gerekir. FP'nin odak noktası, durumun kullanımını en aza indirmektir, oysa zorunlu programlamada durumu aşamalı olarak (yan etkilerle) dönüştürmek bir hesaplama tanımlamak için temel araçtır.
Giorgio

Yanıtlar:


3

Yorumlarda belirtildiği gibi "Fonksiyonel Reaktif Programlama" konusuna bakmalı ve http://prog21.dadgum.com/archives.html adresindeki bazı yazıları da okumalısınız . Daha spesifik olarak, muhtemelen " Teknolojinize Aşık Olmayın ", " Nasıl Programlandığını Az Önce Öğrendiğiniz Kodu Yaz ", " Fonksiyonel Programlama Çalışmıyor (ve bununla ilgili ne yapmalı) " yazmalısınız ve belki de birkaç tane daha.

Değişebilirlik ve yan etkilerden tamamen kaçınmak neredeyse imkansızdır. Haskell programcıları bile unsafePerformIOara sıra, bazı şeyleri yapmak için tamamen işlevsel, yan etkisi olmayan, statik olarak yazılmış paradigmadan kurtulmak için faydalanacaktır. Bu projeye tamamen akademik bir alıştırma olarak giriyorsanız, hemen devam edin ve mümkün olduğunca değişebilirlik ve yan etkilerden kaçının, ancak son tarihte kullanılabilir bir ürün oluşturmaya çalışıyorsanız, o zaman hiçbir tasarruf kurtaramaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.