JavaFX - il modo giusto di usare Proprietà con oggetti di dominio


10

JavaFX ha fornito una serie di nuovi oggetti Property, come quelli javafx.beans.property.DoublePropertyche consentono di definire campi che possono essere automaticamente osservati e sincronizzati.

In molti esempi JFX, la classe del modello MVC ha un numero di questi campi Proprietà, che possono quindi legarsi automaticamente alla vista.

Tuttavia, questo sembra incoraggiarci a mettere le proprietà JFX nei nostri oggetti Dominio (se si assume che la classe Model sarà un oggetto di dominio), il che mi sembra una scarsa separazione delle preoccupazioni (cioè inserire il codice GUI nel Dominio ).

Qualcuno ha visto risolvere questo problema nella "vita reale" e, in tal caso, come è stato fatto?


Per favore, correggimi se sbaglio, ma la mia comprensione di JavaFX è stata che è stato accantonato da Sun nel 2008 prima dell'acquisto di Oracle, ed è stato rinnovato sul mercato solo con il deprezzamento di Silverlight e Declino di Flash sui dispositivi Apple. Forse hai ragione sul fatto che è strettamente accoppiato alla vista, e un motivo originale è stato messo in attesa al sole. Solo un pensiero.
Jack Stone,

Sun e ora Oracle lavorano ininterrottamente su JavaFX da diversi anni. Il recente grande cambiamento è stato quello di interrompere il linguaggio di programmazione "JavaFX Script" necessario per utilizzare JavaFX e passare all'utilizzo di Java ordinario. Questo spostamento è stato guidato dalla scarsa adozione e dalle spese per il supporto di un linguaggio di programmazione completamente nuovo.
Stuart segna il

Risposte:


4

Ho giocato con JavaFX 2.0, che presumo riguardi la tua domanda. Non un vero codice di produzione, solo un progetto personale, ma ho riscontrato lo stesso problema che hai menzionato sopra. L'intero modello tende a diventare dipendente dal framework 2D e non mi piace.

Quello che ho fatto è che ho diviso in due ogni singola classe del modello, la vera classe del modello, che ha le capacità per caricare i suoi contenuti dal database, sa come altera il suo stato ecc ecc ... e la classe di rappresentazione che decide l'aspetto sullo schermo. Quest'ultimo conterrebbe tutte le classi di proprietà.

Troverai lo stesso design in qualsiasi framework MVC, come Swing. è solo che qui non c'è scampo dal farlo.


Un framework che ti costringe ad applicare buoni principi di progettazione o esplodere in faccia se non lo fai. Come un ragazzo di .NET, questo mi è molto familiare.
MattDavey,

0

Quasi 7 anni dopo e questa domanda è ancora valida come prima.

A mio avviso, javafx non dovrebbe mai essere importato da nessuna delle classi appartenenti al Modello. Tuttavia, potrebbero funzionare molto bene se si adotta un MVVM combinato con l'architettura MVC. In questo senso il

  • entity = (domain) model ( M )
  • File FXML = vista ( V )
  • il controller è ancora il controller ( C )
  • the view-model ( VM ) = un nuovo set di classi di dati che contengono solo proprietà javafx e un riferimento all'oggetto di dominio effettivo (M) che rappresenta. Può trasferire ulteriormente le chiamate del metodo di business logic a questo oggetto, fungendo da composito / decoratore.

MVVM + MVC

Un altro modo di vedere le cose è pensare alla classe del controller come parte della vista, dal momento che tutto ciò che fa è associare il modello di vista alla vista (dati e azioni). Quindi potrebbe essere facilmente chiamato presentatore o addirittura raccoglitore. Ciò dipende tuttavia da come si utilizza il controller. Se aggiungi la logica per manipolare il modello di visualizzazione nella classe Controller, allora merita il suo nome e hai l'architettura presentata sopra. Se la classe controller associa solo i dati del modello agli elementi dell'interfaccia utente e ActionEvents ai metodi del modello, allora si tende a presentare l'architettura mutante MVVM di seguito.

MVPVM

Penso che queste architetture in qualche modo maturino le idee di zio Bob su un'architettura pulita (il livello di presentazione).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.