Базовые сущности. Model, Record

Types/entity:Record

Запись — обертка над данными, которые можно представить в виде строки таблицы (упорядоченный набор именованных полей и их значений).

Термины

  • формат полей — описание последовательности, названия, типа и прочих характеристик набора полей записи.

Возможности

  • использование сырых данных в разных форматах;
  • чтение/запись значения поля по имени;
  • проверка существования поля;
  • последовательный перебор полей;
  • манипуляции с форматом полей;
  • сериализация/десериализация;
  • поддержка шаблона проектирования "Издатель-подписчик".

Важно

По умолчанию используется адаптер для данных в формате JSON. Если вы используете данные в каком-либо другом формате (СБИС-JSON, XML), то нужно подключить соответствующий адаптер.

Примеры

Создадим запись с сырыми данными в формате JSON:

import {Record} from 'Types/entity';

const employee = new Record({
    rawData: {
        id: 1,
        firstName: 'John',
        lastName: 'Smith'
    }
});

// 1
const id = employee.get('id');

// John
const firstName = employee.get('firstName');

Создадим запись с сырыми данными в формате СБИС-JSON:

import {Record, adapter} from 'Types/entity';

const serverResponse = {
    _type: 'record',
    d: [1, 'John', 'Smith'],
    s: [
        {n: 'id', t: 'Число целое'},
        {n: 'firstName', t: 'Строка'},
        {n: 'lastName', t: 'Строка'}
    ]
};

const employee = new Record({
    rawData: serverResponse,
    adapter: new adapter.Sbis()
});

// 1
const id = employee.get('id');

// John
const firstName = employee.get('firstName');

Types/entity:Model

Модели обеспечивают доступ к данным и поведению объектов предметной области (сущностям). Такими сущностями могут быть, например, товары, пользователи, документы — и другие предметы окружающего мира, которые вы моделируете в своем приложении.

Возможности

Абстрактная модель обладает всеми возможностями Record.

Дополнительные возможности:

  • определение собственных свойств сущности (пример: поле "Фамилия и инициалы" сущности "Пользователь" рассчитывается по полям "Фамилия", "Имя", "Отчество");
  • наличие уникального идентификатора сущности среди ей подобных.

Поведенческие аспекты каждой сущности реализуются ее прикладным модулем путем наследования от абстрактной/промежуточной модели.

Прикладные модели могут внедряться в порождающие их объекты, такие как источники данных или рекордсеты. Это позволяет использовать свои модели в контролах.

Примеры

Определим модель пользователя:

// My/application/model/User.ts
import {Model} from 'Types/entity';
import {Salt} from 'My/application/cryptography';

export default class User extends Model {
    _$format: [
        {name: 'login', type: 'string'},
        {name: 'salt', type: 'string'}
    ],
    _$idProperty: 'login',
    authenticate(password) {
        return Salt.encode(`${this.get('login')}:${password}`) === this.get('salt');
    }
}

Создадим модель пользователя и вызовем ее метод:

// My/application/controller/auth.ts
import User from 'My/application/model/User';

const user = new User();
user.set({
    login: 'i.c.wiener',
    salt: 'grhS2Nys345fsSW3mL9'
});
const authOk = user.authenticate('Its pizza time!');

Диаграмма классов

См. также