В разработке веб-приложений распространены архитектурные паттерны, направленные на разделение логики приложения, представления и данных. Среди наиболее популярных выделяются MVC (Model-View-Controller) и MVVM (Model-View-ViewModel). Эти подходы обеспечивают поддерживаемость, тестируемость и масштабируемость кода.
Model-View-Controller делит приложение на три компонента:
.marko файлы, которые
поддерживают декларативное создание UI-компонентов. Представление
привязано к модели через входные параметры и события, обеспечивая
реактивное обновление интерфейса.Пример интеграции MVC в Marko:
// user.model.js
class UserModel {
constructor() {
this.users = [];
}
addUser(user) {
this.users.push(user);
}
getUsers() {
return this.users;
}
}
module.exports = UserModel;
<!-- user-list.marko -->
<ul>
$for(user of input.users) {
<li>${user.name}</li>
}
</ul>
// user.controller.js
const UserModel = require('./user.model');
const template = require('./user-list.marko');
const userModel = new UserModel();
userModel.addUser({ name: 'Иван' });
userModel.addUser({ name: 'Мария' });
template.render({ users: userModel.getUsers() }, out);
В этом примере модель управляет данными, контроллер наполняет данные и передаёт их в представление, которое отображает список пользователей.
Model-View-ViewModel ориентирован на двустороннюю привязку данных и реактивность:
input и реагируют на изменения
состояния.Marko поддерживает реактивность и двустороннюю привязку через директивы и события:
<!-- counter.marko -->
<let count = 0/>
<div>
<p>Счётчик: ${count}</p>
<button on-click("increment")>Увеличить</button>
</div>
<script>
function increment(event) {
count++;
this.rerender();
}
</script>
В этом примере ViewModel представлен функцией
increment, которая изменяет состояние count и
инициирует перерисовку шаблона. Представление автоматически обновляет
отображаемое значение.
input и реактивных свойств упрощает
тестирование компонентов и их повторное использование.Использование MVC и MVVM в Marko позволяет строить масштабируемые приложения, где чётко разделены данные, логика и представление. Реактивные возможности Marko делают MVVM особенно удобным для динамических интерфейсов, тогда как MVC сохраняет актуальность для традиционного серверного рендеринга и управления данными.
Эти подходы обеспечивают гибкость и чистоту кода, позволяя создавать сложные веб-приложения с понятной архитектурой и высокой поддерживаемостью.