Рубрики
Без рубрики

Проектирование моделей в JavaScript

Новый подход для проектирования моделей в JavaScript. Теги с дизайном, моделью, JavaScript, UML.

Моя Гранд-Мать была Бродесей , французское имя для вышивания. Она сделала красивую традиционная одежда для моей семьи, которую мы сохраняем вообще. Недавно при уборке ее домой мы нашли сокровище, узоры, которые она использовала для создания ее одежды. Она использовала, чтобы нарисовать свои узоры на больших крупных бумагах. Мы могли ясно понять такую одежду, которую она хотела сделать, глядя на узоры.

Я мог бы остановить себя, делая аналогию с нашей работой. Мы избегаем слишком много раз этот фундаментальный шаг дизайна при разработке Отказ Мы начинаем кодировать перед разработкой модели нашего приложения только потому, что мы думаем, что код является моделью. И это не так. Код – это просто ткань, из которого сделано приложение Отказ Читая код, мы только можем угадать, какую модель использовалось модели для создания приложения. Более того, потому что мы являемся человеком, потому что наш образ мышления отличаются от одного разработчика другому разработчику, нам также нужно понять организацию ментальной космической комиссии, что разработчик имел, когда она/он кодировал. И это не так просто.

Разделение опасений

Вот почему независимо от использования, которые вы используете, и код, который вы пишете, наиболее важным является модель, которую вы определяете, чтобы создать ваше приложение. И это Модель не должна быть в коде . Это должно быть Где-то еще, нормализован в читабельном формате человека Отказ Но какой формат? Мы могли бы использовать UML Теперь он довольно распространен, и есть много дизайнерских инструментов, которые его используют. Но проблема в том, что это не формат, это язык. Это довольно сложно, а не так дружелюбный, когда вам нужно понять диаграмму. Я знаю, что диаграммы UML могут быть сохранены в XMI формат Но это для машины не человека.

Создать схему модели

Давайте найдем формат, который нам нужен в примере. Позвольте сказать, что мы хотим создать модель Джедай Отказ А Джедай определяется его Имя и его Фамилия она/у него есть Мать и а Отец и может иметь детей. Допустим, мы Поместите всю эту информацию, связанную с этой моделью в файл JSON мы могли бы иметь что-то подобное:

{
  "_name": "Jedi",
  "firstName": "property",
  "lastName": "property",
  "mother": "link",
  "father": "link",
  "children": "collection"
}

При чтении этого JSON мы легко понимаем, что:

  • Джедай имеет два свойства , Имя и фамилия С
  • Джедай – связано к Мать и а Отец а также
  • У джедаев есть Коллекция дети Отказ

Этот JSON на самом деле Схема нашей модели.

Генерировать модель и продлить Это

Было бы здорово быть в состоянии определить такую модель, верно? Теперь у нас есть эта схема, пойдем дальше. А также Что делать, если бы мы могли Создание диаграмм класса UML из модели Чтобы получить что-то подобное:

Для этого нам не хватает базовой информации, как тип свойств. Как это сделать с нашим файлом? Просто Создание полной модели с значениями по умолчанию из схемы, а затем редактировать его :

{
  "_name": "Jedi",
  "firstName": {
    "type": "any",
    "readOnly": false,
    "mandatory": false,
    "default": ""
  },
  "lastName": {
    "type": "any",
    "readOnly": false,
    "mandatory": false,
    "default": ""
  },
  "mother": {
    "type": "Component",
    "readOnly": false,
    "mandatory": false,
    "default": ""
  },
  "father": {
    "type": "Component",
    "readOnly": false,
    "mandatory": false,
    "default": ""
  },
  "children": {
    "type": ["Component"],
    "readOnly": false,
    "mandatory": false,
    "default": []
  }
}

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

Из этого JSON будет легко генерировать диаграмму класса UML. У нас есть полный модель создать приложение.

Используйте модель во время выполнения

Теперь, как насчет кода? В Модель приводной архитектурный подход Мы генерируем код из модели, как правило, из диаграмм UML. Это отлично, но не идеально, потому что модель, которую мы определили, имеет более высокий риск, чтобы быть десинхронизированным из кода. Так как его избежать этого? Просто Используя определение модели приложения во время выполнения Отказ Приложение должно прочитать схему и модель, которую мы определили для создания классов, методов и компонентов модели Отказ

Да, кажется довольно крутым, но как мне сделать, чтобы реализовать методы, если он генерируется во время выполнения? Сделать это вам нужно Думайте в системах Отказ Метод – это просто действие, которое система делает при реагировании на событие Отказ

В нашем случае, скажем, нам нужно иметь в Джедай метод, чтобы получить ее/его полное имя. Итак, мы редактируем Схема иметь что-то подобное:

{
  "_name": "Jedi",
  "firstName": "property",
  "lastName": "property",
  "mother": "link",
  "father": "link",
  "children": "collection",
  "fullName": "method"
}

Мы добавили FullName метод в схема . Итак, у нас будет в сгенерированной модели:

{
  "_name": "Jedi",
  "firstName": {
    "type": "any",
    "readOnly": false,
    "mandatory": false,
    "default": ""
  },
  "lastName": {
    "type": "any",
    "readOnly": false,
    "mandatory": false,
    "default": ""
  },
  "mother": {
    "type": "Component",
    "readOnly": false,
    "mandatory": false,
    "default": ""
  },
  "father": {
    "type": "Component",
    "readOnly": false,
    "mandatory": false,
    "default": ""
  },
  "children": {
    "type": ["Component"],
    "readOnly": false,
    "mandatory": false,
    "default": []
  },
  "fullName": {
    "params": [
      {
        "name": "param",
        "type": "any",
        "mandatory": false,
        "default": null
      }
    ],
    "result": "any"
  }
}

По умолчанию FullName принимает один дополнительный параметр и может вернуть значение любой тип. Теперь скажем, мы хотим реализовать метод. Как это сделать? Просто Добавление поведения, когда событие FullName отправляет :

// require the Jedi class
const Jedi = runtime.require('Jedi');
// add a behavior
Jedi.on('fullName', () => this.firstName() + ' ' + this.lastName());

И когда это событие отправлено? Когда FullName Метод вызывается в коде. На самом деле этот метод был сгенерирован из модели, и когда мы его вызовели, он просто отправляет синхронный FullName мероприятие. Существующее поведение, связанное с этим событием, будет выполнено.

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

Заключение

Вот разные шаги для выполнения при разработке модели:

  • Определите вашу модель на высоком уровне в читабельном формате человека Отказ
  • Модель будет создана из этой схемы.
  • Отредактируйте сгенерированную модель Чтобы указать типы, значения по умолчанию, … вашей модели.
  • Используйте эту модель для создания на классах выполнения, методам и компонентам вашей модели Отказ
  • Архитектура Ваше приложение с приводом от событий подход к добавлению поведения на методы Отказ
  • Используйте свою модель для генерации диаграмм класса UML Отказ

Если вы хотите увидеть конкретное использование такого подхода, вы можете взглянуть на два моих проекта:

Это использует глубоко этой методологии. Для этой цели я создал MSON формат (Для Metamodel JavaScript Object Olight Notiator ) Для определения моделей в читаемом формате человека. Но это не единственное возможное внедрение этой методологии, найдите тот, который соответствует вашим потребностям.

Кредиты: изображение покрытия Кристиан Каинл .

Оригинал: “https://dev.to/ecarriou/designing-models-in-javascript-53je”