Как вы утверждаете в алгоритмическом коде в .NET? - PullRequest
5 голосов
/ 19 ноября 2010

В настоящее время я разрабатываю небольшую структуру ИИ (генетические алгоритмы / нейронные сети) на C # для университетского проекта.

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

Я бы хотел иметь много проверок для различных частей моего кода, в основном для утверждений. Проверьте, действительно ли при запуске метода XI находится в правильном состоянии и т. Д. Подобные утверждения полезны при разработке, но я бы хотел, чтобы они держались подальше от кода релиза (то есть, когда я решу, что хочу уйти это работает на ночь, чтобы получить мои окончательные результаты исследований).

Я вижу несколько способов сделать это:

  1. System.Diagonists.Assert семейство методов.
  2. Кодовые контракты
  3. Имея if (x), затем генерирует InvalidStateException (), окруженный #if DEBUG / # endif

Как бы вы это сделали и почему?

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

Ответы [ 2 ]

8 голосов
/ 19 ноября 2010

Вы можете использовать статический метод, подобный этому:

[Conditional("DEBUG")]
public static void Assert(bool condition, string message)
{
    if (!condition)
        throw new InvalidStateException("Assertion failed: " + message);
}

И утверждать, как это, предполагая, что метод определен в классе с именем Util:

Util.Assert(a == b, "a == b");

Вызовыэтот метод будет генерироваться компилятором только тогда, когда установлен символ DEBUG, благодаря условному атрибуту.Таким образом, вам не нужно заключать такие вызовы в какие-либо директивы #if.Это приведет к уменьшению помех в коде.

(Обратите внимание, что сам метод все еще будет компилироваться. Это позволяет использовать такие методы в разных сборках!)

0 голосов
/ 19 ноября 2010

Преимущество #if / #endif состоит в том, что исключается не только вызов функции assert, но и вся работа по подготовке ее параметров (которые, как мы надеемся, не имеют побочных эффектов ...).

...