Как я могу вернуть управление клиентскому приложению и снова запросить ввод через мой API? - PullRequest
0 голосов
/ 19 января 2011

Написание чистого API, похоже, поднимает некоторые проблемы. Например, я привык писать приложения winforms / asp.net, где, если введенные данные неверны, я могу программно вызвать диалоговое окно / веб-страницу.

Однако API не знает приложения GUI, из которого оно может быть выполнено. Если у меня есть метод TakeString (String s), а строка (и) не может содержать более 5 букв, как бы я вернул управление клиенту, если это так? Исключение кажется излишним? Простой возврат не сработает, если я возвращаю что-то в методе.

Спасибо

Ответы [ 2 ]

3 голосов
/ 19 января 2011

Исключением является именно то, что нужно сделать. Вы документируете, что в качестве входных данных вы будете принимать только строку, если она не более 5 букв, и в противном случае выведите ArgumentException. Почему это было бы излишним?

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

Попытка заставить API забыть неверный ввод - это путь к катастрофе. Проверяйте ввод как можно более строго и разумно. Если вы заставите клиента вести себя хорошо, позже у вас будет гораздо меньше проблем.

2 голосов
/ 19 января 2011

Исключение - лучший способ справиться с этим.

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

Ваш API (как вы уже указали) должен не знать о клиентском приложении, в том числе о типе приложения, поэтому все, что должен сделать ваш API, это сказать: «Эй, это неверно!» и пусть разработчик клиентского приложения выяснит, как с ним обращаться.

Для простого примера, если вы попробуете следующую строку кода C #:

int myInt = Convert.ToInt32("SSDS");

.NET Framework не пытается повторно запросить пользователя. Это просто вызывает исключение.

...