Модель-вид-контролер

Діаграма взаємодії між компонентами шаблону MVC

Моде́ль–вигляд–контро́лер (MVC, Модель–представлення–контролер, англ. Model-view-controller) — архітектурний шаблон, який використовується під час проєктування та розробки програмного забезпечення.

Цей шаблон передбачає поділ системи на три взаємопов'язані частини: модель даних, вигляд (інтерфейс користувача) та модуль керування. Застосовується для відокремлення даних (моделі) від інтерфейсу користувача (вигляду) так, щоб зміни інтерфейсу користувача мінімально впливали на роботу з даними, а зміни в моделі даних могли здійснюватися без змін інтерфейсу користувача.

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

Опис та функції компонентів

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

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

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

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

У функції контролера входить відстеження визначених подій, що виникають в результаті дій користувача. Контролер дозволяє структурувати код шляхом групування пов'язаних дій в окремий клас. Наприклад у типовому MVC-проєкті може бути користувацький контролер, що містить групу методів, пов'язаних з управлінням обліковим записом користувача, таких як реєстрація, авторизація, редагування профілю та зміна пароля.

Зареєстровані події транслюються в різні запити, що спрямовуються компонентам моделі або об'єктам, відповідальним за відображення даних. Відокремлення моделі від вигляду даних дозволяє незалежно використовувати різні компоненти для відображення інформації. Таким чином, якщо користувач через контролер внесе зміни до моделі даних, то інформація, подана одним або декількома візуальними компонентами, буде автоматично відкоригована відповідно до змін, що відбулися.

Реалізації

Концепція MVC вперше застосувалася при проєктуванні мови програмування Smalltalk як модель для інтерфейсу користувача[1][2]. Також в область застосування концепції входить реалізація каркаса документ-вид (Document-View) в рамках бібліотеки MFC[3] для мови Visual C++[4]. У сучасних технологіях концепція MVC представлена схемою JSP Model 1/2 для динамічної обробки Web-змісту на основі Java Server Pages (JSP)[5].

Java

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

ASP.NET

2009 року Microsoft випустив каркас ASP.NET MVC з відкритими кодами.[6]

Objective-c

Model-View-Controller Cocoa Core Competencies (iOS Developer Library) [Архівовано 18 серпня 2016 у Wayback Machine.] iOS MVC pattern [Архівовано 31 жовтня 2012 у Wayback Machine.]

Застосування MVC для мікроконтролерів

У випадку застосування такої моделі при написанні програмного забезпечення для мікроконтролерів, розподіл задач виглядатиме наступним чином:

  1. Контролер відповідає за отримання та опрацювання сигналів від вхідних інтерфейсів. Для прикладу, коли, необхідно розрізнити довге та коротке натиснення кнопки, контролер здійснює цю задачу, будь-якими доступними в мікроконтролері засобами та передає закодований сигнал в компоненту Модель. Для даного прикладу Контролер може передати один з трьох кодових значень: BUTTON_IDLE, BUTTON_SHORT_CLICK, BUTTON_LONG_CLICK.
  2. Компонента Модель у випадку мікроконтролерів по суті реалізує поведінку пристрою в залежності від поточного стану та інформації отриманої з компоненти Контролер.
  3. Компонента Вигляд у випадку мікроконтролерів це типово є пристрій візуалізації інформації чи певний виконавчий пристрій. Прикладами може бути рідкокристалічний дисплей чи кроковий двигун. Для прикладу, якщо мікроконтролер здійснює керування кроковим двигуном, то компонента вигляд повинна отримувати команду з параметрами DIRECTION та STEPS_COUNT. Для прикладу перший параметр задаватиме напрямок обертання осі двигуна, а другий — кількість кроків. Детальна генерація сигналів, яка потрібна для керування двигуном захована всередині компоненти.

Реалізація

Приклад реалізації шаблону в ASP.NET MVC.

Оголосимо модель, що містить логіку аплікації, не залежну від представлення.

public class OrderDto
{
	public string Name { get; set; }
}

public interface IOrdersModel
{
	OrderDto[] LoadOrders();
}

public class OrdersModel : IOrdersModel
{
	public OrderDto[] LoadOrders()
	{
		return new OrderDto[]
		{
			new OrderDto(){ Name = "Item1" },
			new OrderDto(){ Name = "Item2" },
		};
	}
}

Додамо контролер — компонент, що зв'язує логіку аплікації (модель) із виглядом.

public class OrderController : Controller
{
	private readonly IOrdersModel _ordersModel;

	public OrderController()
	{
		_ordersModel = new OrdersModel();
	}

	// метод-обробник, виконується при взаємодії користувача із виглядом
	public IActionResult GetOrders()
	{
		// керування моделю
		var orders = _ordersModel.LoadOrders();

		// вибір вигляду
		return View("OrdersView", orders);
	}
}

Та додамо вигляд для взаємодії із користувачем.

Користувач викликає метод контролера із вигляду.

<a asp-controller="Order" asp-action="GetOrders">Get Orders</a>

Вигляд, що обирає контролер.

@model MVC.Controllers.OrderDto[]

<ul>
    @foreach(var order in Model)
    {
        <li>@order.Name</li>
    }
</ul>

Див. також

Виноски

  1. LaLonde, W.R. and J.R. Pugh, Inside Smalltalk, Volume II, Prentice-Hall, 1991.
  2. Krasner, G.E. and S.T. Pope, A cookbook for using the Model-View-Controller user interface paradigm in Smalltalk-80, Journal of Object-Oriented Programming, 1(3), pp. 26-49, August/September 1988, SIGS Publications, New York, NY, USA, 1988.
  3. MFC Microsoft Foundation Classes — Бібліотека базових класів Microsoft. Бібліотека класів мови C++, призначена для розробки застосунків для Windows
  4. Kruglinski, D., Inside Visual C++, Microsoft Press, 1995.
  5. JSP (Java Server Pages) — Серверні сторінки Java. Технологія створення динамічних Web-сторінок з використанням Java.
  6. Архівована копія. Архів оригіналу за 29 серпня 2009. Процитовано 23 травня 2009.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)