[МиС-2024] Глава 1. Работа над ошибками

Мышление письмом по заданию на моделирование из первой главы.

Переделывала объекты и отношения три или четыре раза. В принципе с этой идеей смиряешься, как тесты - red, green, refactoring. Пишем как-то, потом пытаемся это заставить работать, потом наводим порядочек. Сложно по ментальным объектам понять, что это работает. Кажется, что вот же мы с коллегами этими словами разговариваем, вроде понятно. Ключевое слово “вроде”. И там дальше целая цепочка: вроде понятно, вроде описано, вроде работает. Задумалась о том, что стоит хотя бы пытаться думать о том, а что мы такое пытаемся сделать в реальности этими ментальными объектами. Сразу возникают уточняющие вопросы.

Хорошо начинать строить онтологию от индивидуальных объектов.

Это то, как я запомнила. Смысл в том, чтобы вместо категорий объектов, брать максимально конкретные экземпляры объектов. Я склонна оперировать именно категориями, потому что программирую для всех объектов из категории. Понятно, что в конкретный момент алгоритм считает конкретные объекты. Но в целом, у нас таблички в БД это пачка объектов, мы её и описываем, как пачку. Во множественном числе сама таблица называется “events”, а внутри атрибуты/колонки/свойства (name, date, created_at, deleted_at, event_type). Конкретное значение это строка таблицы. Но при построении онтологии оказалось удобно начинать с конкретного объекта. Т.е. как раз с примера этой строки из таблицы. Когда так простраиваешь объекты и связи, вдруг оказывается, что понятная цепочка требует раскрутить её дальше. “Вроде понятно” оказывается “на самом деле непонятно что происходит”.

Жду 4D онтологию в следующих главах. Будем дальше разбираться.

Плоское мышление

Ещё заметила такую штуку с собранностью. Это скорее всего тоже из работы приходит. Читаешь длинное описание и понимаешь его плоско. Максимально буквально. Написано в задаче общей фразой - выключить налоги. Или в задании в курсе “роль коллеги”. Что написано, то и получите. Я шучу иногда “сделано по ТЗ, ничего не работает”. Но в точности по ТЗ. Т.е. как бы надо уточнять чуть ли не каждое слово. Но тут проседает собранность наверно фундаментальная. Я когда в хорошем состоянии, я допытываюсь. И есть ещё момент с разделением ролей, т.е. если мне это кривое описание коллега принёс, я уже устала ему помогать, или сделать и проверять, то косяки идут мимо внимания. Кто писал, к тому и вопросы. Потом конечно может начаться “да вы просто неправильно поняли”. И вот с этой степенью формализма очень большие проблемы в коммуникации. Надо поймать поставщика задачи и вытащить из него “какие именно налоги и где они хотят выключить”, оказывается что не все налоги, а один конкретный тип налога в паре конкретных мероприятий.

К чему это я? Курс надо читать вниманительно. Хотя обратная ситуация тоже бывает, хоть и не у меня. Пытаться добиться формального определения каждого слова не помогает, сделать домашку. Надо делать её из какого-то своего понимания, потом уточнять это понимание.

Наверно так: задание читаем внимательно, пытаемся думать, потом делаем, тоже не засиживаясь. А тексты учебника читаем, пытаемся осмыслить, но это не жёсткие правила оформления таблиц в PostgreSQL версии 15.5. Не сломается ничего от того, что понятно не супер формально. А вот в таблицах в БД сломается, если я вместо create table, напишу creation table.

3 лайка

Интересный момент, что в если event существует в реальности, то у самого event не может быть deleted_at, а у информации об event может быть (условно “не актуальная” информация). Тогда в строках таблицы event две модели, модель самого event и модель информации об этом event.

Ещё интересно, что event относится не только к конкретной предметной области, а ко всем. Категория domain_event будет экземпляр для категории event_type и подкатегорией для категории event.

Кажется тут смешались кони-люди. Event в реальности и Event в базе данных. Deleted_at это детали реализации механизма soft delete. Мы имеем необходимость не удалять данные из бд, а только помечать их удалёнными. Этот механизм не разделяя “настоящую информацию” о мероприятии и “мета информацию” можно было бы сделать через starus=expired например. Хотя и тут можно спорить. Поле определяется потребностью. А удаление и просрочка это две разные операции. Если их надо различать, то и поля разные.

Но помня, что это база данных мета информацию мероприятие итак содержит, идентификатор например. Который полностью искусственный UUID. И к нему ещё inserted_at, updated_at, которые про время создания и изменения записи в БД, а не реального мероприятия.

Относится к абсолютно конкретной предметной области, вопрос в том, что название таблицы лингвистически выбрано обобщенное. И даже на русский я перевожу “мероприятия”, хотя могу перевести “события”. И в обоих случаях человек с улицы подумает про своё. А у нас делать названия в стиле java разработки из трех слов лишь бы было, избыточно. Важно, чтобы мы друг друга внутри понимали.

Про event_type наверно даже начинать не буду. Тип мероприятия полностью не определяется только полем event_type)

1 лайк

Возьму событие Заключение трудового договора и попробую разложить его категории по уровням из раздела “Необходимость выбора роли”. Смотрим с точки зрения роли специалист кадрового делопроизводства и роли разработчик:

  • Мир: “Заключение трудового договора”. Считаю событие объектом в мире, который происходит в “17.01.24”, в событие входит Работник и Работодатель
  • M0 Модель: Конкретная строка в БД events - это модель нашего события.
    • Событие заключение трудового договора
    • День заключения 17.01.24
    • Работник Петя
    • Работодатель наша компания
      после наступления, событие находится в прошлом, поэтому оно не может быть удалено. Но т.к. у нас модель, то она может быть и неадекватной, то есть ложной - не соответствовать реальности. Эта адекватность будет относится к модели, а не к объекту, поэтому ей не место в наших уровнях, т.к. она не относится к уровню Мир. Когда мы выявили неадекватность, мы должны отказаться от этой модели и удалить строку.
  • М1 Категории: Столбцы (upd. имеется ввиду заголовки столбца) нашей таблицы. Мы не хотим делать таблицу для каждого события, поэтому адаптируем трудовой кодекс (мета-У-модель) к нашему условию. Сделаем мета-С-модель:
    • Событие
    • Дата события
    • Участники
  • M2 Мета-модель: Трудовой кодекс (мета-У-модель), а именно категории:
    • Событие
    • Дата заключения трудового договора
    • Работник
    • Работодатель
  • М3 Мета-мета-модель:
    • Объекты: Событие, Дата, Работник, Работодатель
    • Категории: Отношение состава (участники входят в событие, событие входит в день), все что на уровнях с “мета-”
  • М4 Мета-мета-мета-модель: не рассматриваю

Мне не удалось идти последовательно по уровням и определять их по очереди, я делал это в совокупности, но первая буква была записана на уровне мир, а последняя на уровне m3.

В целом верно, хотя писать надо точнее:

Модель

В строке таблицы нет такой колонки “Событие заключение трудового договора”.

Никакой колонки с названием работодателя может и не быть, если это подразумевается что для нашей компании.

Мета_С

Нет колонки “Событие” в таблице. Есть заголовок таблицы “События заключения трудового договора”.

Колонка называются Работник, колонки Работодатель может и не быть, если это подразумевается что для нашей компании.

МетаУ - вот тут в кодексе есть тип события “Заключение трудового договора” и его стороны - Работник и Работодатель.

На следующем уровне Мета уже нет Работника и Работодателя, есть Событие, Дата, Участники

3 лайка

Спасибо за ваш ответ.

Я согласен, что можно это сделать точнее, но в рамках работы над учебным примером в определенный момент я себя остановил, т.к. это не привязано к конкретной задачи и дальнейшее инвестирование времени было недопустимым. Надеюсь кому-то, кроме меня, это будет полезно :slight_smile:

Я думал про мета-С-модель, мета-У-модель и пришёл к выводу, что они находятся на одном и том же абстрактном уровне. Оба они мета-модели.

Поэтому,
Событие заключение договора из мета-У-модели я заменил на Событие в мета-С-модели.

  1. Даже несмотря на то, что объекты в этих категориях будут разные.
  2. Зато это даст использование и других мета-У-моделей в таблице events.

Именно поэтому я упомянул роль Разработчик в начале.