C#

Использование стандартного состояния

Стандартное состояние — весьма полезная методика для принятия мер против в: ключений, которую разработчики зачастую игнорируют. Когда разработчики пииг.~ код, они зачастую указывают, что их программа должна возвратить значение null, ест:; что-то пошло не так. Использование значения null — неплохая идея, но это ненужных: дополнительный багаж. Рассмотрим, например, следующий код: class DefaultStateWrong { string!] Tokenize(string buffer) { return null; } public void IterateBuffers(string buffer) { string [] found = Tokenize(buffer); if (found != null) { for (int cl = 0; cl < found.Length; cl++) { Console.WriteLine("Found (" + found[cl] + ")"); } ) } } Проблема здесь в методе Tokenize (), используемом для преобразования параметра buffer в серию строковых маркеров. Если данные не будут проанализированы правиль¬но, вы могли бы передать исключение или возвратить значение null, указывающее на невозможность анализа буфера. Код вызывающей стороны включает блок if, проверяющий на значение null резуль¬тат вызова метода Tokenize (). Блок if — это защитный код, но он также усложняет подход, поскольку необходима проверка на значение null. А если бы метод Tokenize () был немного более интеллектуален и возвращал пуст: массив, чтобы указать на отсутствие результирующего набора данных? Тут есть СВОЙ логика, поскольку вызывающая сторона ожидает либо результирующий набор данньг с элементами, либо результирующий набор данных без ничего. Если происходит суще¬ственная ошибка анализа, единственно правильный выход — передача исключения Вот переделанный код: class DefaultStateRight { string[] Tokenize(string buffer) { return new string[0] ; ) public void IterateBuffers(string buffer) { string[] found = Tokenize(buffer); for (int cl = 0; cl < found.Length; cl++) { Console.WriteLine("Found (" + found[cl] + ")"); ) } ) В переделанном коде метод Tokenize () возвращает пустой массив, который при пе¬реборе в цикле for оказывается нулевой длины. Это вполне удобочитаемый код с улуч-—енной защитой от исключения. Что будет, если метод Tokenize () передаст исключение? Отсутствие блока try/catch 5 методе IterateBuf fers () создает впечатление, что он написан неправильно. На са¬мом деле это не так, поскольку метод Tokenize () передаст исключение только тогда, когда действительно произойдет серьезная неполадка. Крупные проблемы вне компе¬тенции метода IterateBuf fers (), а следовательно, разбираться с ними необходимо на Волее высоком уровне.