Побудова динамічних вебзастосунків за допомогою MVC

Побудова динамічних вебзастосунків за допомогою MVC

  • 14 листопада, 2023
  • читати 15 хв
Володимир Шайтан
Володимир Шайтан Lead Front-end Developer у One Source, Викладач Комп'ютерної школи Hillel.

Все більше веброзробників розуміють важливість використання структурованих та модульних підходів до розробки Front-end.

Один з таких підходів — це патерн Модель-Вигляд-Контролер (MVC). Ця архітектурна концепція дозволяє розбити ваш застосунок на логічні компоненти та ефективно керувати даними, їх відображенням та логікою користувача.

MVC (Model-View-Controller) — це архітектурний шаблон для розробки програмного забезпечення, який допомагає розділити програму на три основні частини.

Розглянемо, з чого складається схема mvc нижче. 

Модель (Model):

Модель відповідає за обробку даних та бізнес-логіку програми. Вона зберігає інформацію і визначає, як ця інформація обробляється і змінюється.

Вигляд (View)

Вигляд відповідає за відображення даних користувачу. Він представляє інформацію з Моделі у зручному для користувача вигляді.

Контролер (Controller)

Контролер взаємодіє з користувачем і відправляє команди до Моделі та Вигляду. Він контролює потік інформації між Моделлю і Виглядом та реагує на дії користувача.

MVC перетворює складну розробку застосунків на набагато більш керований процес. Він дозволяє декільком розробникам працювати над кожним аспектом програми окремо.
Сьогодні паттерн MVC використовується для сучасних вебзастосунків, оскільки він дозволяє застосунку бути масштабованим, підтримуваним і легко розширюваним.

Чому варто використовувати MVC?

Розділення задач (separation of concerns), або SoC

В архітектурі MVC кожен з компонентів має свою чітко визначену область відповідальності та допомагає розділити код Front-end та Back-end на окремі компоненти.

  • Модель зосереджена на логіці та обробці даних. Вона зберігає інформацію і визначає, як ця інформація має взаємодіяти з програмою.
  • Вигляд відповідає за відображення даних користувачеві. Це включає в себе графічний інтерфейс, веб-сторінки або інші способи представлення інформації користувачу.
  • Контролер взаємодіє з користувачем та визначає, які дії виконувати на основі взаємодії користувача з Виглядом. Він також відповідає за маршрутизацію і обробку запитів.

Модульність

Використання MVC сприяє створенню більш модульного коду, що робить його більш гнучким та легшим для розширення.

Більша читабельність та підтримка

Відділення логіки в Модель і відображення в Вигляд допомагає підтримувати код більш зрозумілим і читабельним.

Повторне використання коду

Через розділення логіки і відображення, ви можете легко використовувати одну Модель з різними Виглядами або навпаки, що сприяє повторному використанню коду.

Тестування

Ви можете легко проводити тестування окремих компонентів, оскільки Модель, Вигляд і Контролер можна тестувати незалежно один від одного.

Підтримка одночасної розробки

Різні розробники можуть працювати над різними компонентами одночасно, не втручаючись в роботу одне одного.

Інтерфейси користувача

MVC особливо корисний для вебзастосунків та мобільних застосунків, оскільки дозволяє легко керувати тим, як дані відображаються перед користувачем.

Як використовувати MVC?

  • Контролер має обробляти вхідні події та дії користувача і спрямовувати їх на відповідні методи Моделі для обробки даних та на Вигляд для оновлення інтерфейсу користувача.
  • Модель має забезпечувати методи для збереження, оновлення, видалення та отримання даних, а також виконання логіки.
  • Вигляд має відслідковувати зміни в Моделі та відображати їх в інтерфейсі користувача. Він також повинен відправляти повідомлення Контролеру про дії користувача.
<script>


        // Модель - список завдань (початкові дані)
        const tasks = [];

        // Вигляд - оновлення списку завдань на сторінці


        function updateView() {


            const taskList = document.getElementById('taskList');
            taskList.innerHTML = '';


            for (let i = 0; i < tasks.length; i++) {


                const taskItem = document.createElement('li');
                taskItem.textContent = tasks[i];
                taskList.appendChild(taskItem);


            }
        }

        // Контролер - додавання нового завдання


        document.getElementById('addTask').addEventListener('click', function() {


            const taskInput = document.getElementById('taskInput');
            const newTask = taskInput.value.trim();


            if (newTask) {


                tasks.push(newTask);
                taskInput.value = '';
                updateView();


            }
        });


        // Початкове оновлення Вигляда
        updateView();


    </script>

