Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Определение изменившихся свойств объекта / 25 сообщений из 50, страница 1 из 2
24.07.2012, 15:21:45
    #37890717
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
Скорее всего нужен какой-то паттерн или подход к решению следующей проблемы:
Допустим у нас существует объект:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
class User{
List<Address> addresses;
List<Phone> phones;

String name;
int age;

...
}



Он отдается пользователю на редактирование, после сабмита нам необходимо понять какие свойства в объекте или в дочерних объектах поменялись/удалились/добавились. Как это сделать?

На ум приходит Memento + "какой то резолвер который сможет подсказать что изменилось".
...
Рейтинг: 0 / 0
24.07.2012, 15:29:11
    #37890737
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
Делал похожую вещь довольно экзотическим способом, но это было не для продакшена, так - ради идеи.
В общем отдавал на редактирование не сам объект юзер, а прокси к нему, который перехватывал все методы изменяющие значения, и хранил их в ArrayList<Change>, но там есть подводные камни - например что если значение изменилось 2 раза, что если в итоге оно вернулось к первончальному и т.п, для моей задачи было удобоваримо.
...
Рейтинг: 0 / 0
24.07.2012, 15:44:54
    #37890789
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
забыл ник... но там есть подводные камни - например что если значение изменилось 2 раза, что если в итоге оно вернулось к первончальному и т.п, для моей задачи было удобоваримо.
Про прокси я тоже думал, но решение что бы удовлетворяло задаче я пока не нашел.
Есть подводные камни? У меня и воды уже не осталось, одни камни. В мое задаче по мимо описанного вами еще и перестановка дочерних объектов существует.
...
Рейтинг: 0 / 0
24.07.2012, 16:15:24
    #37890870
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
ТимоН"какой то резолвер который сможет подсказать что изменилось".
рефлексия
...
Рейтинг: 0 / 0
24.07.2012, 16:26:05
    #37890893
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
LeonidvТимоН"какой то резолвер который сможет подсказать что изменилось".
рефлексия
не уловил мысль.
...
Рейтинг: 0 / 0
24.07.2012, 16:59:50
    #37890977
vas0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
Как вариант, твои объекты должны удовлетворять java beans в части генерирования событий.

Каждый settter должен генерировать PropertyChangeEvent. Плюс какой нибудь Listener который будет информацию обо всех изменениях накапливать.
...
Рейтинг: 0 / 0
24.07.2012, 17:32:34
    #37891028
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
ТимоН,
не усложняй. На каждое свойство флаг изменения.
Паттерн Визитор - обходит все объекты и собирает изменения списком.
...
Рейтинг: 0 / 0
24.07.2012, 17:48:10
    #37891062
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
ТимоНLeonidvпропущено...

рефлексия
не уловил мысль.

Сохраняем состояние объекта до изменения. Получаем новый объект с изменениями и пробегаемся рефлексией по полям.
...
Рейтинг: 0 / 0
24.07.2012, 18:02:19
    #37891082
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
LeonidvСохраняем состояние объекта до изменения. Получаем новый объект с изменениями и пробегаемся рефлексией по полям.

Самое сложное, как мне кажется, это вложенные коллекции. Рефлексия меня не спасет если, во вложенной коллекции было 3 элемента. Пользователь удалил один адрес, переставил местами два оставшихся, добавил еще один адрес.
...
Рейтинг: 0 / 0
24.07.2012, 18:05:51
    #37891084
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
Petro123ТимоН,
не усложняй. На каждое свойство флаг изменения.
Паттерн Визитор - обходит все объекты и собирает изменения списком.
Получается что должен быть список изменений. Я могу отредактировать элемент, передвинуть в коллекции. + У зависимых элементов для перестановки тоже должны генериться флаги изменения состояния (++/-- index )
...
Рейтинг: 0 / 0
24.07.2012, 18:08:30
    #37891088
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
ТимоН,
- Зачем список?
- нет в коллекции нумераций. Так же как и в БД. Это изврат.
...
Рейтинг: 0 / 0
24.07.2012, 18:12:36
    #37891093
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
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 имеет две операции редактирования "перестановка"
...
Рейтинг: 0 / 0
24.07.2012, 18:16:08
    #37891095
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
*элемент с индексом 0 имеет одну операции редактирования "перестановка"
...
Рейтинг: 0 / 0
24.07.2012, 19:02:45
    #37891148
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
можно вопрос на засыпку, зачем отслеживать изменения? проседает скорость при холостых сохранениях? или хотим логгировать изменения?
...
Рейтинг: 0 / 0
25.07.2012, 05:02:40
    #37891509
