|
|
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
Скорее всего нужен какой-то паттерн или подход к решению следующей проблемы: Допустим у нас существует объект: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. Он отдается пользователю на редактирование, после сабмита нам необходимо понять какие свойства в объекте или в дочерних объектах поменялись/удалились/добавились. Как это сделать? На ум приходит Memento + "какой то резолвер который сможет подсказать что изменилось". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 15:21:45 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
Делал похожую вещь довольно экзотическим способом, но это было не для продакшена, так - ради идеи. В общем отдавал на редактирование не сам объект юзер, а прокси к нему, который перехватывал все методы изменяющие значения, и хранил их в ArrayList<Change>, но там есть подводные камни - например что если значение изменилось 2 раза, что если в итоге оно вернулось к первончальному и т.п, для моей задачи было удобоваримо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 15:29:11 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
забыл ник... но там есть подводные камни - например что если значение изменилось 2 раза, что если в итоге оно вернулось к первончальному и т.п, для моей задачи было удобоваримо. Про прокси я тоже думал, но решение что бы удовлетворяло задаче я пока не нашел. Есть подводные камни? У меня и воды уже не осталось, одни камни. В мое задаче по мимо описанного вами еще и перестановка дочерних объектов существует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 15:44:54 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
ТимоН"какой то резолвер который сможет подсказать что изменилось". рефлексия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 16:15:24 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
LeonidvТимоН"какой то резолвер который сможет подсказать что изменилось". рефлексия не уловил мысль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 16:26:05 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
Как вариант, твои объекты должны удовлетворять java beans в части генерирования событий. Каждый settter должен генерировать PropertyChangeEvent. Плюс какой нибудь Listener который будет информацию обо всех изменениях накапливать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 16:59:50 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
ТимоН, не усложняй. На каждое свойство флаг изменения. Паттерн Визитор - обходит все объекты и собирает изменения списком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 17:32:34 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
ТимоНLeonidvпропущено... рефлексия не уловил мысль. Сохраняем состояние объекта до изменения. Получаем новый объект с изменениями и пробегаемся рефлексией по полям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 17:48:10 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
LeonidvСохраняем состояние объекта до изменения. Получаем новый объект с изменениями и пробегаемся рефлексией по полям. Самое сложное, как мне кажется, это вложенные коллекции. Рефлексия меня не спасет если, во вложенной коллекции было 3 элемента. Пользователь удалил один адрес, переставил местами два оставшихся, добавил еще один адрес. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 18:02:19 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
Petro123ТимоН, не усложняй. На каждое свойство флаг изменения. Паттерн Визитор - обходит все объекты и собирает изменения списком. Получается что должен быть список изменений. Я могу отредактировать элемент, передвинуть в коллекции. + У зависимых элементов для перестановки тоже должны генериться флаги изменения состояния (++/-- index ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 18:05:51 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
ТимоН, - Зачем список? - нет в коллекции нумераций. Так же как и в БД. Это изврат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 18:08:30 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
Petro123, Ок, пример [0] - Адрес номер 1 [1] - Адрес номер 2 [2] - Адрес номер 3 1. Изменение [0] - Адрес номер 2 (перестановка) [1] - Адрес номер 1 (перестановка) [2] - Адрес номер 3 2. Изменение [0] - Измененный Адрес номер 2 (переименование) [1] - Адрес номер 1 [2] - Адрес номер 3 3. POST В итоге элемент с индексом 1 имеет две операции редактирования "перестановка" и "переименование" элемент с индексом 0 имеет две операции редактирования "перестановка" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 18:12:36 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
*элемент с индексом 0 имеет одну операции редактирования "перестановка" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 18:16:08 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
можно вопрос на засыпку, зачем отслеживать изменения? проседает скорость при холостых сохранениях? или хотим логгировать изменения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2012, 19:02:45 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
я бы в прокси складывал объекты в массив - эффективно при условии, что объекты небольшие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2012, 05:02:40 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
chpashaможно вопрос на засыпку, зачем отслеживать изменения? проседает скорость при холостых сохранениях? или хотим логгировать изменения? Нет. Все намного проще. Пользователю отдается объект на редактирование, с помощью скрипта он его наполняет/редактирует и постит обратно. Проблемы начинаются во время редактирование уже существующего объекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2012, 13:25:27 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
ТимоНПроблемы начинаются во время редактирование уже существующего объекта. проблемы какого рода? редактированный объект нужно сохранить или что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2012, 13:49:28 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
ТимоН, "не верю". Если постит велосипед, то верю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2012, 14:06:31 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
Давайте начнем сначала, с ответа на некорректный вопрос "для чего это нужно?" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2012, 14:38:49 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
Подробнее, web приложение, редактирование элемента, очень похоже на редактирование товара. Упрощенный вид формы такой: 1. Параметры (название, описание и т.д.) *это все не интересно 2. Набор ссылок на фотографии (объект не содержит в себе сами фотографии, только ссылки на них (пусть ввиде ссылок будет выступать простой путь на диске до файла)) Фотографии грузятся ajax'ом, сразу после загрузки на форме отображается его тумбнейл и добавляется hidden поле с ссылкой на новый временный объект фотографии. Их можно удалять/добавлять/менять местами. Теперь при сабмите мы можем узнать список ссылок которые должен содержать объект. -Должна существовать кнопка отменить все действия cancel. -При нажатии на save, очевидно все изменения сохраняются. Не проблема: При первоначальном создании объекта нас вообще не волнует состояние этих фотографий, они все новые. Нужно залить фотографии, добавить ссылки в объект "товар". Тут все просто. Проблема: редактируем ранее созданный объект с 3мя фотографиями, все изменения пока только на стороне пользователя [0] - Фото 1 [1] - Фото 2 [2] - Фото 3 действие 1 (удаление фотографии [1]): [0] - Фото 1 [1] - Фото 3 действие 2 (добавление новой фотографии ): [0] - Фото 1 [1] - Фото 3 [2] - Фото New действие 3 (перестановка первой и последней): [0] - Фото New [1] - Фото 3 [2] - Фото 1 действие 4 - "сохранить" В контроллере я имею следующую ситуцию: Было Стало [0] - Фото 1 [0] - Фото New [1] - Фото 2 [1] - Фото 3 [2] - Фото 3 [2] - Фото 1 Операции которые необходимо проделать над объектом: - Удалить физически Фото 2, удалить ссылку - залить Фото New, добавить ссылку - обновить порядок ссылок Как получить/создать список этих модифицирующих операций? Как понять что Фото 2 уже нет в объекте, что нужно удалить и физически файл? Как понять что Фото 1, Фото 3 удалять не нужно, а всего лишь поменять местами ссылки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2012, 16:14:41 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
Я бы сделал так - в начале редактирования запомнил все пути во временной переменной, отдал юзеру - он поменял, добавил удалил - я полностью очищаю коллекцию фоток, беру последнюю версию от юзера - мержу их(нахожу те что надо удалить и те что надо добавить), удаляю и добавляю файлы, записываю коллекцию от юзера, очищаю временную переменную. Вроде не так сложно, особенно с реордерингом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2012, 16:21:42 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
ТимоН, ты забыл что ситуация многопользовательская. Поэтому, пока решаешь проблему сортировки фото, другой юзверь удалит фото #5. Поэтому 2 варианта: - оптимистическая блокировка объекта со всеми его списками - пессимистическая. Из этого вытекает, что ты либо блокируешь объект, пока кто-то играется (местами фото). Либо ты НЕ блокируешь, но СРАЗУ при смене места - СОХРАНЯЕШЬ в БД по аяксу. Сейчас каналы не такие слабые, чтобы ждать когда юзверь А, Б, С наиграются с ОДНИМ объектом а потом все втроём будут писать в базу))) ______________________________________________ "Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн. AutoPOI.ru — ГИС-технологии для Oracle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2012, 16:32:54 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
далее, Хибер автоматически имеет флажки с наследованием при изменении объекта. Чтобы решать данную проблему. А очерёдность фото обычно решают просто через доп свойство - индекс-сортировка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2012, 16:35:12 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
авторКак получить/создать список этих модифицирующих операций? Как понять что Фото 2 уже нет в объекте, что нужно удалить и физически файл? Как понять что Фото 1, Фото 3 удалять не нужно, а всего лишь поменять местами ссылки? Опять же, нет ответа на вопрос "зачем". авторвсего лишь поменять местами ссылки Пытаетесь экономить байты? Производительность? По-моему, выделки не стоит. Проще перезаписывать весь объект. Если уж на то пошло, можно выделить в независимые действия (транзакции) с отдельными сущностями: "изменение порядка ссылок", "удаление картинок" и т.д., явно вызываемые кнопочками у пользователя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2012, 16:46:43 |
|
||
|
Определение изменившихся свойств объекта
|
|||
|---|---|---|---|
|
#18+
Petro123ТимоН, ты забыл что ситуация многопользовательская. Поэтому, пока решаешь проблему сортировки фото, другой юзверь удалит фото #5. Поэтому 2 варианта: - оптимистическая блокировка объекта со всеми его списками - пессимистическая. Из этого вытекает, что ты либо блокируешь объект, пока кто-то играется (местами фото). Либо ты НЕ блокируешь, но СРАЗУ при смене места - СОХРАНЯЕШЬ в БД по аяксу. Сейчас каналы не такие слабые, чтобы ждать когда юзверь А, Б, С наиграются с ОДНИМ объектом а потом все втроём будут писать в базу))) Конкретно для ситуации описанной выше, тут вообще все просто решается, без подобного рода телодвижений. Я бы вообще хранил всю коллекцию путей как одну строку, написал бы к ней геттер, который возвращает в виде list, и добавил бы поле updated_at вот и все. И пусть хоть 500 пользователей одновременно с ней что-то делают, если с момента загрузки было обновление - то так и сказать юзеру, а если нет - просто банально найти те пути что добавились и удалились, и асинхронно обработать файлы руководствуясь этой инфой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2012, 16:49:38 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37892534&tid=2131273]: |
0ms |
get settings: |
13ms |
get forum list: |
26ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
81ms |
get topic data: |
17ms |
get forum data: |
4ms |
get page messages: |
90ms |
get tp. blocked users: |
2ms |
| others: | 311ms |
| total: | 556ms |

| 0 / 0 |
