Главная » C# » Использование состояния по умолчанию в Visual C# (Sharp)

0

Использование состояния по умолчанию является полезным методом защиты от исключений, которые часто игнорируются разработчиками. Нередко, когда код не работает должным образом, разработчики подавляют проблему, возвращая в рультатах работы кода 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 в последовательность строковых маркеров. Примяя методы кодирования, предотвращающие исключения, если данные не  поддтся преобразованию, можно выбросить исключение или же возвратить нулевое значение, указывающее, что строку нельзя преобразовать.

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

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

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] + ")");

}

}

}

В модифицированном коде метод TokenizeO возвращает пустой массив; при обротке этого массива в цикле for будет выполнено нулевое число итераций. Данный код не вызывает исключений и является более удобочитаемым.

Но что будет, если метод Tokenize () все-таки вызовет исключение? В таком случае отсутствие блока try/catch в методе IterateBuffers() может дать повод для предположения,  что  этот  метод  реализован  неправильно.  Но  в  действительности с методом IterateBuf fers о все в порядке, т. к. метод TokenizeO сгенерирует илючение только в случае по-настоящему серьезной ошибки. Большая проблема находится вне области метода IterateBuf fers о, и поэтому ее нужно решать на более высоком уровне. Данную ситуацию можно сравнить с конституционным иом, который автоматически направляется в Конституционный суд, т. к. суды оей юрисдикции не могут его рассматривать.

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии