SlideShare a Scribd company logo
1 of 38
Presentation Patterns
        In ZK
     Simon Massey
   (Revised Q2 2012)
Introduction

First version of this presentation was given to the
  2010 UK ZK Users Group
The "ZK ToDo 2" patterns sample code is in the
 zkforge project svn repository github.com
Sample code has the same screen implimented
 three times; as MVP, MVC and MVVM (MVB)
Published articles document the MVP and MVC
 versions. Article coming soon about MVVM...
See references at the end
Overview

Why Patterns?
Patterns recap of View and Model
Model, View, Who? The third part
Best practices for each layer
Why Patterns? Evolving Software
A business sponsor talks about the screens but
 requires a flexible business solution
Screens are likely to change all the way through
 to go-live and well beyond
Features evolve slowly over time whilst the
 screens can change drastically
Can you easily reskin / re-layout / rearrange your
 app to freshen your user experience?
Making flexible and adaptable solutions is more
 rewarding than making brittle apps
Why Patterns? A Challenge!




Reuse a "buy now" feature of your website in an
 iphone app (as XML over HTTP)
This requires separation of View from Model
Programming In The View
                                        Business state stored in
                                                 view

<label id=”hiddenBookId” value=”${book.id}” visible=”false”/>
<button label=”Buy Book”>
                  View knows 'who' and
    <attribute name=”onClick”><![CDATA[
                         'how'
    MyDao myDao = … ; // get daoand render mixed
                         Update via jndi
    myDao.buyBook(user.id, hiddenBookId.value);
    statusLabel.value = ”Thanks! Buy another book?”;
    ]]></attribute>
</button>
<label id=”statusLabel” value=””/>
Avoid Coding In The View

"Separated Presentation” is a core pattern
Presentation is incidental to what the customer is
 logically doing which is the Use Case / User
 Story (e.g. "customer buys book")
The presentation changes fast and often so
 separate it out from the business logic
Junit testing of the presentation is tricky
Business logic within the View stunts the
 flexibility of your software design
The Triumvirate


        View




Model           who?
Micro vs. Macro

Much of the literature about MVC describes the
 fine grained "micro-MVC" used to implement
 graphical components such as Swing/JSF
When reading articles it helps to think "Is this
 micro-MVC or macro-MVC?"
This century we tend to pick a winning UI
 component framework (ZK!) and focus on
 "macro-MVC" for complex business screens
This presentation talks about the macro world
 unless explicitly stated
The View


          View




Model              who?
View Best Practices

"ZK Desktop == View" so mixing Java business
  logic into ZK code is mixing business logic into
  the View
View components should not become business
  components:
  BuyNowButton extends Button // avoid!
The View should observe the Model using the
 databinder (more on this later):
  org.zkoss.zkplus.databind.AnnotateDataBinder
View Has Micro Models
A BindingModel is an "push through" to update
 the View. Writing to it updates the bound View
These micro models are not business domain
 models which organise application features
ListModelList is binding model class for Listbox
  listModelList = (ListModelList)listbox.getModel();
AnnotateDataBinder uses such micro-models as
 part of its logic to sync data into the View
Intbox and Datebox have "value" property as
  micro-Model as well as "visible" and "disabled"
ZK Micro-Model == View

Listbox                       Composer



      ListModelList
              (view layer)




 Collection<Book> books
          (business domain layer)
The Business Domain (Macro) Model


              View




     Model            who?
Model Best Practices
The Business Domain Model should have no
 compile time dependencies to the presentation
 framework
EL and AnnotateDataBinder should load data
 from the Model into the View (avoid coding)
Ideally the Model should be a rich Domain Model
  have both behaviour as well as state
Beware designs of proceedural code loading and
 saving DTOs as this is weak OO
Try test driven development of encapsulated
  layers ("POJOs In Action" book)
The Other Bit...


        View




Model            who?
Alphabet Soup

MVC: Model-View-Controller
  Often cited but do we really know it as well as we
   believe?
MVP: Model-View-Presenter
  A specialism of MVC with a dominant controller
MVVM: Model-View-ViewModel
  The Microsoft WPF pattern of the Application Model
   but how do we use it with ZK?
