Don’t write what you don’t need

Опять программирование. Когда пишешь одну функцию, часто подмывает заодно написать с десяток – и обратное преобразование, и с параметром, и Анси-версию, чтоб уж сразу была библиотечка всего такого на потом. Программисты обожают библиотечки. У каждого программиста своя работа со строками и своё буферизованное чтение в запасах.

Но понемногу я пришёл к выводу, что это вредно.

Даже не тем, что тратится лишнее время. Функции могут однажды пригодиться, и потом, это мелочи, тут нечто гораздо более страшное.

Написав ненужный код, вы его не тестируете. Его не на чем тестировать: в текущем проекте он нигде не используется, ведь если бы он использовался, то это был бы нужный код! И если вы серьёзно хотите, чтобы я поверил, что вы оторвётесь от работы над проектом и напишете юнит-тест для каждой функции, которые вам сейчас толком и не нужны, то тренируйтесь врать. Я – точно не напишу. Мне лень.

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

Возможно, вы узнаете об этом через год, отлаживая загадочные баги в новой программе, использующей старую, давно проверенную библиотеку. Наткнётесь на ошибку в коде функции, удивитесь: “Да как оно вообще работало?” А оно и не работало.
Даже если вы не тестируете новые функции специально, нужные функции сами собой проверяются в ходе работы программы. Пусть это не полноценное тестирование, но большинство путей кода всё-таки оказываются покрыты. Дополнительные же функции не вызывались ни разу, поэтому баг может быть где угодно, даже на самом виду.

Но мало того, когда вы захотите исправить ошибку, вам вдруг станет страшно. Вы подумаете: “А что, если?..”

Что, если эта функция кем-то используется? Ведь неспроста она оказалась в библиотеке. Никто не будет писать функции просто так. Значит, какой-то из проектов вызывает эту функцию и притом работает.
Если вы её сейчас исправите – не сломается ли он?
Да, у вас тут индексация с нуля, а не с единицы, как сказано в комментарии. Вызывая функцию правильно, получить хороший результат невозможно. Значит, кто-то вызывает её неправильно, по ошибке передаёт как раз нужный ошибочный индекс. Если вы функцию почините, тот проект сломается.
Неизвестно, какой. Неизвестно, когда и где. Но что сломается – это почти наверняка.

Нет такого программиста, которому нравилось бы наугад портить свои проекты. И вы откатываете правки и оставляете функцию сломанной, а рядом пишете новую, functionName2(). На этот раз правильную.
И заодно ещё что-нибудь.

2 комментария

  1. 00000
    27 December, 2012 в 03:01 | Ссылка

    я конечно не доктор но по моему есть юнит тестинг для этого

    1. 27 December, 2012 в 11:06 | Ссылка

      Так я про него написал!

    Напишите комментарий:

    Если хотите, можно залогиниться.

    *