Сообщение о конфликтах параллелистики с уровнем приложения

StackOverflow https://stackoverflow.com/questions/2950930

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top