Как сделать макет кода визуально «привлекательным» при внедрении обработки ошибок? - PullRequest
5 голосов
/ 11 июля 2010

При написании кода я считаю важным, чтобы мой код хорошо выглядел (не считая того, что он должен хорошо работать ). В книге Code Complete (p729) хорошо описано: « Визуальное и интеллектуальное наслаждение хорошо отформатированным кодом - это удовольствие, которое немногие непрограммисты могут оценить ».

Проблема в том, что, как только мой код заработал функционально, и я начал вводить обработку ошибок (пункты try-кроме и т. Д.), Чтобы сделать его устойчивым, я обнаружил, что это обычно портит мой хорошо продуманный код и превращает это во что-то, что определенно не является визуально приятным. Операторы try-кроме и дополнительные if делают код менее читабельным и структурированным.

Интересно, это потому, что я неправильно использую или чрезмерно обрабатываю ошибки, или это неизбежно? Какие-нибудь подсказки или уловки, чтобы держать это красивым?

Ответы [ 4 ]

5 голосов
/ 11 июля 2010

Сложно дать вам общий ответ на этот вопрос, поскольку существует много разных случаев обработки ошибок, и поэтому существует много разных подходов для решения этой проблемы.Если бы вы опубликовали несколько реальных примеров, вы, вероятно, получили бы здесь много советов о том, как улучшить ваш код.

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

РЕДАКТИРОВАТЬ: один простой прием:

Я избегаюписать проверки ошибок, как это:

 int MyFunction()
 {
    if( ErrorCheck1Passes())
    {
       if( ErrorCheck2Passes())
       {
           if( ErrorCheck3Passes())
           {
                callSomeFunction(...);
           }
           else
              return failureCode3;
        }
        else
           return failureCode2;
    }
    else
       return failureCode1;

    return 0;
 }

Я предпочитаю

int MyFunction()
{
   if( !ErrorCheck1Passes())
       return failureCode1;
   if( !ErrorCheck2Passes())
       return failureCode2;
   if( !ErrorCheck3Passes())
       return failureCode3;

   callSomeFunction(...);
   return 0;
}
1 голос
/ 11 июля 2010

Вы заново открыли основную причину, по которой Дон Кнут изобрел грамотное программирование : для обработки ошибок слишком часто бывает неясным основной алгоритм.Если вам повезет, у вас есть несколько языковых конструкций, которые предлагают вам некоторую гибкость.Например, исключения могут позволить вам переместить обработку ошибок в другое место, или функции первого класса могут позволить переместить обработку ошибок вокруг и сократить проверки if-then-else до вызова функции.

Если выЗастряв в языке без этих функций, таких как C, вам может понадобиться инструмент для грамотного программирования.Инструменты грамотного программирования являются препроцессорами, но вся их задача - помочь вам сделать ваш код более читабельным.У них есть небольшая, но бешеная подписка, и вы сможете найти некоторые рекомендации в Интернете и в опубликованных статьях.

1 голос
/ 11 июля 2010

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

Это может иметь больше смысла, если вы больше работаете над внешним интерфейсом приложения, где, с точки зрения пользователя, не все возможные исключения должны доходить до своего уровня. В контексте некоторых классов нормально иметь надежный внутренний способ обработки ошибок и дальнейшего продвижения.

Так, например, у меня могут быть такие функции, как

SaveSettingsSafe();
// 'Safe' in the sense that all errors are handled internally before returning
0 голосов
/ 11 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...