2014-11-16 19 views
8

Belirli şeyleri hesaplayan bir algoritma oluşturdum. Bu model olarak düşünülebilir. Algoritma tamamen işlevsel bir şekilde uygulanır, bu nedenle yalnızca değişmez sınıflar kullanır. Şimdi bu modeli kullanarak, üzerinde bir GUI katmanı geliştirmek istiyorum. Ancak, Scala'da GUI inşa etmenin en iyi uygulamaları hakkında hiçbir şey bilmiyorum. ScalaFX'i kullanmayı düşünüyorum.Scala, GUI ve değişmezlik

Sorunum şudur: ScalaFX'te (JavaFX'e benzer şekilde), GUI'den nesne özelliklerine değerleri bağlayabilirsiniz. Bu, işlevsel paradigmayı açıkça ihlal ediyor, ancak çok uygun görünüyor. Bu, sınıflarımı, köpeği sallanan kuyruk gibi hissedecek şekilde binilebilir özellikler kullanmak için yeniden yazmayı gerektirirdi - model GUI'ye bağlıydı. Diğer yandan, bağımsız bir GUI katmanına sahip olabilirdim. Bu durumda, bağlanacak proxy nesnelere ihtiyaç duyardım ve bu proxy nesnelerine dayanarak model nesnelerini oluşturmam gerekirdi. Bu daha idiomatik hisseder ama çok fazla kod çoğaltması ve fazladan iş gerektirir. Benim modelim ve vekil nesneler eşzamanlı olarak saklanmak zorunda kalacaktı ve özniteliklerin kopyalanmasıyla ilgilenmem gerekiyordu.

Bunu yapmanın iyi bir yolu nedir? Bir GUI her zaman mutabiliteyle doludur, bu yüzden fonksiyonel programlama burada tam olarak hissetmez. Yine de Scala'yı seviyorum, dolayısıyla GUI için kullanmaya devam etmek istiyorum.

+2

"Bir GUI her zaman mutabiliteyle doludur; bu nedenle, işlevsel programlama burada tam olarak hissetmemektedir.". Doğru şekilde şaşıyın ve bu çok değişken değil: http://stackoverflow.com/questions/1028250/what-is-functional-reactive-programming –

cevap

5

Ekstra çabalara rağmen, ikinci yaklaşıma girin. Modelinizin her biri için küçük değiştirilebilen "görünüm" örnekleri oluşturun. Görünümleri widget'lara bağlayın ve modelinizdeki değişikliklere bağlı olarak görünüm proxy'lerini güncelleyen gözlemcileri veya kancaları takın. GUI API'sinin eşzamanlılık yaklaşımınızın ve modelinizin nasıl görünmesi gerektiğini belirleme. Düz Scala-Swing veya Scala-FX'e daha işlevsel ve/veya reaktif bir soyutlama katmanı sağlayan, çevresinde birkaç açık kaynak kütüphanesi olduğuna inanıyorum.