Ответ 1
Попросите их написать модульные тесты для каждого случая.
Я часто обнаружил, что когда программист или тот, кто назначает задачу, на самом деле не понимает, как может работать решение, они вроде бы случайно добавляют материал до тех пор, пока он не будет работать.
<сильные > Примеры:
Перекрашивание окна, которое по какой-то причине не раскрашено, как хотелось бы программисту:
Invalidate();
Revalidate();
ProcessMessages();
Update();
Repaint();
Repaint();
ProcessMessages();
Repaint();
Чрезмерная настороженность:
function test1(x: boolean)
begin
select case x
true: // do something
false: // do something else
else
raise Exception.Create("Invalid value.") // just to be sure
end;
end;
function test2(x: Integer);
var
y: Integer;
begin
y = Abs(x);
if y >= 0 then
begin
// do something
end;
end;
Хотя особенно чрезмерно осторожные методы кодирования приводят к предупреждениям компилятора на большинстве языков, я действительно видел все вышеперечисленное в производственном коде!
В большинстве случаев этот вид кодирования защищается программистом и/или боссом. Причины всегда сводятся к этому ответу:
К сожалению, у меня нет оснований не делать этого, хотя я по-прежнему считаю, что это действительно плохой стиль, который может иметь плохие последствия.
Есть ли серьезные факты, которые я могу представить, что этот стиль имеет плохие последствия в конце концов?
EDIT: Благодарим вас за хорошие предложения, чтобы избавиться от этого стиля. Но меня все еще интересуют причины. Я могу представить своим сотрудникам объяснение и, возможно, убедить их, , почему это плохо, и в их интересах быть параноидальным.
Попросите их написать модульные тесты для каждого случая.
Настройте 100% -ный охват веток для модульных тестов или сбои сборки. Он не сможет получить test1, чтобы выбросить исключение, или оценить условие в test2 на false.
Программирование по совпадению http://www.pragprog.com/the-pragmatic-programmer/extracts/coincidence
Предположим, что Fred задано программирование. Фред в каком-то коде, пытается, и, похоже, работает. Фред использует еще один код, пытается его, и он все еще работает. После нескольких недель кодирования таким образом, программа внезапно перестает работать, и после нескольких часов попыток исправить это он все равно не знает, почему. Фред вполне может потратить значительное количество времени на то, чтобы преследовать этот кусок кода, не имея возможности его исправить. Независимо от того, что он делает, он просто никогда не работает правильно.
Фред не знает, почему код терпит неудачу, потому что он не знал, почему он работал в первую очередь. Казалось, это сработало, учитывая ограниченный "тест", который сделал Фред, но это было просто совпадением. Фред обвинил фальшивую уверенность в забвении. Теперь самые умные люди могут знать кого-то вроде Фреда, но мы знаем лучше. Мы не полагаемся на совпадения - не так ли?
Да, это проблема. По крайней мере, этот тип программирования делает код трудным для понимания и поддержки. Если есть реальный случай, который требует проверки или ловли, то часто бывает трудно проверить, действительно ли он протестирован. Даже простая задача, например, выполнить код с отладчиком, может стать утомительной.
Я боролся с младшим разработчиком, который долгое время писал такой код. Я не мог убедить его здравомыслящими аргументами в том, что пишущие избыточные проверки или дополнительные шаги были не такими, как защитное программирование. В конце концов, я нашел решение:
Я сказал разработчику, что производительность является приоритетом для его части кода. Оказалось, что самый простой способ быстро повысить производительность - это удалить дополнительные проверки и повторные повторные инициализации;-). Этот трюк работал как-лечить, и вскоре он был обучен навыкам "защитного кодирования".
Repaint(); Repaint(); ProcessMessages(); Repaint();
Это просто страшное программирование. Здесь следует применять обзоры и тренинги кода.
Ваша точка верна, но, насколько я заметил, такие вещи ТАКЖЕ вызваны отсутствием надлежащих технических знаний. Я имею в виду, я натолкнулся на код, который просто глупый. Как кто-то может написать что-то вроде этого -
private bool IsValid(bool isValid)
{
if(isValid == true) return true;
else if(isValid == false) return false;
}
То же самое касается обоих приведенных вами примеров. Программист МОЖЕТ не знать, что делает каждый вызов функции (в первом случае) или каковы основные основы случая switch
(во втором). Не правда ли?
Причины, по которым чрезмерная осторожность плоха, включают:
Согните ухо руководителя/менеджера вашей команды и посмотрите, можете ли вы заставить их ввести обзоры кода и/или парное программирование.
Первый представленный пример - классический случай Программирование по совпадению, поэтому у вас есть боеприпасы против этого.
Случаи 2 и 3 просто глупы в большинстве контекстов, если только они не являются тестовыми примерами для какого-то бета-программирования или чего-то, в котором реализация ABS и boolean может иметь поведение undefined.
Это действительно раздражающая проблема, с которой я столкнулся несколько раз. Пытаться убедить кого-то в том, что он представляет их различными принципами или, утверждая это, просто оказался разочаровывающим и бесплодным. В итоге я принял два подхода:
y = Abs (x); если y >= 0, то
совершенно разумно. запомнить → MIN_INT == abs (MIN_INT)
Есть только одно решение: Огоньте его.
Если он не умеет правильно программировать, зачем ему продолжать тратить драгоценное время и расходы? Стрельба по нему - единственный способ заставить его пересмотреть свои привычки. В бизнесе вы не можете проявить сочувствие или сочувствие. Вы не должны дружить. Вы там за зарабатываете деньги.
Если ваш разработчик недостаточно хорош, просто нанять лучшего. Это, как экономика должна работать.
Играйте в свою игру:
Если они не могут видеть, что некоторые из этих тестов немного сумасшедшие, тогда нет надежды.
Я немного писал о защитном программировании:
http://www.francisfish.com/what_defensive_programming_is_and_isnt_logging_the_right_t.htm
Я думаю, что приведенные выше предложения о принуждении людей проверять все пути кода вполне допустимы и будут работать, если они будут людьми.
Каждая строка кода - это возможность для ошибок. Написание строк кода, которые не влияют на поведение программы, увеличивает количество ошибок без каких-либо преимуществ.
Я бы подождал, пока не возникнет ошибка, которая напрямую связана с таким кодом, а затем снова аргументируйте мое дело. Намного легче с доказательствами в руке.
Если они так волнуются не будет работать в первый раз, тогда они должны переписать что-то пока они не убедятся, что они будут работать.
Если есть разумный шанс, что что-то не будет работать в первый раз кругом, и там ничто не может сделать, чтобы улучшить шансы на это то правильное решение использовать try/catch - не просто вызов это дважды.
Украдите половину своей ОЗУ после часов. Если между каждой изюминкой бессмысленного кода и сбойным сообщением, полученным после их компиляции и запуска, требуется около минуты, они не могут не думать о том, почему возникают проблемы.