Код, Который Невозможно Поддерживать

Вольный перевод с сокращениями первой части эссе «Неподдерживаемый код».

Именование переменных — довольно тривиальная тема (хотя и забавно изложенная), но без этой части эссе было бы неполным.



Пролог

Это мое самое популярное эссе.

Удивительно, как много людей не понимают, что это шутка.

Это эссе написано с целью создания рабочих мест для Java-программистов.

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

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

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



Общие принципы

Quidquid latin dictum sit, altum sonatur. То, что сказано на латыни, звучит впечатляюще.

Чтобы помешать программисту, который сопровождает ваш код (далее — «мейнтейнер»), вы должны понимать, как он думает. У него есть ваш огромный код, и у него нет времени его прочитать, не говоря уже о том, чтобы понять.

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

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

Ваша цель — максимально затруднить ему поиск нужного ему кода, а главное — сделать так, чтобы он не мог игнорировать ни один фрагмент кода.

Программисты тешат себя иллюзией соглашений.

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

Вы можете подумать, что любая особенность языка делает код неподдерживаемым, но это не совсем так; только если вы используете его правильно.



Именование

— Когда я употребляю слово, — презрительно сказал Шалтай-Болтай, — оно означает только то, что я имею в виду — не больше и не меньше.

Большая часть искусства написания необслуживаемого кода — это присвоение имен переменным и методам.

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

1. Однобуквенные имена переменных.

Если вы назовете переменные a, b, c, их будет невозможно найти в простом текстовом редакторе.

К тому же никто не догадается, для чего они нужны.

Если кто-нибудь упомянет о нарушении традиции вызова счетчиков циклов i, j и k, почитаемой со времен FORTRAN, путем замены их на ii, jj и kk, упомяните, что испанская инквизиция сделала с еретиками.

Напротив, используйте имена i, j и k для всего, кроме счетчиков циклов.

2. Креативные опечатки Если вам необходимо использовать описательные имена, напишите их с ошибками.

Не все: ошибка в одном имени из логической пары (например, SetPintleOpening и SetPintalClosing) фактически исключает использование grep или средств поиска среды разработки.

Добавляйте интернационализацию на свой вкус: пишите тори или тори в зависимости от локализации.

3. Будьте абстрактны Используйте абстрактные слова и понятия (это, все, данные, дескриптор, материал, делайте, подпрограмма, выполнение), а также числа: рутинаX48, PerformDataFunction, DoIt, HandleStuff и do_args_method. 4. А.

К.

Р.

ОН.

ИМ.

/ пст скрщнми грзд интрсн Используйте сокращения, чтобы сократить код. Настоящие мачо никогда не объясняют аббревиатуры: понимание их у них в крови.

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

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

Также используйте американизмы (для нашей локали, видимо, рекомендуются украинизмы - прим.

) и сленговое написание.

5. Синонимы Найдите в словаре как можно больше синонимов одного и того же действия (например, показать, показать, представить).

Используйте их, чтобы указать на наличие разницы, хотя на самом деле ее нет. Напротив, используйте одно и то же слово для обозначения существенно разных функций (например, «печать» означает «печать чернил на бумаге», «запись в файл» и «вывод на экран»).

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

Написание глоссария является непрофессиональным нарушением принципа структурного проектирования, известного как «сокрытие информации».

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

Пример взят из руководства Ant 1.6.5: «basedir: абсолютный путь к Basedir проекта (задан в атрибуте Basedir проекта)».

Читателю пока непонятно, что такое Basedir, хотя он может предположить, что это абсолютный путь, несмотря на примеры, в которых он начинается с .

, то есть он относительный.

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

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

Если вы вынуждены их использовать, жалуйтесь, что они выглядят по-детски и непрофессионально, и что эти примеры, похоже, — все, на что способен продукт. Но ведь вы же хотите не научить, а впечатлить читателя, чтобы он сразу освоил все возможности программы! Люди уважают только то, что слишком абстрактно для понимания.

