Повышение производительности при проверке данных - PullRequest
0 голосов
/ 15 декабря 2009

Следующий пример явно вымышленный, но он возобновляет выполнение проверки на базе кода, с которой я работаю.

В TypeA есть два метода со следующими сигнатурами:

public void FirstMethod(TypeB param)
public ValidationResult TryFirstMethod(TypeB param)

Когда вызывается FirstMethod, он должен выполнить проверку параметра.
Следовательно, он вызывает TryFirstMethod для получения объекта, представляющего результат проверки.
Если экземпляр ValidationResult сообщает, что все в порядке, выполнение продолжается, иначе выдается исключение.

Утилита TryFirstMethod заключается в том, что вызывающий объект, гипотетический TypeC, может выполнить этот метод и проверить, будет ли генерироваться фактический метод. Изучив свойство в ValidationResult.
Кроме того, экземпляр ValidationResult содержит информацию о том, почему ввод был неверным, как его исправить и т. Д.
Это оправдывает необходимость использования этого типа вместо, скажем, использования логического значения.

На практике это работает довольно хорошо, довольно просто проверять данные и возвращать локализованные сообщения об ошибках пользователю.

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

Я не могу найти чистый способ избежать проверки два раза.
Чтобы сделать вещи более сложными, существует тот факт, что решение должно работать со стандартными методами, конструкторами, а также когда TypeB является «примитивным» типом, таким как string или int.

Ответы [ 3 ]

1 голос
/ 15 декабря 2009

Похоже, ваша основная логика выглядит примерно так:

  1. Подтвердить TypeB (вызов TryFirstMethod).
  2. Если недопустимо, отобразить сообщение об ошибке.
  3. Если допустимо (и, предположительно, допустимы и другие члены), то выполнить операцию с данными (как часть FirstMethod?).
  4. Операция обработки данных (FirstMethod) повторно проверяет ввод.

Если это (в некоторой степени) правильно, вы сможете изменить свой дизайн на что-то вроде:

  1. Звоните FirstMethod.
  2. Проверка данных.
  3. Если недействительно, выдать исключение проверки.
  4. Если действует, выполните операцию с данными.

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

0 голосов
/ 15 декабря 2009

Самым чистым решением в моих глазах был бы третий метод:

public void FirstMethod(TypeB param, ValidationResult alreadyPerformedResult)

Таким образом, пользователь может выполнить собственную проверку, вызвать нужную функцию с результатом проверки. Таким образом, вы можете пропустить проверку и просто проверить, соответствуют ли результаты теста вашим критериям.

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

0 голосов
/ 15 декабря 2009

Поскольку первый метод void, почему бы просто не вызвать его для начала и не вернуть ValidationResult?

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

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

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