MVB: Model-View-Binder
  A clearer moniker for "MVVM" with ZK
MVC Has Many Interpretations
Martin Fowler:
  Different people reading about MVC in different
   places take different ideas from it and describe
   these as 'MVC'.
Anon on c2.com:
  Stuff nearest the User becomes the View, stuff
    nearest the database becomes the Model, stuff in
    between becomes the Controller. Marketects then
    refer to their project's architecture as "MVC",
    borrowing that acronym's impressive lineage(!!!)
Controller Of What?


        View
   ?              ?



Model     ?    Controller
The Controller Revisited

Typically org.zkoss.zk.ui.util.Composer but what
 are it's responsibilities?
Does Controller read/write the Model? Yes
Does Controller read/write the View? Perhaps
Does View read/write the Model? Possibly
Is separation of behaviour (Controller) from state
  (Model) the only game in town? No
Is databinding with AnnotateDataBinder part
  View, part Controller, or a separate thing?
Model-View-ZKComposer
org.zkoss.zk.ui.util.Composer usually used as the
  3rd part of the pattern
Whether it is a Controller or a Presenter depends
 on the interactions with View and Model:
  Presenter – pushes to Passive View
  Controller – updates a model observed by the View
   ("Supervising Controller")
Any mix or match of the above will be called
 MVC. People say "traditional MVC" to mean
 View observes the Model updated by Controller
Model-View-Presenter
                       Legend

                    compiles to
        View
                       events




Model          Presenter
Model-View-Presenter

The View is the fully owned by the Presenter
ZkToDoControllerV1 implements Composer
Pushes all updates into the Passive View
ZkToDoControllerV1 implements ListitemRender

Presenter reacts to View Event notifications and
 updates the Model
ZkToDo2 app example zktodo2_a.zul
For code write-up google "Massey Small Talks/2008/
 November/ZK "
Model-View-Controller
                        Legend

                     compiles to
        View
                        bindings

                         events




Model          Controller
Enter The Binder

View observes the state of the Model using
  databinding
<?init class=”org.zkoss.....AnnotateDataBinderInit”?>
Uses EL annotations within the ZUL page
   <textbox value=”@{person.firstname}”/>
The @{pojo.property} annotations automatically
 reads/write your POJOs (no UI event handling
 code required as ZK Binder does the work
 automatically!)
Google "site:dzone.com mvc zk massey"
Controller Best Practices
Aim to have the Controller and View not
  communicate with one another. Let the binder
  to the work
Have the binder pull the data from the Model with
 load hints rather than having the composer
 push data into the view model
  <textbox value=”@{person.firstname,
   load-after='buyButton.onClick'}”/>
zktodo2_b.zul example should have used
 more 'load-after' hints and less Java code (see
 weather-station-mvvm.zul)
Model-View-ViewModel

ViewModel (Microsoft) is similar to an
  ApplicationModel (Smalltalk)