В конце концов, ни один ученый никогда не был уличен в том, что он приводил примеры.

7. Множественное число по правилам других языков.

Отлично подходит Эсперанто , клингонский язык И Вестрон .

В псевдоэсперанто множественное число образуется добавлением oj. Таким образом вы сохраните мир во всем мире.

8. ПРОПИСНЫЕ РЕГИСТРЫ Произвольно преобразовать первую букву слога, а также другие буквы в верхний регистр.

9. Повторное использование имен Если синтаксис языка позволяет, присваивайте классам, методам, переменным-членам, параметрам, глобальным и локальным переменным одинаковые имена.

Целесообразно повторно использовать локальные переменные внутри блоков {}.

Это необходимо для того, чтобы специалист по сопровождению тщательно проверял область действия каждой переменной.

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

10. Акцентированные буквы/расширенный ASCII. Если ваша среда разработки позволяет это, используйте буквы с диакритическими знаками в именах переменных.

Во многих текстовых редакторах такие буквы сложно отличить от обычных.

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

11. Ограничения длины имени компилятора Если компилятор различает только первые, скажем, 8 букв имени, измените окончания, например, var_unit_update() в одном случае и var_unit_setup() в другом.

Компилятор будет рассматривать оба имени как var_unit. 12. Подчеркивание — ваш друг Используйте _ и __ в качестве имен переменных.

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

13. Вавилонская башня Случайным образом смешивайте несколько языков (человеческих или компьютерных).

Человеческие языки могут использоваться в комментариях и в именах переменных (формировать их из английского названия сущности или из русской транслитерации).

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

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

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

Названия математических символов хорошо работают:

openParen = ( slash + asterix ) / equals;

или имена с сильным эмоциональным подтекстом:

marypoppins = ( superman + starship ) / god;

15. Скажите «нет» соглашениям Игнорируйте общие соглашения, регулирующие внешний вид кода, в частности Соглашения о кодировании Sun И Венгерская нотация .

К счастью, компилятор на это не отреагирует. Альтернативно, вы можете придумать свои собственные соглашения и обвинять всех остальных в том, что они их не используют. 16. Подобные символы В большинстве шрифтов есть пары символов, имеющих схожий стиль: l и 1, 0 и O, g и q, m и rn и т. д. Используйте их! Исключите из использования любые шрифты, в которых эти символы сильно различаются.

17. Запутанные названия методов Убедитесь, что каждый метод делает немного меньше или немного больше, чем обещает его название.

Например, метод isValid(x) может иметь побочный эффект записи x в базу данных в двоичной форме.

18. Отсылки к шедеврам мировой культуры.

Вместо синего назовите константу 0x0204FB LancelotsFavouriteColour. Этот цвет выглядит точно так же, как обычный синий, и дежурному будет сложно определить цветовой код. Конечно, только человек, свободно владеющий Монти Пайтоном и Святым Граалем, мог бы догадаться, что любимый цвет Ланселота — синий.

С другой стороны, если сопровождающий не может даже цитировать по памяти фильмы Монти Пайтона, что он вообще делает в программировании? 19. Красочные развлечения Само собой разумеется, что вместо названий цветов следует использовать их числовые значения.

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

Ни один нормальный человек без калькулятора не сможет расшифровать число 132347 как синее.

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

Так, например, 808000 на самом деле — это 0x0c5440. Вы также можете поэкспериментировать с переименованием цветов: мало кто знает, как на самом деле выглядят красновато-коричневый, бирюзовый и папайякип, что оставляет место для переназначения цветовых констант. 20. Достижения передовой психологии.

Помните, что человеческий мозг может комфортно обрабатывать не более 7 единиц информации одновременно? Воспользуйтесь этим.

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

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

Теги: #неподдерживаемый код #обфускация #плохой совет #сарказм #GTD

Вместе с данным постом часто просматривают: