Проектирование веб-приложений с применением Data Management System (на основе технологии скаффолдинга)



    В предыдущей статье я рассказал о том, почему считаю неэффективной разработку с применением Content Management System. В этой статье, я расскажу о том, какой подход использую в построении веб-приложений.

    Альтернативы CMS


    В комментариях к предыдущей статье были предложения вместо Content Management System применять Content Management Framework. Это действительно позволяет гораздо гибче проектировать архитектуру веб-приложения, но более затратно по ресурсам.
    Я предлагаю альтернативу в виде Data Management System.
    Прежде чем продолжить, следует разделить понятия Content Management System, Content Management Framework и Data Management System.
    В статье под Content Management System я понимаю систему, которая имеет свою заданную структуру базы данных и набор объектов предметной области.
    Под Content Management Framework я понимаю некий набор классов и методов, который помогает автоматизировать работу с данными на уровне программного кода.
    Под Data Management System я понимаю автономное веб-приложение, которое предоставляет возможности по управлению данными. При этом

    Особенность подхода при разработке с применением системы управления данными


    При разработке с использованием системы управления данными идет архитектурное разделение проекта на несколько независимых частей: база данных, frontend и backend.
    • Frontend – часть веб приложения которая в большинстве случаев включает в себя большое количество экранов с разнообразным дизайном и пользовательским интерфейсом)
    • Backend – часть проекта которая в данном случае не требует отдельной разработки и как раз и является системой управления данными.
    • База данных – выделена отдельно, поскольку в отличие от подхода с использованием CMS содержит чистую структуру, отражающую предметную область. Таким образом, нет необходимости хранить в базе инородные таблицы, как это обычно бывает при использовании WordPress, Joomla и других CMS.


    Следует также заметить, что нам нет необходимости для каждого проекта создавать пользовательский интерфейс, а так же реализовать CRUD-логику (create retrieve update delete — Создание чтение обновление удаление), поскольку этот функционал обеспечивается самой системой управления данными.

    Ключевым функционалом, на котором основывается работа Data Management System, является скаффолдинг. Скаффолдинг – это технология поддерживаемая некоторыми MVC фреймворками, которая позволяет используя дополнительное описание (например атрибуты классов) схемы данных строить приложение которое поддерживает CRUD -функционал взаимодействия с базой данных. Одним из проектов, который активно применяет эту технологию является Ruby on Rails. Так же к системам, применяющим скаффолдинг следует отнести ASP.NET Dynamic Data (.NET) и Django (Python).
    Итак, в общем случае система управления данными базируется на:
    • Scaffolding System Core – система скаффолдинга, которая позволяет динамически строить пользовательский интерфейс на основе классов предметной области.
    • Data UI Controls – наборе контролов пользовательского интерфейса, которые используются системой скаффолдинга;
    • Data Description Specification – набор правил по которым классы предметной области дополняются атрибутами, помогающими системе скаффолдинга более точно строить пользовательский интерфейс.




    Построение веб-приложения с применением DMS


    Процесс проектирования с применением DMS можно описать следующим образом:
    1. Проектирование базы данных
    2. Создание классов предметной области с применением ORM (Hibernate, EntityFramework, другая система объектно-реляционного отображения).
    3. Дополнение классов предметной области атрибутами (Например текстовое поле в базе данных может быть отображено в пользовательском интерфейсе как: обычное текстовое поле, многострочное текстовое поле, WYSIWYG-редактор).
    4. Разработка Frontend части (собственно веб приложение)
    5. Разработка Backend, которая сводится к конфигурации и при необходимости кастомизации Data Management System (в большинстве случаев для реализации CRUD модели доработка не требуется).

    Ниже представлена схема взаимодействия различных компонентов проекта.



    Ограничения при применении Data Management System


    В случае применения системы управления данными есть и свои ограничения
    • Нет возможности разделения прав доступа к конкретным записям таблицы. Однако при необходимости эту проблему можно обойти двумя способами:
      • Первый – добавление необходимой логики в механизм выборки данных;
      • Второй – создание кастомизированной формы для работы с данными, которые требуют сложно проверки прав.

    • Необходимость добавления атрибутов к классам предметной области для более корректного построения пользовательского интерфейса.


    Преимущества применения DMS


    При использовании системы управления данными мы получаем следующие преимущества:
    • полное разделения Frontend и Backend частей проекта;
    • создание и поддержка «чистой» структуры базы данных;
    • быстрое получение CRUD функционала управления данными.


    Практическое применение


    В своей практике я использую систему управления данными построенную на основе таких компонент как:
    • ASP.NET Dynamic Data;
    • Расширенного набора контролов пользовательского интерфейса;
    • Спецификации атрибутов применяемых при описании классов предметной области;
    • Набора атрибутов, базовых классов и интерфейсов для расширения классов предметной области.

    В большинстве случаев, при создании веб приложения мне нет необходимости в кастомизации системы управления данными. Например, мне достаточно поменять путь к библиотеке содержащей набор классов предметной области – и я могу управлять совершено другим приложением.

    Выводы


    Таким образом, технология скаффолдинга в связке с расширенными библиотеками элементов управения и гибкой спецификацией описания атрибутов а классов предметной области позволяет строить гораздо более гибкие и мощные веб-приложения, без ограничений накладываемых распространенными Content Management System.

    Ссылки


    Эти ссылки будут полезны скорее начинающим разработчикам, чем тем кто уже имеет опыт в построении веб-приложений:

    Что такое скаффолдинг (англ.)
    Django
    ASP.NET Dynamic Data
    ASP. NET Dynamic Data — пример использования
    Поделиться публикацией
    Комментарии 15
      0
      А конкретный пример? Чем это отличается от рельс со скаффолдингом, к примеру?
        0
        Я сознательно не уходил в конкретную технологию, поскольку целью было описать подход, а не какой-то конкретный фреймворк.

        Ruby on Rails в статье кстати тоже упомянут, и может быть использован в качестве основы для построения системы управления данными при исползовании соответствующего языка программирования.

        Скаффодинг в принципе тут рассматривается как ключевое понятие.
          0
          Мне кажется, вы ему придаете слишком большое значения. Для большинства приложений сложнее блога скаффолдинга недостаточно, да и в блоге… нужно как минимум поменять view, подредактировать контролеры на предмет всяких notices, возможно изменить или дописать роуты. Скаффолдинг — экономия времени в некоторых случаях, и не более того.
            0
            Естественно, серебряной пули которая решала бы все проблему — не существует.
            И я этого вовсе не утверждал в статье. Здесь описан подход к архитектуре в целом, где скаффолдинг позволяет решать именно те задачи для которых предназначен.
            Свои проекты я строю именно с применением такого подхода, и он очень сильно экономит время и ресурсы.
            Возможно кому-то он так же поможет работать более эффективно.
        0
        Как боретесь с миграциями в базах?
        Особенно значимых когда перекраивается много сущностей? Ведь в таком случае просто перегенерировать скаффы будет не достаточно, может очень много боков повылазить, при условии что важно не потерять существующие данные
          0
          В случае кардинального изменения структуры базы данных (в моей практике такое было в двух проектах где я использовал подобный подход) мне было необходимо только сгенерировать новую модель классов для ORM (в моем случае EntityFramework) и по новой прописать некоторые атрибуты (для своих проектов я написал специальную утилиту, которая добавляет большинство атрибутов автоматически и мне необходимо после только просмотреть код и вручную сделать небольшие изменения).

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

          При этом конечно не все формы были результатом генерации, были также специфические формы, которые писались отдельно.
            0
            А с данными в базе?
              0
              Задачи модификации базы данных и манипуляции с данными решались при помощи редактора Management Studio, временных таблиц и SQL запросов.
                0
                Ну то есть автоматически — никак.

                Собственно это и есть проблема с миграциями.
                  0
                  Все зависит оттого насколько сильно меняется база данных и от того были ли изначально заложены механизмы миграции.
          0
          Вообще же, я хочу заметить, что описанное вами — тот еще велосипед. Этот велосипед есть и в asp.net (та самая dynamic data), и для asp.net mvc реализуется без каких-либо проблем на основе editor/display templates, и только ленивый их сам для себя не писал.

          Потому что ужасно же вкусная идея: поскольку операции с данными, типа, всегда одинаковые, давайте сделаем «универсальный механизм». Проблема в том, что в реальности данные оказываются удивительным образом разные, и вокруг механизма сначала наворачиваются костыли «описаний», а потом, когда их оказывается недостаточно, добавляют возможность использования нормального языка программирования, сводя все это к IPS.

          Been there, seen that: две таких системы сам написал, третью год назад унаследовал.

          Проблемы у всех одни и те же: как только система становится достаточно настраиваемой, чтобы удовлетворить любому пожеланию заказчика, она превращается в урезанное и глючное подобие той платформы, на которой написана.
            0
            В том то и дело, что система не должна быть универсальной. Как я уже писал, такой подход необходим для реализации только базовых CRUD операций. Всяк специфическая логика должна писаться отдельно и под конкретную задачу.
              0
              А «базовые CRUD-операции» давно реализованы в любом приличном фреймворке и гордого названия «data management system» не заслуживают.
            0
            Аналогичное решение для php:

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое