Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / Питер_Гудлиф_Ремесло_программиста_Практика_написания_хорошего_кода.pdf
Скачиваний:
16
Добавлен:
19.04.2024
Размер:
9.23 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

2

Тонкий расчет

Расположение и представление исходного кода

В этой главе:

В чем важность представления кода и какое расположение считать хорошим

Как выбрать стиль расположения кода

Выработка стандарта кодирования

Религиозные войны – почему следует их избегать

Не судите по наружности, но судите судом праведным.

Иоанн 7:24

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

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

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

54m

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

Глава 2. Тонкий расчетClick

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

ставить скобки в C. Сомневаюсь, что кто%либо следовал тому стандар% ту, который был выработан в итоге.

Почему это так волнует людей? Как будет показано, представление оказывает очень сильное влияние на читаемость кода, и никто не захо% чет работать с кодом, который тяжело читать. Кроме того, представле% ние воспринимается очень субъективно и индивидуально: вам может не понравиться тот стиль, от которого я в восторге. Знакомый стиль вызывает ощущение комфортности, а непривычный раздражает.

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

Да в чем проблема?

Расположение и представление кода оказываются предметом разно% гласий в большинстве современных языков программирования. Про% извольное форматирование, позволяющее выразить свою художест% венную индивидуальность, вошло в моду в начале 1960%х годов с появ% лением Алгола: существовавшие к тому времени версии Fortran до% пускали меньше свободы в формате. В последующем лишь очень немногие языки отошли от такого подхода к свободе форматирования.

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

Несмотря на многочисленность вариантов выбора формата представ% ления кода, все они имеют лишь эстетическое значение. По определе% нию представление не имеет никакого синтаксического или семанти% ческого значения и игнорируется компилятором.

Тем не менее представление оказывает реальное влияние на качество кода. Понимание программистом кода при чтении зависит от его рас% положения. Последнее может выявлять структуру кода и облегчать понимание его работы. Разумеется, может происходить и обратное: смысл кода затеняется и запутывается. Как бы хорошо ни была спро% ектирована ваша программа, с ней будет неприятно работать, если она выглядит, как помойка. Однако плохое форматирование может не только мешать пониманию кода, но и скрывать имеющиеся в нем ошибки. В качестве простого примера приведем следующий код на C:

1Имеются в виду фигурные скобки { и }, весьма распространенные в языках

типа C.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

Знайтеm

своих клиентов

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

55Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

int error = doSomeMagicOperation(); if (error)

fprintf(stderr, "Error: exiting...\n"); exit(error);

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

Будучи сознательными мастерами и приверженцами высококачест% венного кода, мы стремимся к ясному представлению. При разработке программного обеспечения и без того есть на чем споткнуться, так не будем создавать дополнительные проблемы из%за представления кода.

Знайте своих клиентов

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

Вы сами

У меня такой плохой почерк, что иногда мне самому трудно его ра% зобрать. Это практически невозможно, если я не ставлю себе задачу писать разборчиво. То же самое происходит и с кодом. Созданное ва% ми должно быть понятно не только сразу после написания, но и по прошествии лет. Кто мог подумать, что придется вернуться к (отно% сительно) архаичному коду на COBOL, чтобы исправить в нем ошибки, связанные с Y2K?

Компилятор

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

Прочие лица

Это самая важная аудитория, интересы которой часто меньше всего учитываются.

Вам кажется, что хотя вы работаете в составе команды, никто нико% гда не станет смотреть ваш код. Это ошибочное мнение.

Вы пишете какой%то код для себя дома. Стоит ли заботиться о его кра% соте? Если «да», то в чем польза? В выработке качеств, которые дела% ют вас профессионалом. У вас появляется прекрасная возможность продемонстрировать настоящую дисциплину в проекте, когда никто не оказывает на вас давления. Это возможность выработать хорошие манеры. Если вы не справитесь с задачей в таких условиях, то неуди% вительно, что у вас не хватит дисциплины в реальных проектах.

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

56m

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

Глава 2. Тонкий расчетClick

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Ваш исходный код – это документ, который описывает создаваемую программу. Он должен быть понятен любому, кто захочет к ней сно% ва вернуться. Это может быть аудитор (рецензент) написанного ва% ми кода или тот, кто будет его сопровождать. Позаботьтесь о тех, кому придется читать ваш код – представьте себя на их месте.

Детали стиля представления формируются с учетом предполагаемой аудитории. Как может аудитория повлиять на расположение кода? Как ни удивительно, менее всего нас должен волновать компилятор. Его задача – игнорируя все лишние пробельные символы, заняться серьезным делом интерпретации синтаксиса. Представление не влия% ет на синтаксический смысл, и компилятор справится с самым урод% ливым расположением.

Расположение кода решает задачу демонстрации его логической струк# туры людям, читающим код. Это передача информации, и чем понят% нее код, тем лучше.

Поймите, кто реально станет читать ваш исходный код: другие программи& сты. Пишите с расчетом на них.

Что такое хорошее представление?

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

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

Единообразие

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

Отдельные правила представления должны быть внутренне непроти% воречивыми. Расположение фигурных и квадратных скобок и т. п. в различных ситуациях должно соответствовать единым правилам. Количество пробелов в отступах должно быть всегда одинаковым.

Керниган и Ричи, основоположники C, подчеркивают важность правильных отступов и затем говорят: «Положение скобок менее важно, хотя люди склонны проявлять фанатизм в таких вопросах.