Cosa usare? MVC, MVP o MVVM o …?

Inizierò un progetto Java per sviluppare un’applicazione desktop. Cosa usare come pattern del layer di presentazione (MVC, MVP, MVVM o ….)?

… se è ansible, con qualche piccolo esempio funzionante … 🙂

In realtà, l’ultimo post che stai cercando è questa risposta a questa risposta di Karsten Lentzsch (di fama JGoodies) nel contesto Swing Frameworks e Best Practices Swing Frameworks e Best Practices .

Ciao,

Ho scritto app di Swing per diversi anni che molte persone trovano elegante. E insegno agli sviluppatori a lavorare con Swing in modo efficiente: come strutturare e assemblare applicazioni, come bind e convalidare data, come trovare, progettare, impaginare e implementare schermi ben progettati in Swing.

Direi che non ci sono “migliori pratiche” per Swing disponibili online. E dubito che chiunque possa fornire pratiche “migliori”, perché ciò richiederebbe discussioni tra gli sviluppatori di Swing e i fornitori di soluzioni sugli approcci, ciò che funziona bene tecnicamente e ciò che è facile da capire e con cui lavorare. Inoltre, le migliori pratiche spiegherebbero chi può ottenere ciò che produce la qualità e descriverebbero i tempi di produzione e i costi di produzione; ma non ho mai trovato queste informazioni online o in un libro Swing.

Secondo me, la mancanza di buone pratiche e informazioni su come build un’app Swing è il più big ostacolo che gli sviluppatori affrontano quando si inizia con Swing. La maggior parte degli sviluppatori con cui ho lavorato sono stati lenti nella ricerca del design, nell’implementazione di layout, nella creazione di pannelli, nel binding dei dati, nella gestione degli eventi e nella disposizione delle parti di codice e dei livelli di codice diversi. E molte app di Swing che ho visto succhiare; oltre al loro scarso design visivo sono difficili da capire e anche i piccoli cambiamenti costano molto. In genere gli sviluppatori non avevano idea di dove mettere il codice ?, come separare le preoccupazioni ?, come bind insieme le cose ?, come lavorare con le azioni ?, come avviare un’applicazione ?, e come memorizzare e ripristinare lo stato dell’interfaccia utente? La maggior parte degli sviluppatori non ha linee guida da seguire.

Ma ho scoperto che lo sviluppatore medio può lavorare bene con Swing, se preso solo per mano – in circa 3 a 10 giorni. Quasi tutte le tue domande possono essere risolte o affrontate dal codice, dalle librerie, dall’architettura dell’applicazione, dai modelli, dalle pratiche di programmazione generale, dagli esempi ben progettati, dalle esercitazioni, ecc. Insegno un processo di sviluppo Swing che è costruito attorno a un’architettura a 3 livelli che separa il dominio, lo strumento e i livelli di presentazione e si basa su un sistema di layout produttivo. Anche se la maggior parte delle parti viene eseguita a livello programmatico, gli sviluppatori ottengono risultati rapidamente e sia il codice che il design visivo diventano abbastanza coerenti. Ciò può aumentare molto la produttività di uno sviluppatore – nella misura in cui il lavoro di Swing richiede una parte significativamente più ridotta del lavoro del progetto.

Che cosa si può fare? Consiglio vivamente di studiare il progetto di Martin Fowler per ulteriori “Patterns of Enterprise Application Architecture”. Ho scoperto che questi pattern funzionano molto bene con i team Swing e Swing, anche per gli sviluppatori che sono nuovi all’architettura Swing e Swing. Per prima cosa selezionerei i seguenti modelli: “Modello di presentazione”, “Dominio separato” e “Presentazione separata”. Personalmente preferisco il modello di presentazione (modello di applicazione per Smalltalker), sopra il modello Model-View-Presenter (MVP). Tuttavia, MVP è un’alternativa vera e ben studiata.

I pattern di Fowler possono essere combinati con un’architettura a 3 client che si adatta bene alle applicazioni Swing di media ampiezza. Consiste di un livello dominio, un livello presentazione e uno strato modello intermedio. Ho delineato questa architettura nella mia presentazione di associazione dei dati. Le app basate su MVP possono essere strutturate anche in questi 3 livelli client.

Un’attività chiave per le applicazioni Swing è l’associazione dati: come connettere gli oggetti dominio e le proprietà degli oggetti dominio ai componenti Swing. Fondamentalmente è ansible copiare i dati avanti e indietro o creare catene di adattatori dai propri oggetti di dominio ai componenti dell’interfaccia utente. L’approccio alla copia è facile da capire e spesso la prima scelta per chi è nuovo di Swing o per l’associazione dei dati; Direi che questa è una buona scelta. D’altra parte, la copia rende molto più difficile sincronizzare le visualizzazioni. Le catene di adattatori e gli aggiornamenti automatici o semiautomatici possono ridurre in modo significativo la quantità di codice necessaria per associare i dati del dominio all’interfaccia utente. Il rovescio della medaglia è che questo approccio è molto più difficile da capire. Come hai sottolineato, Swing non offre una grande astrazione per un modello riutilizzabile e flessibile che può essere utilizzato per bind i campi di testo; l’interfaccia del documento non è appropriata per l’accesso ai dati generici. Ci sono alcune librerie disponibili che forniscono un’interfaccia ValueModel che è appena intesa per aggiungere un modello generico, potente e flessibile per dati a valore singolo: stringhe, booleani, numeri, date, ecc.

Non sono a conoscenza di un libro Swing che spiega un vero processo di sviluppo di applicazioni Swing. Idealmente, un tale libro combinerebbe i modelli, l’architettura e le tecniche di associazione dei dati sopra menzionate e descriverebbe come implementarlo in Swing. Ad ogni modo, c’è una documentazione di 10 anni per un processo di sviluppo di applicazioni Smalltalk che fa proprio questo. L’architettura e la documentazione di Oracle JClient non sono complete ma potrebbero essere più facili da leggere per gli sviluppatori Java. Fornisco una presentazione sull’associazione dei dati che riguarda i modelli di Fowler, un’architettura a 3 livelli e un’implementazione di Swing per questi modelli e un’associazione dati automatica. Le risorse del tutorial della mia libreria Binding possono aiutarti a familiarizzare con le catene dell’adattatore e l’interfaccia ValueModel. La migliore documentazione per il pattern MVP può essere trovata nei documenti Dolphin Smalltalk.

Una volta scelto il tuo modello di architettura e il tuo set di schemi, dovresti affrontare le seguenti attività di base di Swing: 1) migliorare l’aspetto scegliendo un set di aspetto professionale e appropriato per il set di piattaforms di destinazione, 2) scegli un sistema di layout che ti aiuti creare rapidamente schermate ben progettate e coerenti, 3) scegliere una soluzione di convalida dei dati e 4) afferrare un sacchetto di soluzioni per le attività di Swing di tutti i giorni.

Esistono un paio di progetti che delineano un’architettura Swing, indirizzano l’associazione dei dati e le tipiche attività di Swing, ad esempio: JDNC di Sun, JClient / ADF di Oracle, RCP di Spring, la piattaforma NetBeans. Fornisco una suite commerciale di soluzioni Swing che si basa sulle librerie JGoodies open source e aggiunge un sacco di soluzioni e fonti per tutti gli strumenti e demo pubblici di JGoodies. Queste fonti hanno lo scopo di spiegare come bind insieme tutte le questioni sopra menzionate.

Lasciatemi aggiungere il mio avvertimento standard sui cosiddetti framework “MVC”. Swing non usa MVC, usa un modello modificato. MVC è spesso citato in modo errato e frainteso – specialmente nel contesto di Swing. Inoltre, MVC è utile per i componenti dell’interfaccia utente, non per le applicazioni. Quindi consiglio di cercare concetti, soluzioni e librerie che riflettano e lavorino con l’architettura Swing, non con MVC.

La community dell’inventore del pattern MVC ha introdotto l’ApplicationModel (ora noto come Presentation Model) intorno al 1993; MVP è seguito un po ‘più tardi. A mio parere questi due modelli sono molto più utili per Swing di MVC. Recentemente l’ambiente che ha portato il modello di Presentation Model a un pubblico più ampio è passato a una nuova architettura: “Pollock”. I lettori interessati potrebbero google per vedere come ciò differisce dalle catene dell’adattatore che sono spesso combinate con i modelli di presentazione.

