2

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

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

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

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

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

ответ

1

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

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

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

Смежные вопросы