Использование стандартного состояния
Стандартное состояние — весьма полезная методика для принятия мер против в: ключений, которую разработчики зачастую игнорируют. Когда разработчики пииг.~ код, они зачастую указывают, что их программа должна возвратить значение 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 (), а следовательно, разбираться с ними необходимо на Волее высоком уровне.