Герой дня
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
я бы в прокси складывал объекты в массив - эффективно при условии, что объекты небольшие
...
Рейтинг: 0 / 0
25.07.2012, 13:25:27
    #37892082
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
chpashaможно вопрос на засыпку, зачем отслеживать изменения? проседает скорость при холостых сохранениях? или хотим
логгировать изменения?
Нет. Все намного проще. Пользователю отдается объект на редактирование, с помощью скрипта он его наполняет/редактирует и постит обратно. Проблемы начинаются во время редактирование уже существующего объекта.
...
Рейтинг: 0 / 0
25.07.2012, 13:49:28
    #37892143
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
ТимоНПроблемы начинаются во время редактирование уже существующего объекта.
проблемы какого рода? редактированный объект нужно сохранить или что?
...
Рейтинг: 0 / 0
25.07.2012, 14:06:31
    #37892179
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
ТимоН,
"не верю".
Если постит велосипед, то верю
...
Рейтинг: 0 / 0
25.07.2012, 14:38:49
    #37892267
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
Давайте начнем сначала, с ответа на некорректный вопрос "для чего это нужно?"
...
Рейтинг: 0 / 0
25.07.2012, 16:14:41
    #37892479
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
Подробнее,

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 удалять не нужно, а всего лишь поменять местами ссылки?
...
Рейтинг: 0 / 0
25.07.2012, 16:21:42
    #37892501
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
Я бы сделал так - в начале редактирования запомнил все пути во временной переменной, отдал юзеру - он поменял, добавил удалил - я полностью очищаю коллекцию фоток, беру последнюю версию от юзера - мержу их(нахожу те что надо удалить и те что надо добавить), удаляю и добавляю файлы, записываю коллекцию от юзера, очищаю временную переменную. Вроде не так сложно, особенно с реордерингом.
...
Рейтинг: 0 / 0
25.07.2012, 16:32:54
    #37892529
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
ТимоН,
ты забыл что ситуация многопользовательская.
Поэтому, пока решаешь проблему сортировки фото, другой юзверь удалит фото #5.
Поэтому 2 варианта:
- оптимистическая блокировка объекта со всеми его списками
- пессимистическая.
Из этого вытекает, что ты либо блокируешь объект, пока кто-то играется (местами фото).
Либо ты НЕ блокируешь, но СРАЗУ при смене места - СОХРАНЯЕШЬ в БД по аяксу.
Сейчас каналы не такие слабые, чтобы ждать когда юзверь А, Б, С наиграются с ОДНИМ объектом а потом все втроём будут писать в базу)))
______________________________________________
"Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн.
AutoPOI.ru — ГИС-технологии для Oracle
...
Рейтинг: 0 / 0
25.07.2012, 16:35:12
    #37892534
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
далее, Хибер автоматически имеет флажки с наследованием при изменении объекта. Чтобы решать данную проблему.
А очерёдность фото обычно решают просто через доп свойство - индекс-сортировка.
...
Рейтинг: 0 / 0
25.07.2012, 16:46:43
    #37892552
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
авторКак получить/создать список этих модифицирующих операций?
Как понять что Фото 2 уже нет в объекте, что нужно удалить и физически файл?
Как понять что Фото 1, Фото 3 удалять не нужно, а всего лишь поменять местами ссылки?


Опять же, нет ответа на вопрос "зачем".

авторвсего лишь поменять местами ссылки

Пытаетесь экономить байты? Производительность? По-моему, выделки не стоит. Проще перезаписывать весь объект.

Если уж на то пошло, можно выделить в независимые действия (транзакции) с отдельными сущностями: "изменение порядка ссылок", "удаление картинок" и т.д., явно вызываемые кнопочками у пользователя.
...
Рейтинг: 0 / 0
25.07.2012, 16:49:38
    #37892558
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение изменившихся свойств объекта
Petro123ТимоН,
ты забыл что ситуация многопользовательская.
Поэтому, пока решаешь проблему сортировки фото, другой юзверь удалит фото #5.
Поэтому 2 варианта:
- оптимистическая блокировка объекта со всеми его списками
- пессимистическая.
Из этого вытекает, что ты либо блокируешь объект, пока кто-то играется (местами фото).
Либо ты НЕ блокируешь, но СРАЗУ при смене места - СОХРАНЯЕШЬ в БД по аяксу.
Сейчас каналы не такие слабые, чтобы ждать когда юзверь А, Б, С наиграются с ОДНИМ объектом а потом все втроём будут писать в базу)))

Конкретно для ситуации описанной выше, тут вообще все просто решается, без подобного рода телодвижений.
Я бы вообще хранил всю коллекцию путей как одну строку, написал бы к ней геттер, который возвращает в виде list, и добавил бы поле updated_at вот и все. И пусть хоть 500 пользователей одновременно с ней что-то делают, если с момента загрузки было обновление - то так и сказать юзеру, а если нет - просто банально найти те пути что добавились и удалились, и асинхронно обработать файлы руководствуясь этой инфой.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Определение изменившихся свойств объекта / 25 сообщений из 50, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]