Передача конфликтов параллелизма на уровень приложений - PullRequest
2 голосов
/ 01 июня 2010

При передаче конфликтов параллелизма на уровень вашего приложения, есть ли альтернатива использованию исключений, которые также соблюдают принцип Разделение команд-запросов , или являются исключениями лучшим механизмом, который у нас есть (в языках, которые поддерживают исключения )

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

// 'data' is just a placeholder for multiple parameters, including something
// that contains row version information
void Customer.UpdateInformation(object data);

Мне нужно иметь возможность сообщать пользователям веб-приложений, когда кто-то еще обновил данные, над которыми они работают.

Я бы предпочел не возвращать значение из методов, которые изменяют данные. Поэтому в прошлом я генерировал исключения (аналогично API адаптера данных .NET, который выдает DBConcurrencyException при обнаружении конфликтов), но конфликты параллелизма не являются, в некотором смысле здравого смысла, исключительными , Это факт жизни: предсказуемая, ожидаемая часть рабочего процесса приложения. Они квалифицируются как экзогенные исключения в таксономии Эрика Липперта?

1 Ответ

1 голос
/ 01 июня 2010

По моему мнению, исключения - лучший способ сообщить об ошибках такого рода. Я думаю, что ваше решение вполне правильное, потому что вы генерируете особый тип исключения, которое вы можете поймать на уровне представления. Уровень представления может использовать информацию в этом исключении для отображения пользователю.

Хотя исключения - лучший способ, создать приятный пользовательский интерфейс может быть очень сложно. Проще всего было бы сообщить пользователю, что произошел конфликт, и выбрать, хочет ли он потерять свои изменения или отменить новые. Сложно, когда вы хотите отобразить конфликты или позволить пользователю выбирать, какие значения переопределять, а какие нет. Или, по крайней мере, очень сложно сделать это в общем виде. Возможно, вам понадобится специальный интерфейс для разрешения таких конфликтов для каждого экрана в вашей системе, где могут возникнуть конфликты.

В системах, над которыми я работал, мы едва ли в основном не улавливали эти исключения для отображения пользователю. В основном мы пытались предотвратить возникновение этих конфликтов путем изменения процессов, стоящих за ним. Конечно, все зависит от типа вашего приложения и от того, как бизнес работает (или любит работать), какое решение лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...