Binder syncs application state into the View
Binder maps View Events onto application
  methods (ICommand types in .Net C#)
Gather both state and behaviour into one
 application model (stronger OO design)
Binder is part of the View world. The application
  model is its model: so called it a "ViewModel"
ViewModel Nirvāna

Josh Smith (msdn.microsoft.com):
"ViewModel classes are easy to unit test … Views and
  unit tests are just two different types of ViewModel
  consumers"
"ViewModel classes can assist in properly designing
  user interfaces that are easy to skin"
"It is easy to just rip one view out and drop in a new view
   to render a ViewModel"
It's all about the Binder. The name Model-View-
   Binder (MVB) highlights the key part
Model-View-Binder (Simplified)
                             Legend
             View            compiles to

                              updates

            Binder             loads


           <<reflection>>



      Application Model
     (has internal layers)
Model-View-Binder

      View
     Binder

    <<reflection>>
                      Legend
   ViewModel         compiles to

                     command

  DomainModel           load
Model-View-ZKBind

Components are bound to ViewModel by the
 Binder:
 <listcell label="@load(reminder.name)"/>

UI Events are dispatched to ViewModel methods
 by the Binder:
      <button label="Save" onClick="@command('save')"/
 >

ViewModel has annotations to inform Binder of
  any properties changed under the covers
     @NotifyChange({"reminders","selectedReminder"})
     public void save() { … }
MVB/MVVM Best Practices

View Model has no references to View Objects
  only @Command and @NotifyChange annotations
Create ViewModel classes which are "naked
 screens" onto which you overlay a zul skin
ViewModel is the Mediator of the Binder to the
  Model; it orchestrates the services
Use Dependency Injection of service interfaces
 into the View Mode
ViewModel uses application services to get
  detached entites which it exposes to the Binder
Summary

Presentation patterns are all about modelling the
 features of our application independently of the
 frequently changing screens
MVC, MVP, MVVM all have in common a
 separated view
Modelling of the Model will lead to internal layers
Labels such as "ViewModel" or "DataModel" or
 "ApplicationModel" are suggestions as to what
 is trying to be organised where
Summary (Cont 1)

"B" is for Binder which plays a big part in MVC
  and major part of MVVM patterns. There is no
  "B" required for MVP
The Microsoft Binder is powerful and a core part
 of their framework. They invented MVVM as the
 best practice to organise a screen Model to
 leverage their Binder
MVB is a moniker that names the new power in
 modern Separated View patterns: long live the
 Binder!
Summary (Cont 2)

ZK has a mature AnnotateDataBinder for rendering
 POJO data values and state (visible/disabled) into ZK
 AJAX RIA Desktop Components
The binding information is embedded into the Page
  (View) as "XML annotations"
Add ZKToDo2 CommandBinder to fire application
 methods on the ViewModel
ViewModel has no compile time dependencies on ZK
  framework; can heavily junit with mock services
Using MVVM / MVB pattern is simply about getting the
 most out of the framework Binder
Summary (Cont 3)

ZkToDo patterns demo code implements the
 same screen in each of MVP (zktodo_a.zul),
 MVC (zktodo_b.zul) and MVVM (zktodo_e.zul)
References

MVC article Desktop MVC Patterns ZK, Spring & JPA
Original MVP article
 SmallTalks 2008 Best MVC Patterns
Book on how to build a layered domain model with
 Spring POJOs In Action
ZK MVC Screen for POJOs In Action book code
 Test Driving ZK FoodToGo
Book on designing ”domain objects first” for supple code
 Evans Domain Driven Design
Martin Fowler GUI Patterns pages UI Architectures
Josh Smith's inspirational Microsoft .Net MVVM Article
Corrections

March 2012: Slide 13 had totally miss attributed Fowler where I
 was using the term "Presentation Model" to mean something
 totally different. Edited to call my concept "BindingModel"
March 212: Slide 21 had miss labelled Passive View as
 Supervising Controller

More Related Content

What's hot

Security Bootcamp 2013 penetration testing (basic)
Security Bootcamp 2013   penetration testing (basic)Security Bootcamp 2013   penetration testing (basic)
Security Bootcamp 2013 penetration testing (basic)
Security Bootcamp
 
Bao cao tttn an ninh web
Bao cao tttn   an ninh webBao cao tttn   an ninh web
Bao cao tttn an ninh web
Nhóc Mèo
 

What's hot (20)

Blockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreBlockchain 2nd ethereum_core
Blockchain 2nd ethereum_core
 
Is Rust Programming ready for embedded development?
Is Rust Programming ready for embedded development?Is Rust Programming ready for embedded development?
Is Rust Programming ready for embedded development?
 
Qt Qml
Qt QmlQt Qml
Qt Qml
 
Lập trình android
Lập trình androidLập trình android
Lập trình android
 
MonkeyTalk Documentation
MonkeyTalk DocumentationMonkeyTalk Documentation
MonkeyTalk Documentation
 
Presentation on IOT SECURITY
Presentation on IOT SECURITYPresentation on IOT SECURITY
Presentation on IOT SECURITY
 
Python
PythonPython
Python
 
Explore Android Internals
Explore Android InternalsExplore Android Internals
Explore Android Internals
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해
 
Object Oriented Programming with C#
Object Oriented Programming with C#Object Oriented Programming with C#
Object Oriented Programming with C#
 
Alarms
AlarmsAlarms
Alarms
 
Luận văn: Lập trình game trên thiết bị di động, HAY
Luận văn: Lập trình game trên thiết bị di động, HAYLuận văn: Lập trình game trên thiết bị di động, HAY
Luận văn: Lập trình game trên thiết bị di động, HAY
 
Top 1000 Java Interview Questions Includes Spring, Hibernate, Microservices, ...
Top 1000 Java Interview Questions Includes Spring, Hibernate, Microservices, ...Top 1000 Java Interview Questions Includes Spring, Hibernate, Microservices, ...
Top 1000 Java Interview Questions Includes Spring, Hibernate, Microservices, ...
 
Android MVVM architecture using Kotlin, Dagger2, LiveData, MediatorLiveData
Android MVVM architecture using Kotlin, Dagger2, LiveData, MediatorLiveDataAndroid MVVM architecture using Kotlin, Dagger2, LiveData, MediatorLiveData
Android MVVM architecture using Kotlin, Dagger2, LiveData, MediatorLiveData
 
Phân tích mã độc cơ bản - báo cáo thực tập
Phân tích mã độc cơ bản - báo cáo thực tậpPhân tích mã độc cơ bản - báo cáo thực tập
Phân tích mã độc cơ bản - báo cáo thực tập
 
Security Bootcamp 2013 penetration testing (basic)
Security Bootcamp 2013   penetration testing (basic)Security Bootcamp 2013   penetration testing (basic)
Security Bootcamp 2013 penetration testing (basic)
 
Bao cao tttn an ninh web
Bao cao tttn   an ninh webBao cao tttn   an ninh web
Bao cao tttn an ninh web
 
Bài giảng an toàn ứng dụng web và csdl PTIT
Bài giảng an toàn ứng dụng web và csdl PTITBài giảng an toàn ứng dụng web và csdl PTIT
Bài giảng an toàn ứng dụng web và csdl PTIT
 
An Introduction to CMake
An Introduction to CMakeAn Introduction to CMake
An Introduction to CMake
 
Introduction to Rust
Introduction to RustIntroduction to Rust
Introduction to Rust
 

Viewers also liked

ZK MVVM, Spring & JPA On Two PaaS Clouds
ZK MVVM, Spring & JPA On Two PaaS CloudsZK MVVM, Spring & JPA On Two PaaS Clouds
ZK MVVM, Spring & JPA On Two PaaS Clouds
Simon Massey
 

Viewers also liked (12)

Tema 2 implementar el demo zk
Tema 2   implementar el demo zkTema 2   implementar el demo zk
Tema 2 implementar el demo zk
 
當ZK遇見Front-End
當ZK遇見Front-End當ZK遇見Front-End
當ZK遇見Front-End
 
ZK MVVM, Spring & JPA On Two PaaS Clouds
ZK MVVM, Spring & JPA On Two PaaS CloudsZK MVVM, Spring & JPA On Two PaaS Clouds
ZK MVVM, Spring & JPA On Two PaaS Clouds
 
Tema 1 mi primera aplicacion zk con netbeans y rem
Tema 1   mi primera aplicacion zk con netbeans y remTema 1   mi primera aplicacion zk con netbeans y rem
Tema 1 mi primera aplicacion zk con netbeans y rem
 
MVVM de A à Z
MVVM de A à ZMVVM de A à Z
MVVM de A à Z
 
Giới thiệu zk framework
Giới thiệu  zk frameworkGiới thiệu  zk framework
Giới thiệu zk framework
 
ZK framework
ZK frameworkZK framework
ZK framework
 
Huong dan dung index_oracle
Huong dan dung index_oracleHuong dan dung index_oracle
Huong dan dung index_oracle
 
안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트
 
Non-Verbal Communication in Organizations- ZK
Non-Verbal Communication in Organizations- ZKNon-Verbal Communication in Organizations- ZK
Non-Verbal Communication in Organizations- ZK
 
Multi-tenancy in Java
Multi-tenancy in JavaMulti-tenancy in Java
Multi-tenancy in Java
 
Evaluación de ZK
Evaluación de ZKEvaluación de ZK
Evaluación de ZK
 

Similar to Design Patterns in ZK: Java MVVM as Model-View-Binder

Stephen Kennedy Silverlight 3 Deep Dive
Stephen Kennedy Silverlight 3 Deep DiveStephen Kennedy Silverlight 3 Deep Dive
Stephen Kennedy Silverlight 3 Deep Dive
MicrosoftFeed
 

Similar to Design Patterns in ZK: Java MVVM as Model-View-Binder (20)

MVVM Design Pattern NDC2009
MVVM Design Pattern NDC2009MVVM Design Pattern NDC2009
MVVM Design Pattern NDC2009
 
Stephen Kennedy Silverlight 3 Deep Dive
Stephen Kennedy Silverlight 3 Deep DiveStephen Kennedy Silverlight 3 Deep Dive
Stephen Kennedy Silverlight 3 Deep Dive
 
SUE AGILE MVVM (English)
SUE AGILE MVVM (English)SUE AGILE MVVM (English)
SUE AGILE MVVM (English)
 
MVC & backbone.js
MVC & backbone.jsMVC & backbone.js
MVC & backbone.js
 
Fundaments of Knockout js
Fundaments of Knockout jsFundaments of Knockout js
Fundaments of Knockout js
 
MV* presentation frameworks in Javascript: en garde, pret, allez!
MV* presentation frameworks in Javascript: en garde, pret, allez!MV* presentation frameworks in Javascript: en garde, pret, allez!
MV* presentation frameworks in Javascript: en garde, pret, allez!
 
Code Camp 06 Model View Presenter Architecture
Code Camp 06   Model View Presenter ArchitectureCode Camp 06   Model View Presenter Architecture
Code Camp 06 Model View Presenter Architecture
 
MVC(Model View Controller),Web,Enterprise,Mobile
MVC(Model View Controller),Web,Enterprise,MobileMVC(Model View Controller),Web,Enterprise,Mobile
MVC(Model View Controller),Web,Enterprise,Mobile
 
MVC in PHP
MVC in PHPMVC in PHP
MVC in PHP
 
jquery summit presentation for large scale javascript applications
jquery summit  presentation for large scale javascript applicationsjquery summit  presentation for large scale javascript applications
jquery summit presentation for large scale javascript applications
 
Introduction to Knockout Js
Introduction to Knockout JsIntroduction to Knockout Js
Introduction to Knockout Js
 
MVVM ( Model View ViewModel )
MVVM ( Model View ViewModel )MVVM ( Model View ViewModel )
MVVM ( Model View ViewModel )
 
IntroductionToMVC
IntroductionToMVCIntroductionToMVC
IntroductionToMVC
 
Building Web Application Using Spring Framework
Building Web Application Using Spring FrameworkBuilding Web Application Using Spring Framework
Building Web Application Using Spring Framework
 
Software architectural design patterns(MVC, MVP, MVVM, VIPER) for iOS
Software architectural design patterns(MVC, MVP, MVVM, VIPER) for iOSSoftware architectural design patterns(MVC, MVP, MVVM, VIPER) for iOS
Software architectural design patterns(MVC, MVP, MVVM, VIPER) for iOS
 
Ppt of Basic MVC Structure
Ppt of Basic MVC StructurePpt of Basic MVC Structure
Ppt of Basic MVC Structure
 
MVVM Lights
MVVM LightsMVVM Lights
MVVM Lights
 
Model View Madness
Model View MadnessModel View Madness
Model View Madness
 
MVVM - KnockoutJS
MVVM - KnockoutJSMVVM - KnockoutJS
MVVM - KnockoutJS
 
MVVM presentation
MVVM presentationMVVM presentation
MVVM presentation
 

Recently uploaded

Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
panagenda
 
Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider  Progress from Awareness to Implementation.pptxTales from a Passkey Provider  Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
FIDO Alliance
 

Recently uploaded (20)

Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Design Guidelines for Passkeys 2024.pptx
Design Guidelines for Passkeys 2024.pptxDesign Guidelines for Passkeys 2024.pptx
Design Guidelines for Passkeys 2024.pptx
 
Observability Concepts EVERY Developer Should Know (DevOpsDays Seattle)
Observability Concepts EVERY Developer Should Know (DevOpsDays Seattle)Observability Concepts EVERY Developer Should Know (DevOpsDays Seattle)
Observability Concepts EVERY Developer Should Know (DevOpsDays Seattle)
 
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
 
AI mind or machine power point presentation
AI mind or machine power point presentationAI mind or machine power point presentation
AI mind or machine power point presentation
 
Microsoft CSP Briefing Pre-Engagement - Questionnaire
Microsoft CSP Briefing Pre-Engagement - QuestionnaireMicrosoft CSP Briefing Pre-Engagement - Questionnaire
Microsoft CSP Briefing Pre-Engagement - Questionnaire
 
ADP Passwordless Journey Case Study.pptx
ADP Passwordless Journey Case Study.pptxADP Passwordless Journey Case Study.pptx
ADP Passwordless Journey Case Study.pptx
 
Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...
Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...
Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...
 
Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider  Progress from Awareness to Implementation.pptxTales from a Passkey Provider  Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
 
Frisco Automating Purchase Orders with MuleSoft IDP- May 10th, 2024.pptx.pdf
Frisco Automating Purchase Orders with MuleSoft IDP- May 10th, 2024.pptx.pdfFrisco Automating Purchase Orders with MuleSoft IDP- May 10th, 2024.pptx.pdf
Frisco Automating Purchase Orders with MuleSoft IDP- May 10th, 2024.pptx.pdf
 
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Continuing Bonds Through AI: A Hermeneutic Reflection on Thanabots
Continuing Bonds Through AI: A Hermeneutic Reflection on ThanabotsContinuing Bonds Through AI: A Hermeneutic Reflection on Thanabots
Continuing Bonds Through AI: A Hermeneutic Reflection on Thanabots
 
JavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate GuideJavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate Guide
 
Intro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptxIntro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptx
 
How to Check CNIC Information Online with Pakdata cf
How to Check CNIC Information Online with Pakdata cfHow to Check CNIC Information Online with Pakdata cf
How to Check CNIC Information Online with Pakdata cf
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by Anitaraj
 
Introduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDMIntroduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDM
 

Design Patterns in ZK: Java MVVM as Model-View-Binder

  • 1. Presentation Patterns In ZK Simon Massey (Revised Q2 2012)
  • 2. Introduction First version of this presentation was given to the 2010 UK ZK Users Group The "ZK ToDo 2" patterns sample code is in the zkforge project svn repository github.com Sample code has the same screen implimented three times; as MVP, MVC and MVVM (MVB) Published articles document the MVP and MVC versions. Article coming soon about MVVM... See references at the end
  • 3. Overview Why Patterns? Patterns recap of View and Model Model, View, Who? The third part Best practices for each layer
  • 4. Why Patterns? Evolving Software A business sponsor talks about the screens but requires a flexible business solution Screens are likely to change all the way through to go-live and well beyond Features evolve slowly over time whilst the screens can change drastically Can you easily reskin / re-layout / rearrange your app to freshen your user experience? Making flexible and adaptable solutions is more rewarding than making brittle apps
  • 5. Why Patterns? A Challenge! Reuse a "buy now" feature of your website in an iphone app (as XML over HTTP) This requires separation of View from Model
  • 6. Programming In The View Business state stored in view <label id=”hiddenBookId” value=”${book.id}” visible=”false”/> <button label=”Buy Book”> View knows 'who' and <attribute name=”onClick”><![CDATA[ 'how' MyDao myDao = … ; // get daoand render mixed Update via jndi myDao.buyBook(user.id, hiddenBookId.value); statusLabel.value = ”Thanks! Buy another book?”; ]]></attribute> </button> <label id=”statusLabel” value=””/>
  • 7. Avoid Coding In The View "Separated Presentation” is a core pattern Presentation is incidental to what the customer is logically doing which is the Use Case / User Story (e.g. "customer buys book") The presentation changes fast and often so separate it out from the business logic Junit testing of the presentation is tricky Business logic within the View stunts the flexibility of your software design
  • 8. The Triumvirate View Model who?
  • 9. Micro vs. Macro Much of the literature about MVC describes the fine grained "micro-MVC" used to implement graphical components such as Swing/JSF When reading articles it helps to think "Is this micro-MVC or macro-MVC?" This century we tend to pick a winning UI component framework (ZK!) and focus on "macro-MVC" for complex business screens This presentation talks about the macro world unless explicitly stated
  • 10. The View View Model who?
  • 11. View Best Practices "ZK Desktop == View" so mixing Java business logic into ZK code is mixing business logic into the View View components should not become business components: BuyNowButton extends Button // avoid! The View should observe the Model using the databinder (more on this later): org.zkoss.zkplus.databind.AnnotateDataBinder
  • 12. View Has Micro Models A BindingModel is an "push through" to update the View. Writing to it updates the bound View These micro models are not business domain models which organise application features ListModelList is binding model class for Listbox listModelList = (ListModelList)listbox.getModel(); AnnotateDataBinder uses such micro-models as part of its logic to sync data into the View Intbox and Datebox have "value" property as micro-Model as well as "visible" and "disabled"
  • 13. ZK Micro-Model == View Listbox Composer ListModelList (view layer) Collection<Book> books (business domain layer)
  • 14. The Business Domain (Macro) Model View Model who?
  • 15. Model Best Practices The Business Domain Model should have no compile time dependencies to the presentation framework EL and AnnotateDataBinder should load data from the Model into the View (avoid coding) Ideally the Model should be a rich Domain Model have both behaviour as well as state Beware designs of proceedural code loading and saving DTOs as this is weak OO Try test driven development of encapsulated layers ("POJOs In Action" book)
  • 16. The Other Bit... View Model who?
  • 17. Alphabet Soup MVC: Model-View-Controller Often cited but do we really know it as well as we believe? MVP: Model-View-Presenter A specialism of MVC with a dominant controller MVVM: Model-View-ViewModel The Microsoft WPF pattern of the Application Model but how do we use it with ZK? MVB: Model-View-Binder A clearer moniker for "MVVM" with ZK
  • 18. MVC Has Many Interpretations Martin Fowler: Different people reading about MVC in different places take different ideas from it and describe these as 'MVC'. Anon on c2.com: Stuff nearest the User becomes the View, stuff nearest the database becomes the Model, stuff in between becomes the Controller. Marketects then refer to their project's architecture as "MVC", borrowing that acronym's impressive lineage(!!!)
  • 19. Controller Of What? View ? ? Model ? Controller
  • 20. The Controller Revisited Typically org.zkoss.zk.ui.util.Composer but what are it's responsibilities? Does Controller read/write the Model? Yes Does Controller read/write the View? Perhaps Does View read/write the Model? Possibly Is separation of behaviour (Controller) from state (Model) the only game in town? No Is databinding with AnnotateDataBinder part View, part Controller, or a separate thing?
  • 21. Model-View-ZKComposer org.zkoss.zk.ui.util.Composer usually used as the 3rd part of the pattern Whether it is a Controller or a Presenter depends on the interactions with View and Model: Presenter – pushes to Passive View Controller – updates a model observed by the View ("Supervising Controller") Any mix or match of the above will be called MVC. People say "traditional MVC" to mean View observes the Model updated by Controller
  • 22. Model-View-Presenter Legend compiles to View events Model Presenter
  • 23. Model-View-Presenter The View is the fully owned by the Presenter ZkToDoControllerV1 implements Composer Pushes all updates into the Passive View ZkToDoControllerV1 implements ListitemRender Presenter reacts to View Event notifications and updates the Model ZkToDo2 app example zktodo2_a.zul For code write-up google "Massey Small Talks/2008/ November/ZK "
  • 24. Model-View-Controller Legend compiles to View bindings events Model Controller
  • 25. Enter The Binder View observes the state of the Model using databinding <?init class=”org.zkoss.....AnnotateDataBinderInit”?> Uses EL annotations within the ZUL page <textbox value=”@{person.firstname}”/> The @{pojo.property} annotations automatically reads/write your POJOs (no UI event handling code required as ZK Binder does the work automatically!) Google "site:dzone.com mvc zk massey"
  • 26. Controller Best Practices Aim to have the Controller and View not communicate with one another. Let the binder to the work Have the binder pull the data from the Model with load hints rather than having the composer push data into the view model <textbox value=”@{person.firstname, load-after='buyButton.onClick'}”/> zktodo2_b.zul example should have used more 'load-after' hints and less Java code (see weather-station-mvvm.zul)
  • 27. Model-View-ViewModel ViewModel (Microsoft) is similar to an ApplicationModel (Smalltalk) Binder syncs application state into the View Binder maps View Events onto application methods (ICommand types in .Net C#) Gather both state and behaviour into one application model (stronger OO design) Binder is part of the View world. The application model is its model: so called it a "ViewModel"
  • 28. ViewModel Nirvāna Josh Smith (msdn.microsoft.com): "ViewModel classes are easy to unit test … Views and unit tests are just two different types of ViewModel consumers" "ViewModel classes can assist in properly designing user interfaces that are easy to skin" "It is easy to just rip one view out and drop in a new view to render a ViewModel" It's all about the Binder. The name Model-View- Binder (MVB) highlights the key part
  • 29. Model-View-Binder (Simplified) Legend View compiles to updates Binder loads <<reflection>> Application Model (has internal layers)
  • 30. Model-View-Binder View Binder <<reflection>> Legend ViewModel compiles to command DomainModel load
  • 31. Model-View-ZKBind Components are bound to ViewModel by the Binder: <listcell label="@load(reminder.name)"/> UI Events are dispatched to ViewModel methods by the Binder: <button label="Save" onClick="@command('save')"/ > ViewModel has annotations to inform Binder of any properties changed under the covers @NotifyChange({"reminders","selectedReminder"}) public void save() { … }
  • 32. MVB/MVVM Best Practices View Model has no references to View Objects only @Command and @NotifyChange annotations Create ViewModel classes which are "naked screens" onto which you overlay a zul skin ViewModel is the Mediator of the Binder to the Model; it orchestrates the services Use Dependency Injection of service interfaces into the View Mode ViewModel uses application services to get detached entites which it exposes to the Binder
  • 33. Summary Presentation patterns are all about modelling the features of our application independently of the frequently changing screens MVC, MVP, MVVM all have in common a separated view Modelling of the Model will lead to internal layers Labels such as "ViewModel" or "DataModel" or "ApplicationModel" are suggestions as to what is trying to be organised where
  • 34. Summary (Cont 1) "B" is for Binder which plays a big part in MVC and major part of MVVM patterns. There is no "B" required for MVP The Microsoft Binder is powerful and a core part of their framework. They invented MVVM as the best practice to organise a screen Model to leverage their Binder MVB is a moniker that names the new power in modern Separated View patterns: long live the Binder!
  • 35. Summary (Cont 2) ZK has a mature AnnotateDataBinder for rendering POJO data values and state (visible/disabled) into ZK AJAX RIA Desktop Components The binding information is embedded into the Page (View) as "XML annotations" Add ZKToDo2 CommandBinder to fire application methods on the ViewModel ViewModel has no compile time dependencies on ZK framework; can heavily junit with mock services Using MVVM / MVB pattern is simply about getting the most out of the framework Binder
  • 36. Summary (Cont 3) ZkToDo patterns demo code implements the same screen in each of MVP (zktodo_a.zul), MVC (zktodo_b.zul) and MVVM (zktodo_e.zul)
  • 37. References MVC article Desktop MVC Patterns ZK, Spring & JPA Original MVP article SmallTalks 2008 Best MVC Patterns Book on how to build a layered domain model with Spring POJOs In Action ZK MVC Screen for POJOs In Action book code Test Driving ZK FoodToGo Book on designing ”domain objects first” for supple code Evans Domain Driven Design Martin Fowler GUI Patterns pages UI Architectures Josh Smith's inspirational Microsoft .Net MVVM Article
  • 38. Corrections March 2012: Slide 13 had totally miss attributed Fowler where I was using the term "Presentation Model" to mean something totally different. Edited to call my concept "BindingModel" March 212: Slide 21 had miss labelled Passive View as Supervising Controller