Почему так много программистов абсолютно ненавидят слои распространенности объектов?
https://softwareengineering.stackexchange.com/questions/6526
-
16-10-2019 - |
Вопрос
Распространенность-это простой метод обеспечения кислотных свойств для объектной модели в памяти, основанной на бинарной сериализации и регистрации записи. Это работает так:
- Начните с снижения. Сериализуйте объектную модель и напишите ее в файл.
- Создайте файл журнала. Для каждого вызова в модель объекта сериализуйте вызов и его аргументы.
- Когда журнал становится слишком большим, вы закрываете, или в противном случае это удобно, выполните контрольную точку: напишите новый снимок и укорените журнал.
- Чтобы отказаться или восстановиться после удара с аварией или питания, загрузите последний снимок и повторно предъяжите все вызовы, записанные в журнале.
Меры предосторожности, необходимые для выполнения этой работы:
- Не позволяйте ссылкам на изменение объекта избежать или ввести слой распространенности. Вам нужна какая -то схема прокси или OID, как будто вы делали RPC. (Это такая распространенная ошибка новичка, она была названа «проблема крещения'.)
- Вся логика, достигаемая от вызова, должна быть полностью детерминированной и не должна выполнять вызовы ввода-вывода или ОС, мадрящие в бизнес-логике. Написание в диагностическом журнале, вероятно, в порядке, но, как правило, получить системное время или запуск асинхронного делегата. Это так, что журнал повторяет идентично, даже если он восстановлен на другой машине или в другое время. (Большая часть кода распространенности обеспечивает альтернативный временной вызов, чтобы получить временную метку транзакции.)
- Согласность писателя вводит двусмысленность в интерпретации журнала, поэтому она запрещена.
Это потому, что ...
- Люди построили для них плохой вкус после попытки использовать один на проекте, который не подходил* к этому?
- Клаус Вуэстефельд строгая пропаганда выключил людей?
- Людям, которым нравится императивная модель программирования не нравится отделение ввода/вывода от расчета, предпочитаете вместо этого переоценить вычисления с вводами и вызовами потока?
- Слои распространенности настолько концептуально просты и настолько тесно связаны с характеристиками рамки, в которой они обитают, что они обычно поднимаются для проекта, что делает их слишком чуждыми/нестандартными/рискованными?
- Слишком сложно сохранить прямо, что вы должны быть осторожны, чтобы не делать?
- Головы новичков, кажется, просто взорвутся, когда сталкиваются с чем-то, что не является таким же двухуровневым приложением, основанным на базе данных, которое они научились писать в школе? ;)
*А Весь набор данных подходит в ОЗУ, Вам не нужна параллелизм писателей, и вам не нужно делать специальные запросы, отчетность или экспортировать в хранилище данных. С извинениями перед SQLite распространенность является улучшением для спасбросков, а не заменой Oracle.
Решение
Я думаю, что некоторые из проблем в том, что они имеют очень специфический вариант использования (ваша не подходящая причина). Я строил и работал над системами, которые используют этот подход, и когда у вас есть проблема, которая на самом деле является этой проблемой, это может быть прекрасным решением.
Другая часть заключается в том, что он очень похож на некоторые из более болезненных кусочков хранения пользовательских данных, которые вы использовали, чтобы найти много 10 с лишним лет назад, и имеет некоторые из тех же ловушек (например, партия, обновленная Btraive), которая вводит в ваш «Слишком индивидуальная» точка, но также затрудняет поиск частей полки, которые вежливо работают с ним.
Последняя часть заключается в том, что во многих случаях их может быть чертовски трудно запросить, и люди в целом очень привыкли получить свои ответы прямо сейчас.
Другие советы
Я думаю, что вам сначала нужно продемонстрировать, что так много разработчиков абсолютно ненавидят их. Я не думаю, что это так. Считайте, что Фаулер, некоторое время назад, формализовал своего рода шаблон для этого здесь.
Ответ на вопрос заключается в том, что, хотя теория проста, практика не является.
Просто тестирование такой настройки требует десятков тестовых случаев, добавить в процесс Mutli или многополосный код, и это переходит к сотням возможных условий, которые необходимо протестировать, как для постоянства, так и для восстановления.
Любой монитор транзакций, такой как CICS, TUXEDO, WebLogic, WebSphere, JBoss или .net, предоставит все эти объекты чистым и протестированным образом. И любая база данных обеспечит «достаточно» транзакционной/настойчивости для большинства приложений.
В основном это случай этого колеса был изобретен и усовершенствован давным -давно.
Предварительные условия звучат немного обременительными для кодирования, особенно с тем, что большинство систем не нуждаются в соблюдении кислоты при запуске в памяти. Накладные расходы тоже звучат немного неприятны - там есть много отслеживания состояний.