2014-11-16 10 views
8

Ho creato un algoritmo che calcola alcune cose. Questo può essere considerato come il modello. L'algoritmo è implementato in modo completamente funzionale, quindi utilizza solo classi immutabili. Ora usando questo modello, vorrei sviluppare un livello GUI in cima ad esso. Tuttavia non so nulla delle migliori pratiche di costruzione di GUI in Scala. Intendo usare ScalaFX.Scala, GUI e immutabilità

Il mio problema è il seguente: in ScalaFX (analogamente a JavaFX) è possibile associare valori dalla GUI alle proprietà dell'oggetto. Ciò viola chiaramente il paradigma funzionale, ma sembra molto conveniente. Ciò richiederebbe la riscrittura delle mie classi per usare proprietà legabili che sembrerebbero come la coda che agita il cane - il modello dipenderebbe dalla GUI.

D'altra parte, potrei avere un livello GUI indipendente. In questo caso avrei bisogno di oggetti proxy da associare e dovrei creare i miei oggetti modello basati su questi oggetti proxy. Questo sembrerebbe più idiomatico, ma implica molta duplicazione del codice e lavoro extra. Il mio modello e gli oggetti proxy dovrebbero essere mantenuti sincronizzati e dovrei occuparmi di copiare gli attributi.

Qual è un buon modo per farlo? Una GUI è sempre piena di mutevole, quindi la programmazione funzionale non si sente qui. Tuttavia, adoro Scala, quindi mi piacerebbe continuare a utilizzarlo anche per la GUI.

+2

"Una GUI è sempre piena di mutevole, quindi la programmazione funzionale non si sente proprio qui.". Strizza l'occhio nel modo giusto e non è così mutabile: http://stackoverflow.com/questions/1028250/what-is-functional-reactive-programming –

risposta

5

Nonostante lo sforzo extra, prendere il secondo approccio. Crea piccole istanze di "visualizzazione" mutabili per ciascun modello. Associare le viste ai widget e installare osservatori o hook che aggiornano i proxy di visualizzazione in base alle modifiche nel modello. Non lasciare che l'API della GUI imponga come dovrebbe essere l'approccio e il modello della concorrenza.

Credo ci siano alcune librerie open source in giro che forniscono un livello di astrazione più funzionale e/o reattivo al piano Scala-Swing o Scala-FX.