Каков наилучший способ реализовать удаление пользовательских объектов, когда есть несколько зрителей объекта? - PullRequest
1 голос
/ 21 февраля 2010

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

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

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

Ответы [ 2 ]

2 голосов
/ 21 февраля 2010

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

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

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

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

2 голосов
/ 21 февраля 2010

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

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

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

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