Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Классические архитектуры во фронтенде

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →

Классические архитектуры во фронтенде

Responsive web design, HTML5, CSS3, IDE, API, React, Angular, веб-компоненты, БЭМ... Опытным фронтендерам эти слова давно знакомы. А как насчет таких классических архитектур как MVC, MVP или MVVM? Знаете ли вы, что такое MVP, и почему Angular.js построен на паттерне MVVM, а не MVC, хотя в этом фреймворке активно используется понятие "контроллер"? Чем эти три архитектуры отличаются друг от друга, и зачем, вообще, о них нужно знать фронтендеру?

В своем докладе я хочу рассмотреть эти три понятия как с теоретической (история, концепция, назначение), так и с практической точки зрения. На простых примерах я покажу, как можно организовать ту или иную архитектуру во фронтендовой части веб-приложения, а также рассмотрю некоторые архитектурные паттерны, которые позволяют увеличить читабельность и добавить модульность и переносимость кода.

Avatar for Aleksandra Shinkevich

Aleksandra Shinkevich

June 01, 2016

Other Decks in Programming

Transcript

  1. 12

  2. MVC: HTML <!-- ... --> <body> <script src=" js/utils.js "></script>

    <script src=" js/models.js "></script> <script src=" js/views.js "></script> <script src=" js/controllers.js "></script> <script src=" js/app.js "></script> </body> </html> 01. 02. 03. 04. 05. 06. 07. 08. 09. 28
  3. MVC: HTML <!-- ... --> <body> <script src=" js/utils.js "></script>

    <script src=" js/models.js "></script> <script src=" js/views.js "></script> <script src=" js/controllers.js "></script> <script src=" js/app.js "></script> </body> </html> 01. 02. 03. 04. 05. 06. 07. 08. 09. 29
  4. MVC: HTML <!-- ... --> <body> <script src=" js/utils.js "></script>

    <script src=" js/models.js "></script> <script src=" js/views.js "></script> <script src=" js/controllers.js "></script> <script src=" js/app.js "></script> </body> </html> 01. 02. 03. 04. 05. 06. 07. 08. 09. 31
  5. MVC: controllers.js function ListController() { var model = new TasksModel()

    ; var view = new ListView( model ); } 01. 02. 03. view.addCreateTaskHandler(function(taskTitle) { ... }); 04. view.addCheckedHandler(function(id) { ... }); 05. 06. 32
  6. MVC: controllers.js function ListController() { view. addCreateTaskHandler (function(taskTitle) { ...

    }); view. addCheckedHandler (function(id) { ... }); } 01. var model = new TasksModel(); 02. var view = new ListView(model); 03. 04. 05. 06. 33
  7. MVC: HTML <!-- ... --> <body> <script src=" js/utils.js "></script>

    <script src=" js/models.js "></script> <script src=" js/views.js "></script> <script src=" js/controllers.js "></script> <script src=" js/app.js "></script> </body> </html> 01. 02. 03. 04. 05. 06. 07. 08. 09. 34
  8. MVC: views.js function ListView(model) { var html = $( ...

    ); } 01. 02. customEvents.registerEvent('UpdateList'); 03. customEvents.addEventListener('UpdateList', function() { ... }); 04. return { 05. addCreateTaskHandler: function(handler) { ... }, 06. addCheckedHandler: function(handler) { ... } 07. }; 08. 09. 35
  9. MVC: views.js function ListView(model) { customEvents. registerEvent ('UpdateList'); customEvents. addEventListener

    ('UpdateList', function() { ... }); } 01. var html = $( ... ); 02. 03. 04. return { 05. addCreateTaskHandler: function(handler) { ... }, 06. addCheckedHandler: function(handler) { ... } 07. }; 08. 09. 36
  10. MVC: views.js function ListView(model) { return { addCreateTaskHandler : function(handler)

    { ... }, addCheckedHandler : function(handler) { ... } }; } 01. var html = $( ... ); 02. customEvents.registerEvent('UpdateList'); 03. customEvents.addEventListener('UpdateList', function() { ... }); 04. 05. 06. 07. 08. 09. 37
  11. MVC: HTML <!-- ... --> <body> <script src=" js/utils.js "></script>

    <script src=" js/models.js "></script> <script src=" js/views.js "></script> <script src=" js/controllers.js "></script> <script src=" js/app.js "></script> </body> </html> 01. 02. 03. 04. 05. 06. 07. 08. 09. 38
  12. MVC: models.js function TasksModel() { return { data : {},

    getAll : function() { ... }, addItem : function(name) { ... }, deleteItem : function(id) { ... }, }; }; 01. 02. 03. 04. 05. 06. 07. 08. 39
  13. MVC: Приложение Awesome MVC task list Don't forget! Add a

    new task: What do you need to do? I need to do Add 41
  14. MVP: HTML <!-- ... --> <body> <script src=" js/utils.js "></script>

    <script src=" js/models.js "></script> <script src=" js/views.js "></script> <script src=" js/presenters.js "></script> <script src=" js/app.js "></script> </body> </html> 01. 02. 03. 04. 05. 06. 07. 08. 09. 54
  15. MVP: HTML <!-- ... --> <body> <script src=" js/utils.js "></script>

    <script src=" js/models.js "></script> <script src=" js/views.js "></script> <script src=" js/presenters.js "></script> <script src=" js/app.js "></script> </body> </html> 01. 02. 03. 04. 05. 06. 07. 08. 09. 55
  16. MVP: HTML <!-- ... --> <body> <script src=" js/utils.js "></script>

    <script src=" js/models.js "></script> <script src=" js/views.js "></script> <script src=" js/presenters.js "></script> <script src=" js/app.js "></script> </body> </html> 01. 02. 03. 04. 05. 06. 07. 08. 09. 57
  17. MVP: presenters.js function ListPresenter() { var view = new ListView(

    model.getAll() ); customEvents. registerEvent ('UpdateList'); customEvents. addEventListener ('UpdateList', function() { ... }); } 01. var model = new TasksModel(); 02. 03. view.addCreateTaskHandler(function(taskTitle) { ... }); 04. view.addCheckedHandler(function(id) { ... }); 05. 06. 07. 08. 58
  18. MVP: HTML <!-- ... --> <body> <script src=" js/utils.js "></script>

    <script src=" js/models.js "></script> <script src=" js/views.js "></script> <script src=" js/presenters.js "></script> <script src=" js/app.js "></script> </body> </html> 01. 02. 03. 04. 05. 06. 07. 08. 09. 59
  19. MVP: views.js function ListView(data) { return { updateView : function(data)

    { ... } }; } 01. var html = $( ... ); 02. 03. addCreateTaskHandler: function(handler) { ... }, 04. addCheckedHandler: function(handler) { ... }, 05. 06. 07. 08. 60
  20. MVP: Приложение Awesome MVP task list Don't forget! Add a

    new task: What do you need to do? I need to do Add 61
  21. Связывание данных Это такой механизм, при котором изменение значения модели

    с любой стороны (View или Model) моментально вступает в силу на другой. 64
  22. MVVM: HTML <body> <!-- Разметка html --> <script src=" js/knockout-3.4.0.min.js

    "></script> <script src=" js/viewmodel.js "></script> </body> </html> 01. 02. 03. 04. 05. 06. 68
  23. MVVM: HTML <form data-bind=" submit: addItem " > <ul data-bind="

    foreach: items " > <li> <label data-bind=" click: $parent.removeItem " > <input type="checkbox"> <span data-bind=" text: $data " ></span> </label> </li> <!-- ... --> 01. 02. 03. 04. 05. 06. 07. 08. 09. 69
  24. MVVM: HTML <body> <!-- Разметка html --> <script src=" js/knockout-3.4.0.min.js

    "></script> <script src=" js/viewmodel.js "></script> </body> </html> 01. 02. 03. 04. 05. 06. 70
  25. MVVM: viewmodel.js var ListViewModel = function(items) { return { items

    : ko.observableArray(items), itemToAdd : ko.observable(""), }; }; 01. 02. 03. 04. addItem: function() { ... }, 05. removeItem: function() { ... }, 06. 07. 08. ko.applyBindings(new ListViewModel([])); 09. 71
  26. MVVM: viewmodel.js var ListViewModel = function(items) { return { addItem

    : function() { ... }, removeItem : function() { ... }, }; }; 01. 02. items: ko.observableArray(items), 03. itemToAdd: ko.observable(""), 04. 05. 06. 07. 08. ko.applyBindings(new ListViewModel([])); 09. 72
  27. MVVM: viewmodel.js ko.applyBindings(new ListViewModel([])); var ListViewModel = function(items) { 01.

    return { 02. items: ko.observableArray(items), 03. itemToAdd: ko.observable(""), 04. addItem: function() { ... }, 05. removeItem: function() { ... }, 06. }; 07. }; 08. 09. 73
  28. MVVM: Приложение Awesome MVVM task list Don't forget! Add a

    new task: What do you need to do? I need to do Add 74
  29. Что выбрать — Есть/можно использовать связывание данных: MVVM — Нет/нельзя

    использовать связывание данных: MVP — Нужна связь представления и данных: MVС 75
  30. Хочу больше — Wiki: архитектура ПО, MVC, MVP, MVVM, шаблоны

    проектирования — [Хабр] Паттерны для новичков: MVC vs MVP vs MVVM — [Хабр] И опять про MVC — Addy Osmani: Understanding MVC And MVP [en] — Learning JavaScript Design Patterns by Addy Osmani (ebook) [en] — MVC в JavaScript — Knockout. — TodoMVC 76