Використання стану за замовчуванням в Visual C # (Sharp)

Використання стану за замовчуванням є корисним методом захисту від винятків, які часто ігноруються розробниками Нерідко, коли код не працює належним чином, розробники пригнічують проблему, повертаючи в рультатах роботи коду 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 &lt foundLength cl++) { ConsoleWriteLine(&quotFound (&quot + found[cl] + &quot)&quot)

}

}

}

}

У даному прикладі проблемою є метод 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 &lt foundLength cl++) { ConsoleWriteLine(&quotFound  (&quot + found[cl] + &quot)&quot)

}

}

}

У модифікованому коді метод TokenizeO повертає порожній масив при обротке цього масиву в циклі for буде виконано нульове число ітерацій Цей код не викликає винятків і є більш легким для читання

Але що буде, якщо метод Tokenize () все-таки викличе виняток У такому випадку відсутність блоку try / catch в методі IterateBuffers () може дати привід для припущення, що цей метод реалізований неправильно Але насправді з методом IterateBuf fers про все гаразд, т к метод TokenizeO згенерує ілюченіе тільки у випадку по-справжньому серйозної помилки Велика проблема знаходиться поза області методу IterateBuf fers о, і тому її потрібно вирішувати на більш високому рівні Дану ситуацію можна порівняти з конституційним іом, який автоматично надсилається до Конституційного суду, т к суди оей юрисдикції не можуть його розглядати

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*