Почему так много программистов абсолютно ненавидят уровни преобладания объектов?

Почему так много программистов абсолютно ненавидят уровни преобладания объектов?
Почему так много программистов абсолютно ненавидят уровни преобладания объектов? - gaiav @ Unsplash

Распространенность — это простой метод предоставления свойств ACID объектной модели в памяти на основе двоичной сериализации и ведения журнала с упреждающей записью. Это работает следующим образом:

  • Начните со снимка. Сериализуйте объектную модель и запишите ее в файл.
  • Создайте файл журнала. Для каждого вызова объектной модели сериализуйте вызов и его аргументы.
  • Когда журнал становится слишком большим, вы закрываетесь или, как вам удобно, выполняете контрольную точку: записываете новый снимок и усекаете журнал.
  • Чтобы выполнить откат или восстановиться после сбоя или отключения питания, загрузите последний снимок и повторно выполните все вызовы, записанные в журнале.

Меры предосторожности, необходимые для выполнения этой работы:

  • Не допускайте, чтобы ссылки на изменяемые объекты ускользали или попадали на уровень распространенности. Вам нужен какой-то прокси или схема OID, как если бы вы делали RPC. (Это настолько распространенная ошибка новичков, что ее прозвали «проблемой крещения ».)
  • Вся логика, достижимая из вызова, должна быть полностью детерминированной и не должна выполнять важные для бизнес-логики вызовы ввода-вывода или ОС. Запись в диагностический журнал, вероятно, допустима, но получение системного времени или запуск асинхронного делегата, как правило, недопустимы. Это сделано для того, чтобы журнал воспроизводился одинаково, даже если он был восстановлен на другой машине или в другое время. (Большинство кодов распространенности обеспечивают альтернативный вызов времени для получения метки времени транзакции.)
  • Параллелизм записи вносит неоднозначность в интерпретацию журнала, поэтому он запрещен.

Это потому что...

  • люди развили к ним дурной вкус после того, как попытались использовать его в проекте, который ему не очень подходил*?
  • резкая пропаганда Клауса Вустефельда оттолкнула людей?
  • людям, которым нравится императивная модель программирования, не нравится отделение ввода-вывода от вычислений, предпочитая вместо этого чередовать вычисления с вводом-выводом и потоковыми вызовами?
  • Слои преобладания настолько концептуально просты и так тесно связаны с характеристиками среды, в которой они обитают, что обычно создаются специально для проекта, что делает их слишком чуждыми/нестандартными/рискованными?
  • просто слишком сложно держать прямо то, что вы должны быть осторожны, чтобы не сделать?
  • головы новичков, кажется, просто взрываются, когда они сталкиваются с чем-то, что не является тем же видом двухуровневого приложения, управляемого базой данных, которое они научились писать в школе? ;)

*Весь набор данных помещается в ОЗУ, вам не нужен параллелизм записи, и вам не нужно выполнять специальные запросы, отчеты или экспортировать в хранилище данных. Приносим свои извинения SQLite, распространенность — это улучшение файлов сохранения, а не замена Oracle.

Я думаю, что часть проблемы заключается в том, что у них ОЧЕНЬ специфический сценарий использования (ваш не подходит). Я создавал и работал над системами, использующими этот подход, и когда у вас есть проблема, которая на самом деле является этой проблемой, это может быть прекрасным решением.

Другая часть заключается в том, что он очень похож на некоторые из наиболее болезненных частей пользовательских хранилищ данных, которые вы часто встречали 10+ лет назад, и имеет некоторые из тех же подводных камней (вспомните пакетное обновление btreive, например), что приводит к вашему пункту "слишком индивидуально", но также затрудняет поиск готовых частей, которые вежливо работают с ним.

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


LetsCodeIt, 19 мая 2023 г., 16:51