Ultimo ma non meno importante, una dichiarazione personale. Posso lavorare molto meglio con Swing che con altri toolkit o framework che ho usato prima; Posso fare di più con meno codice, il codice è strutturato meglio, è più facile da mantenere e ottengo risultati rapidamente.

Spero che questo ti aiuti. Cordiali saluti, Karsten Lentzsch

Riferimenti: ulteriori modelli di Fowler – http://martinfowler.com/eaaDev Presentazione vincolante dei dati – http://www.jgoodies.com/articles/ Small dev con processo di sviluppo app – http://www.cincom.com/downloads/pdf/ AppDevGuide.pdf Documentazione del pattern MVP – http://www.object-arts.com/EducationCentre/Patterns/MVP.htm Home del progetto JDNC di Sun – http://jdnc.dev.java.net/ Domande frequenti sull’ADF di Oracle – http: / /www.oracle.com/technology/products/jdev/htdocs/905/adffaq_otn.html Home progetto RCP di spring – http://www.springframework.org/spring-rcp.html home page NetBeans – http: // www. netbeans.org/products/platform/ JGoodies Swing Suite – http://www.jgoodies.com/products/index.html

Se non conosci Karsten e JGoodies, allora credimi, questo ragazzo sa davvero di cosa sta parlando. Raccomando vivamente di leggere attentamente la sua risposta e il materiale che ha pubblicato come riferimento. Più in particolare, assicurati di controllare la sua presentazione Desktop Patterns e Data Binding . Sorprendentemente, preferisco la vecchia versione a quella nuova .

Lasciatemi citare la sua diapositiva su MVC vs MVP:

  • Sì, Swing utilizza internamente una forma estesa di MVC
  • Ma MVC è per i componenti, MVP è per le applicazioni

E poi dal sumrio:

  • Separa il dominio dalla presentazione!
    Questa è una presentazione separata .
  • Separare la vista autonoma, se appropriato
  • Scegli MVP o modello di presentazione

  • Swing rende facile il Presentation Model
  • PM richiede una soluzione vincolante

Ma non posso fare un lavoro migliore di Karsten per spiegare questo, posso al massimo parafrasarlo. Quindi basta leggerlo!

Puoi anche dare un’occhiata alle demo di Desktop Java per l’apprendimento (più precisamente la risposta di Scott Violet).

Ecco un articolo che mette a confronto tre pattern GUI in Java usati per implementare la stessa schermata tre volte:

Implementazione di pattern GUI basati su eventi utilizzando il framework AJAX Java di ZK, Simon Massey, Sachin K Mahajan

Poiché diversi framework e linguaggi presentano lievi variazioni su ciò che le persone sentono MVP, MVC, MVVM e MVVMP ecc. Ecc., L’articolo fa attenzione a fare riferimento ai modelli con i nomi lunghi forniti da Martin Fowler non con i moniker a mano corta che sono facili da argomentare di.

Chiaramente ZK è un ambiente di programmazione desktop o desktop simile a un desktop, ma i pattern sono ugualmente applicabili a Swing oa un’altra struttura fat-client. Tuttavia, senza un buon framework di definizione dei dati per un determinato ambiente desktop, non è molto fattibile tentare MVVM. Quindi in questa presentazione iniziale il modello “Modello di presentazione” è dato il moniker “MVB” per Model-View-Binder come alternativa al chiamarlo “MVVM”:

Design Patterns in ZK: Java MVVM come Model-View-Binder, Simon Massey

Puoi dare un’occhiata a questo articolo: Hello ZK MVVM . ZK supporta sia MVP che MVVM e questo articolo potrebbe fornire alcuni spunti per la tua scelta: il modello di programmazione è simile a Swing, si ritiene che sia un framework Web.

Ti consigliamo inoltre di utilizzare Google per trovare ulteriori informazioni poiché la tua domanda è davvero vaga. Comunque, dal momento che si desidera eseguire l’applicazione desktop in Java e probabilmente si utilizzerà Swing, voglio solo sottolineare che Swing è stato progettato pensando a un pattern MVC. In ogni caso è ansible modificarlo facilmente su un MVP utilizzando alcune interfacce aggiuntive.

Se non sei sicuro del pattern, ti consiglio di utilizzare MVC. Troverai molti più esempi.

I miei 2 centesimi.