Каков наилучший способ реализовать удаление пользовательских объектов, если есть несколько просмотрщиков объекта?

Допустим, у меня есть графический интерфейс с несколькими типами средств просмотра пользовательских объектов. Например, представление в виде дерева, представление в виде списка и представление диаграммы. Три представления показывают одни и те же объекты. Если пользователь удаляет объект из одного представления, я хотел бы запустить событие, чтобы уведомить два других представления. В настоящее время я делаю это, выставляя событие на самом объекте. Таким образом, если объект удален из представления 1, представление 1 вызовет удаление объекта, которое затем отправит событие подписчикам (все 3 представления). У каждого подписчика есть возможность отменить удаление.

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

Есть ли хорошие шаблоны для реализации такого общего сценария?


person Rhubarb    schedule 20.02.2010    source источник


Ответы (2)


Если объект должен быть удален из всех представлений или вообще из всех представлений

  1. Спросите каждого подписчика, можно ли удалить элемент; Если да:
  2. Выполните вызов «удалить элемент», чтобы удалить объект из источника, выполнить мягкое удаление или что-то еще, что вы хотите
  3. Обновите каждое представление. Это будет часть наблюдателя, прослушивание вызова «объект удален» и выполнение соответствующих действий, например, удаление удаленного объекта вручную из каждого представления.

Если вы хотите, чтобы пользователь всегда мог удалить объект из своего представления:

  1. Шаг 2. сверху, с добавлением того, что он был удален только для 1) пользователя; или 2) этот пользователь в этом представлении
  2. Шаг 1. сверху и далее.. (можно пропустить, в зависимости от того, насколько вы хотите, чтобы представления были согласованными)
person chelmertz    schedule 20.02.2010

Фишка здесь в том, что у каждого подписчика есть шанс отменить удаление. Обычно, когда вы используете слова «просмотреть» и «подписаться», это означает, что вы пассивны и просто реагируете на то, что видите.

Это не означает, что то, что вы пытаетесь сделать, невозможно, но это определенно сложно. Например, вы можете попытаться сделать своего рода двухэтапную фиксацию, когда вы отмечаете объект как удаленный, а затем ждете, пока все зрители подтвердят удаление, прежде чем действительно удалить объект. (В основном это подход «спросите каждого подписчика, можно ли удалить элемент», который предлагает Челмерц.) Однако это означает, что вам нужно точно знать, сколько зрителей, и все зрители должны будут ответить, прежде чем вы сможете завершить удаление. У вас всегда три зрителя? Всегда ли бывает только два? Что делать, если в одном из средств просмотра есть ошибка - должно ли удаление завершиться ошибкой или вы все равно хотите удалить объект?

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

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

person Joe Carnahan    schedule 21.02.2010