s unny from models to interactive web apps
play

S UNNY : From Models to Interactive Web Apps for (almost) free - PowerPoint PPT Presentation

S UNNY : From Models to Interactive Web Apps for (almost) free Aleksandar Milicevic Milos Gligoric Daniel Jackson Darko Marinov {aleks,dnj}@csail.mit.edu {gliga,marinov}@illinois.edu Onward! 2013 Indianapolis, IN 1 A simple web app: S


  1. S UNNY : From Models to Interactive Web Apps for (almost) free Aleksandar Milicevic Milos Gligoric Daniel Jackson Darko Marinov {aleks,dnj}@csail.mit.edu {gliga,marinov}@illinois.edu Onward! 2013 Indianapolis, IN 1

  2. A simple web app: S UNNY IRC custom-tailored internet chat relay app 2

  3. A simple web app: S UNNY IRC custom-tailored internet chat relay app 2

  4. A simple web app: S UNNY IRC custom-tailored internet chat relay app 2

  5. Conceptually simple, but in practice... 3

  6. Conceptually simple, but in practice... distributed system → concurrency issues → keeping everyone updated 3

  7. Conceptually simple, but in practice... distributed system → concurrency issues → keeping everyone updated heterogeneous environment → rails + javascript + ajax + jquery + ... → html + erb + css + sass + scss + bootstrap + ... → db + schema + server config + routes + ... 3

  8. Conceptually simple, but in practice... distributed system → concurrency issues → keeping everyone updated heterogeneous environment → rails + javascript + ajax + jquery + ... → html + erb + css + sass + scss + bootstrap + ... → db + schema + server config + routes + ... abstraction gap → high-level problem domain → low-level implementation level 3

  9. Conceptually simple, but in practice... distributed system → concurrency issues → keeping everyone updated heterogeneous environment → rails + javascript + ajax + jquery + ... → html + erb + css + sass + scss + bootstrap + ... → db + schema + server config + routes + ... abstraction gap → high-level problem domain → low-level implementation level 3

  10. MDD: how far can it get us? exercise : sketch out a model (design, spec) for the Sunny IRC application 4

  11. Sunny IRC: data model record User < WebUser do record Msg do record ChatRoom do # inherited fields refs text: Text, refs name: String, members: ( set User) # name: String, sender: User # email: String, end owns messages: ( set Msg) pswd_hash: String, end # end record-like data structures with typed fields automatically persisted 5

  12. Sunny IRC: machine model machine Client < WebClient do machine Server < WebServer do # inherited fields # inherited fields auth_token: String online_clients: (set WebClient) # # refs user: User owns rooms: ( set ChatRoom) end end generic network architecture machines are records too ( � ⇒ persisted, have fields) assumes certain (standard) properties of web severs and clients 6

  13. Sunny IRC: event model event JoinRoom do from client: Client to serv: Server params room: ChatRoom requires { ! room . members . include?(client . user) } ensures { room . members << client . user } success_note { "#{client . user . name} joined ’#{room . name}’ room" } end core functionality of the system 7

  14. Sunny IRC: event model event JoinRoom do from client: Client to serv: Server params room: ChatRoom requires { ! room . members . include?(client . user) } ensures { room . members << client . user } success_note { "#{client . user . name} joined ’#{room . name}’ room" } end core functionality of the system other IRC events: CreateRoom , SendMsg included library events: CRUD operations, user Auth events 7

  15. Modeling done. What next? challenge how to make the most of this model? 8

  16. Modeling done. What next? challenge how to make the most of this model? goal make the model executable as much as possible! 8

  17. Traditional MVC Approach 9

  18. Traditional MVC Approach boilerplate: → write a matching DB schema → turn each record into a resource (model class) → turn each event into a controller and implement the CRUD operations → configure URL routes for each resource 9

  19. Traditional MVC Approach boilerplate: → write a matching DB schema → turn each record into a resource (model class) → turn each event into a controller and implement the CRUD operations → configure URL routes for each resource aesthetics: → design and implement a nice looking GUI 9

  20. Traditional MVC Approach boilerplate: → write a matching DB schema → turn each record into a resource (model class) → turn each event into a controller and implement the CRUD operations → configure URL routes for each resource aesthetics: → design and implement a nice looking GUI to make it interactive: → decide how to implement server push → keep track of who’s viewing what → monitor resource accesses → push changes to clients when resources are modified → implement client-side Javascript to accept pushed changes and dynamically update the DOM 9

  21. Traditional MVC Approach in S UNNY : boilerplate: → write a matching DB schema → turn each record into a resource (model class) → turn each event into a controller and implement the CRUD operations → configure URL routes for each resource aesthetics: → design and implement a nice looking GUI to make it interactive: → decide how to implement server push → keep track of who’s viewing what → monitor resource accesses → push changes to clients when resources are modified → implement client-side Javascript to accept pushed changes and dynamically update the DOM 9

  22. GUIs in S UNNY : dynamic templates like standard templating engine (ERB) with data bindings automatically re-rendered when the model changes 10

  23. GUIs in S UNNY : dynamic templates like standard templating engine (ERB) with data bindings automatically re-rendered when the model changes online_users.html.erb <div class="list-group"> <% server . online_clients . user . each do | user | %> <%= img_tag_for user %> <div class="... <%= (user == client . user) ? ’me’ : ’’ %> "> <h4 class="..."> <%= user . name %> </h4> </div> <% end %> </div> 10

  24. GUIs in S UNNY : dynamic templates like standard templating engine (ERB) with data bindings automatically re-rendered when the model changes online_users.html.erb <div class="list-group"> <% server . online_clients . user . each do | user | %> <%= img_tag_for user %> <div class="... <%= (user == client . user) ? ’me’ : ’’ %> "> <h4 class="..."> <%= user . name %> </h4> </div> <% end %> </div> 10

  25. GUIs in S UNNY : binding to events 11

  26. GUIs in S UNNY : binding to events room_members.html.erb <% unless chat_room . members . member?(client . user) %> <button class="..." type="button" data-trigger-event="JoinRoom" data-param-room="${new ChatRoom( <%= chat_room . id %> )}">...</button> <% end %> 11

  27. GUIs in S UNNY : binding to events room_members.html.erb <% unless chat_room . members . member?(client . user) %> <button class="..." type="button" data-trigger-event="JoinRoom" data-param-room="${new ChatRoom( <%= chat_room . id %> )}">...</button> <% end %> html5 data attributes specify event type and parameters dynamically discovered and triggered asynchronously no need to handle the Ajax response → the data-binding mechanism will automatically kick in if the event makes any changes 11

  28. GUIs in S UNNY : binding to events room_members.html.erb <% unless chat_room . members . member?(client . user) %> <button class="..." type="button" data-trigger-event="JoinRoom" data-param-room="${new ChatRoom( <%= chat_room . id %> )}">...</button> <% end %> html5 data attributes specify event type and parameters dynamically discovered and triggered asynchronously no need to handle the Ajax response → the data-binding mechanism will automatically kick in if the event makes any changes demo responsive GUI without messing with javascript 11

  29. Adding New Features: adding a field implement user status messages 12

  30. Adding New Features: adding a field implement user status messages all it takes: <%= autosave_fld user, record User < WebUser do refs status: String :status, end :default => "...statusless..." %> 12

  31. Adding New Features: adding a field implement user status messages all it takes: <%= autosave_fld user, record User < WebUser do refs status: String :status, end :default => "...statusless..." %> demo 12

  32. Adding New Features: adding a ’write’ policy forbid changing other people’s data by default, all fields are public policies used to specify access restrictions 13

  33. Adding New Features: adding a ’write’ policy forbid changing other people’s data by default, all fields are public policies used to specify access restrictions policy EditUserData do principal client: Client @desc = "Can’t edit other people’s data" write User . * . when do | user | client . user == user end end 13

  34. Adding New Features: adding a ’write’ policy forbid changing other people’s data by default, all fields are public policies used to specify access restrictions policy EditUserData do principal client: Client @desc = "Can’t edit other people’s data" write User . * . when do | user | client . user == user end end declarative and independent from the rest of the system automatically checked by the system at each field access 13

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend