защитные методы кодирования - PullRequest
16 голосов
/ 06 ноября 2008

С тех пор, как я впервые написал

if ($a = 5) {
   #  do something with $a, e.g.
   print "$a";
}

и прошел обычную головоломную сессию

  • почему результат всегда верен
  • почему $ a всегда 5

до тех пор, пока я не понял, я назначил 5 $, вместо сравнения.

Поэтому я решил написать такое условие выше как

 if (5 == $a)

другими словами:

всегда помещайте постоянное значение слева от оператора сравнения, что приводит к ошибке компиляции, если вы забудете добавить второй знак "=".

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

Какие защитные методы кодирования вы разработали?


Одна неделя спустя:

Большое «спасибо» всем, кто ответил или может добавить другой ответ в будущем.

К сожалению (или, скорее, к счастью!), Нет единого правильного ответа. Для этого мой вопрос был широким, спрашивая больше мнений или опыта, а не фактов.

Ответы [ 15 ]

16 голосов
/ 06 ноября 2008

Всегда используйте фигурные скобки:

if(boolean)
    oneliner();
nextLineOfCode();

не совпадает с:

if(boolean)
{
    oneliner();
}
nextLineOfCode();

Если oneliner () является функцией #defined, и она не определена, то ваша следующая строка кода внезапно становится объектом if (). То же самое относится к циклам for и т. Д. С фигурными скобками следующий фрагмент кода никогда не становится непреднамеренным условием if / for и т. Д.

14 голосов
/ 06 ноября 2008

Лучшие 3 метода защитного кодирования, которые я использую:

  1. модульное тестирование
  2. модульное тестирование
  3. модульное тестирование

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

13 голосов
/ 06 ноября 2008

Это простой и очевидный вариант, но я НИКОГДА никогда НИКОГДА не повторяю одну и ту же строковую константу дважды в своем коде, потому что я ЗНАЮ, что если я это сделаю, то я буду писать одну из них неправильно :) Используйте константы, люди!

8 голосов
/ 06 ноября 2008

При сравнении строки с константой напишите

if ("blah".equals(value)){}

вместо

if (value.equals("blah")){}

для предотвращения исключения NullPointerException. Но это единственный раз, когда я использую предложенный стиль кодирования (причина "если (a = 1) ..." невозможна в Java).

8 голосов
/ 06 ноября 2008

Всегда ставьте фигурные скобки после if / for / while ... даже если после них есть только один оператор. Кстати, Д. Крокфорд считает, что это тоже лучше: Необходимые блоки

7 голосов
/ 06 ноября 2008

Одна из вещей, которые я всегда пытаюсь запомнить, когда я нахожусь в мире Javascript, - всегда начинать возвращаемое значение функции в той же строке, что и ключевое слово возврата.

function one(){
    return {
        result:"result"
    };
}

function two(){
    return 
    {
        result:"result"
    };
}

Эти 2 функции не будут возвращать одно и то же значение. Первая функция вернет объект со свойством результирующие свойства, установленное на «результат». Вторая функция вернет undefined. Это действительно простая ошибка, и это происходит из-за чрезмерно усердной стратегии вставки полуколон в Javascript. Точка с запятой является полуобязательной в Javascript, и из-за этого движок Javascript будет добавлять полуконы, где он считает, что так и должно быть. Поскольку return на самом деле является допустимым оператором, точка с запятой будет вставлена ​​после оператора return, а остальная часть функции будет по существу проигнорирована.

6 голосов
/ 06 ноября 2008

Из моего блога:

  1. Думай позитивно и возвращайся рано, избегай глубокого вложения. Вместо

    if (значение! = Ноль) { ... сделать что-то со значением ... } вернуться

    запись

    if (value == null) { вернуть } ... сделать что-то со значением ...

  2. Избегайте «строковых констант» (т. Е. Один и тот же текст в кавычках в нескольких местах). Всегда определяйте действительную константу (с именем и необязательным комментарием, что это значит) и используйте ее.

5 голосов
/ 06 ноября 2008

Лично мне не нравится этот защитный стиль, он делает код сложным для чтения.

Уровень предупреждения компилятора VC 4 обнаружит эту (возможную) ошибку.
«предупреждение C4706: назначение в условном выражении»

Вы можете включить только это конкретное предупреждение компилятора на любом уровне:

#pragma warning(3,4706)
5 голосов
/ 06 ноября 2008
  • Всегда инициализировать переменные
  • Используйте const везде, где только можно (без использования mutable)
  • Избегайте голого динамического выделения памяти или других ресурсов
  • Всегда используйте фигурные скобки
  • Сценарии использования кода и тесты для любого класса перед реализацией кода
  • Включите как можно больше полезных предупреждений (-Wall -Wextra -ansi -pedantic -Werror как минимум)
  • Используйте самый простой инструмент, который решает проблему (в моей текущей среде это bash -> grep -> awk -> Python -> C ++).
4 голосов
/ 06 ноября 2008

Я перестал использовать языки, на которых можно сделать

if a = 5: print a

Это сэкономило мне кучу головных болей =).

На более серьезной ноте ... Теперь я всегда пишу фигурные скобки сразу после того, как пишу свои циклы if s и for, а затем заполняю их. Это гарантирует, что мои скобки всегда выровнены.

...