Сообщение о конфликтах параллелистики с уровнем приложения
-
22-10-2019 - |
Вопрос
При передаче параллелизма конфликтует с вашим уровнем приложения, существует ли альтернатива использованию исключений, которые также уважают принцип Разделение командного писателя, или исключения являются лучшим механизмом, который у нас есть (на языках, которые поддерживают исключения)?
В кишечнике моего приложения у меня есть оптимистичная логика блокировки, которая выполняет несколько слоев, когда я вызываю определенные методы высокого уровня, например (в моем случае, я использую пользовательский уровень доступа к данным, хотя я, безусловно, открыт для Услышав, как это делают реализации ORM). Вызовы методов высокого уровня, которые приложение взаимодействует с выглядит так:
// 'data' is just a placeholder for multiple parameters, including something
// that contains row version information
void Customer.UpdateInformation(object data);
Мне нужно иметь возможность рассказать пользователям веб -приложения, когда кто -то еще обновил данные, над которыми они работают.
Я бы предпочел не возвращать значение из методов, которые изменяют данные. Итак, в прошлом я бросал исключения (аналогично API адаптера данных .NET, который бросает DbconcurrencyException Когда он обнаруживает конфликты), но конфликты параллелизма не являются каким-то здравым смыслом, не исключительны. Они факт жизни: предсказуемая, ожидаемая часть рабочего процесса приложения. Они квалифицируются как экзогенные исключения, в таксономии Эрика Липперта?
Решение
На мой взгляд, исключения - лучший способ передать такие ошибки. Я думаю, что ваше решение вполне правильно, потому что вы бросаете определенное исключение, которое вы можете поймать на уровне презентации. Уровень презентации может использовать информацию в этом исключении для отображения пользователю.
Хотя исключения - лучший способ, создание хорошего пользовательского опыта может быть очень сложным. Самым простым было бы сказать пользователю, что был конфликт, и выбрать, хочет ли он потерять свои изменения или хотеть переопределить новые изменения. Становится трудно, когда вы хотите отобразить конфликты или позволить пользователю выбрать, какие значения переопределить, а какие нет. Или, по крайней мере, это очень сложно сделать общим способом. Возможно, вам понадобится конкретный интерфейс для разрешения таких конфликтов для каждого экрана в вашей системе, где могут возникнуть конфликты.
В системах, над которыми я работал, мы вряд ли не поймали эти исключения для отображения пользователю. Мы в основном пытались предотвратить возникновение этих конфликтов, изменив процессы, стоящие за ним. Это, конечно, полностью зависит от вашего типа приложения и того, как бизнес работает (или любит работать), какое решение лучше.