Фреймворки MVC

Існує багато фреймворків, які спеціалізуються на реалізації архітектурного шаблону MVC та допомагають спростити розробку вебзастосунків.
Ось деякі з найпопулярніших фреймворків з підтримкою MVC:

  • Ruby on Rails — це фреймворк для розробки вебзастосунків мовою програмування Ruby. Rails має вбудовану підтримку MVC та допомагає розробникам створювати застосунки швидко і ефективно.

  • Django — це фреймворк для розробки вебзастосунків мовою програмування Python. Django також має вбудований шаблон MVC (або, точніше, шаблон Model-View-Template) і надає розробникам потужні засоби для створення вебзастосунків.

Рекомендуємо публікацію по темі

  • Laravel — це фреймворк для розробки вебзастосунків мовою програмування PHP. Він має вбудований підтримку MVC та надає інструменти для реалізації бізнес-логіки та вигляду.

  • Spring MVC — це фреймворк для розробки вебзастосунків мовою програмування Java. Spring MVC допомагає створювати вебзастосунків з використанням патерну Model-View-Controller та надає широкий набір інструментів для роботи з веб-технологіями.

Рекомендуємо публікацію по темі

  • Express.js — це фреймворк для розробки вебзастосунків на JavaScript з використанням платформи Node.js. Він допомагає створювати серверну частину застосунків з використанням шаблону MVC та використовувати JavaScript на обох сторонах — клієнтській і серверній.

  • AngularJS — це фреймворк для створення клієнтської частини вебзастосунків на JavaScript. Він реалізує шаблон MVC на стороні клієнта та надає різноманітні інструменти для розробки веб-інтерфейсів.

  • React — це бібліотека для створення інтерфейсів на JavaScript. Хоча React сам по собі не є фреймворком MVC, його можна використовувати разом з іншими бібліотеками та фреймворками (наприклад, Redux) для реалізації шаблону MVC на стороні клієнта.

Рекомендуємо курс по темі

Ці фреймворки та бібліотеки надають різні можливості та інструменти для розробки вебзастосунків з використанням архітектурного шаблону MVC. Вибір конкретного фреймворку залежить від мови програмування, потреб проєкту та особистих вподобань розробника.

Використання патерну розробки MVC — це не тільки ефективний спосіб розробляти програмні продукти, але й цінний ресурс для навчання інших людей у сфері програмування.

Цей патерн допомагає структурувати код, робить його більш зрозумілим та підходить для спільної роботи, а також сприяє модульності, тестуванню, підтримці та рефакторингу.

Отже, використання MVC покращує розробку програм і полегшує навчання програмуванню, допомагаючи новачкам та професіоналам розуміти та покращувати свої навички розробки.

MVC в React

В React існує варіант реалізації патерну MVC, який називається MV* (де * може бути чимось іншим в залежності від підходу, наприклад, MVVM або Flux).

React, зазвичай, спільно використовується з бібліотеками та пакетами для кращого управління станом та логікою застосунку.

Ось приклад, як можна структурувати React застосунок у вигляді MV*:

Модель (Model)

Model в React може бути представлена даними та логікою, які використовуються в застосунку. Ви можете використовувати стейт (state) та контекст (context) для зберігання та управління даними.

import { useState } from 'react';

function AppModel() {

const [data, setData] = useState(initialData);

function updateData(newData) {

setData(newData);

}

return { data, updateData };

}

Вигляд (View)

View в React відповідає за відображення даних та інтерфейс користувача. Це включає в себе компоненти React, які відображають інформацію на сторінці.

import React from 'react';

function AppView({ data, updateData }) {

  return (
    <div>
      <h1>My React App</h1>
      <p>Data: {data}</p>
      <button onClick={() => updateData('New Data')}>Update Data</button>
    </div>
  );
}

Контролер (Controller)

В React логіка контролера зазвичай розташовується в компонентах.

Наприклад, обробка подій та взаємодія з моделлю може бути реалізована в компонентах, які містять обробники подій та функції для оновлення моделі.

import React from 'react';
import { AppModel } from './AppModel';

function AppController() {
  const model = AppModel();

  function handleUpdateData(newData) {
    model.updateData(newData);
  }

  return <AppView data={model.data} updateData={handleUpdateData} />;
}

Цей приклад демонструє реалізацію простого паттерна MVC в React.

Модель використовує useState для зберігання даних, Вигляд відповідає за відображення цих даних, а Контролер обробляє події та оновлює Модель. Однак в більш складних застосунках може знадобитися використовувати додаткові бібліотеки для кращого управління станом, такі як Redux або Mobx.

MVC в Vue

Vue.js використовує підхід на основі компонентів, який найбільше нагадує паттерн «Модель-Вигляд-Контролер» (Model-View-Controller, MVC), де компоненти Vue є основною одиницею для створення та управління інтерфейсом користувача та логікою застосунку.

Основні концепції Vue.js, які відповідають елементам патерна Модель-Вигляд-Контролер:

Модель (Model)

У Vue.js модель відповідає за дані та логіку застосунку. Дані можуть бути визначені в компоненті як реактивні властивості (зазвичай використовуються ref або reactive), і їми можна маніпулювати за допомогою методів та обробників подій.

<script setup>
import { ref } from 'vue';

const count = ref(0);

function increment() {
  count.value++;
}

function decrement() {
  count.value--;
}
</script>

Вигляд (View)

Представлення в Vue.js включає в себе шаблон компонента, який відображає дані та інтерфейс користувача. За допомогою директив та реактивних властивостей, ви можете легко зв'язати дані з шаблоном та створювати інтерфейси користувача.

<template>
  <div>
    <h1>Vue 3 MVController</h1>
    <p>Count: {{ count }}</p>
    <button @click="increment">Increment</button>
    <button @click="decrement">Decrement</button>
  </div>
</template>

Контролер (Controller)

В Vue.js логіка Контролера вбудована в компоненти. Методи та обробники подій компонента відповідають за обробку дій користувача та маніпуляцію Моделлю. Компоненти, які містять дані та методи, виконують роль Контролера.

<script setup>
import { defineProps } from 'vue';

const { count, increment, decrement } = defineProps(['count', 'increment', 'decrement']);
</script>

<template>
  <div>
    <p>Count: {{ count }}</p>
    <button @click="increment">Increment</button>
    <button @click="decrement">Decrement</button>
  </div>
</template>

У цьому прикладі компонент виконує роль Контролера, відповідаючи за обробку подій користувача та оновлення Моделі. Він отримує дані та методи з батьківського компонента.

Загальною концепцією Vue.js є розділення функціональності на компоненти, які вбирають в себе модель, відображення та Контролер, роблячи розробку і підтримку застосунків більш приємною та простою.

MVC в Angular

У фреймворку Angular теж існує підтримка паттерну Модель-Вигляд-Контролер (MVC), але Angular використовує інший термінологічний підхід для організації коду і архітектури застосунку. Angular використовує концепцію компонентів для створення застосунків. Основні концепції у контексті Angular включають:

Модель (Model)

В Angular Модель представляє собою дані, які використовуються в застосунку. Ці дані можуть бути збережені в змінних чи сервісах. Моделі можуть включати класи даних, інтерфейси, та сервіси, які отримують та оновлюють дані.

Приклад сервісу Angular, який представляє Модель:

import { Injectable } from '@angular/core';

   @Injectable()
   export class MyModelService {
     private data: string = 'Initial Data';

     getData(): string {
       return this.data;
     }

     updateData(newData: string): void {
       this.data = newData;
     }
   }

Вигляд (View)

В Angular View відповідає за відображення даних і інтерфейс користувача. В Angular ви використовуєте шаблони для створення представлення, і ці шаблони можуть бути пов'язані з даними з Моделі за допомогою двонаправленого зв'язку.

import { Component } from '@angular/core';
   import { MyModelService } from './my-model.service';

   @Component({
     selector: 'my-app',
     template: `
       <h1>My Angular App</h1>
       <p>Data: {{ data }}</p>
       <button (click)="updateData('New Data')">Update Data</button>
     `
   })
   export class AppComponent {
     data: string;

     constructor(private modelService: MyModelService) {
       this.data = modelService.getData();
     }

     updateData(newData: string): void {
       this.modelService.updateData(newData);
       this.data = newData;
     }
   }

Контролер (Controller)

В Angular Контролери зазвичай представлені компонентами. Компонент включає в себе логіку обробки подій, маніпулювання моделлю і відображення даних. Angular розширює функціональність компонентів, дозволяючи визначати hooks життєвого циклу та обробники подій.

Компонент у Angular виконує роль Контролера, оскільки він має методи для оновлення моделі та інтерфейсу користувача.

У підсумку, хоча Angular не використовує термінологію «MVC», він пропонує архітектурний підхід, який дозволяє ефективно розділити логіку Моделі, Вигляду та Контролера для створення добре структурованих застосунків.