Файл: Руководство по стилю программирования и конструированию по.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 873
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
276
ЧАСТЬ III Переменные
Документируйте очень короткие имена прямо в коде при помощи таб-
лиц Если язык позволяет использовать только очень короткие имена, включай- те в код таблицу, характеризующую суть переменных. Включайте ее как коммен- тарий перед соответствующим блоком кода, например:
Пример хорошей таблицы преобразования (Fortran)
C *******************************************************************
C Translation Table
C
C Variable Meaning
C ———— ———-
C XPOS x-Coordinate Position (in meters)
C YPOS Y-Coordinate Position (in meters)
C NDSCMP Needs Computing (=0 if no computation is needed;
C =1 if computation is needed)
C PTGTTL Point Grand Total
C PTVLMX Point Value Maximum
C PSCRMX Possible Score Maximum
C *****************************************************************
Может показаться, что этот способ устарел, но не далее чем в середине 2003 г. я работал с клиентом, который использовал программу на языке RPG, включавшую несколько сотен тысяч строк кода. Длина имен переменных в ней была ограни- чена 6 символами. Подобные проблемы все еще всплывают время от времени.
Указывайте все сокращения в проектном документе «Стандартные аб-
бревиатуры» Применение аббревиатур сопряжено с двумя распространенны- ми факторами риска:
쐽
аббревиатура может оказаться непонятной программисту, читающему код;
쐽
программисты могут сократить одно и то же имя по-разному, что вызывает ненужное замешательство.
Для предотвращения этих потенциальных проблем вы можете создать документ
«Стандартные аббревиатуры», описывающий все аббревиатуры конкретного про- екта. Сам документ может быть файлом текстового редактора или электронной таблицей. При работе над очень крупным проектом им может быть база данных.
Этот документ следует зарегистрировать в системе управления версиями и изме- нять его каждый раз, когда кто-то создает новую аббревиатуру. Элементы доку- мента должны быть сортированы по полным словам, а не по аббревиатурам.
Может показаться, что эта методика связана с большим объемом дополнительной работы, но на самом деле она требует небольших усилий на начальном этапе,
предоставляя взамен механизм, помогающий эффективно использовать аббреви- атуры. Она устраняет первый из двух факторов риска, заставляя документировать все используемые аббревиатуры. Если программист не может создать новую аб- бревиатуру, не проверив документ «Стандартные аббревиатуры», не изменив его и снова не зарегистрировав в системе управления версиями, —
это хорошо. Это значит, что программисты будут создавать аббревиатуры, только когда будут чув- ствовать, что выгода от их создания стоит того, чтобы преодолеть все барьеры,
связанные с их документированием.
1 ... 31 32 33 34 35 36 37 38 ... 104
ГЛАВА 11 Сила имен переменных
277
Вероятность создания избыточных аббревиатур также снижается. Программист,
желающий сократить какое-то слово, должен будет проверить документ и ввести новую аббревиатуру. Если это слово уже было сокращено, программист заметит это и будет использовать существующую аббревиатуру.
Этот совет иллюстрирует различие между удобством написания кода и удобством его чтения. Очевидно, что рассмотренный подход делает на- писание кода
менее удобным, однако на протяжении срока службы сис- темы программисты проводят гораздо больше времени именно за чтением кода,
которое благодаря этому подходу облегчается. Когда вся пыль осядет, вполне может оказаться, что этот подход облегчил и написание кода.
Помните, что имена создаются в первую очередь для программистов,
читающих код Прочитайте собственный код, который вы не видели минимум шесть месяцев, и обратите внимание на те имена, суть которых вы не можете понять с первого взгляда. Измените подходы, подталкивающие к выбору таких имен.
11.7. Имена, которых следует избегать
Ниже я описал некоторые типы имен, которых следует избегать.
Избегайте обманчивых имен или аббревиатур Убедитесь в том, что имя не является двусмысленным. Скажем,
FALSE обычно является противоположностью
TRUE, и использовать такое имя как сокращение фразы «Fig and Almond Season»
было бы глупо.
Избегайте имен, имеющих похожие значения Если есть вероятность, что вы можете спутать имена двух переменных и это не приведет к ошибке компиляции,
переименуйте обе переменных. Например, пары имен
input и inputValue, recordNum
и
numRecords или fileNumber и fileIndex так похожи с семантической точки зре- ния, что если вы будете использовать их в одном фрагменте кода, то сможете легко их спутать, внеся в код неуловимые ошибки.
Избегайте переменных, имеющих разную суть, но по-
хожие имена Если у вас есть две таких переменных, по- пытайтесь переименовать одну из них или изменить аб- бревиатуры. Избегайте имен вроде
clientRecs и clientReps. Они различаются только одной буквой, и это трудно заметить.
Выбирайте имена, различающиеся хотя бы двумя буквами или первой/последней буквой. Имена
clientRecords и cli-
entReports лучше, чем первоначальные имена.
Избегайте имен, имеющих похожее звучание, таких как wrap и rap Когда вы пытаетесь обсудить код с другими людьми, в разговор иногда вмешиваются омонимы. Так, одним из самых забавных аспектов экстремального программиро- вания (Beck, 2000) является слишком хитрое использование терминов «Goal Donor»
и «Gold Owner»
1
, которые звучат практически одинаково. В итоге разговор может принять подобный оборот:
Перекрестная ссылка Техниче- ски подобное различие между сходными именами переменных называется «психологической дистанцией» (см. подраздел
«Психологическая дистанция»
раздела 23.4).
1
Что буквально переводится как «донор цели» и «владелец золота». В экстремальном програм- мировании так называют роли людей, соответственно ставящих перед разработчиками задачу и финансирующих проект. —
Прим. перев.
278
ЧАСТЬ III Переменные
— Я только что разговаривал с Goal Donor.
— Что ты сказал? «Gold Owner» или «Goal Donor»?
— Я сказал «Goal Donor».
— Что?
— GOAL - - - DONOR!
— Ясно, Goal Donor. Не нужно кричать, черт возьми (Goll’ Darn it).
— Какое еще «золотое кольцо» (Gold Donut)?
Как и в случае непроизносимых аббревиатур, используйте для исключения подоб- ных ситуаций телефонный тест.
Избегайте имен, включающих цифры Если наличие цифр в именах действи- тельно имеет смысл, используйте вместо отдельных переменных массив. Если этот вариант неуместен, цифры в именах еще более неуместны. Например, избегайте имен
file1 и file2 или total1 и total2. Почти всегда можно найти более разумный способ проведения различия между двумя переменными, чем дополнение их имен цифрами. В то же время я не могу сказать, что цифры
нельзя использовать вооб- ще. Некоторые сущности реального мира (такие как шоссе 66) изначально вклю- чают цифры. И все же перед созданием подобного имени подумайте, есть ли луч- шие варианты.
Избегайте орфографических ошибок Вспомнить правильные имена перемен- ных и так довольно трудно. Требовать запоминания «правильных» орфографиче- ских ошибок — это уж слишком. Например, если вы решите сэкономить три бук- вы и замените слово
highlight на hilite, программисту, читающему код, будет нео- писуемо трудно вспомнить, на что же вы его заменили. На
highlite? hilite? hilight?
hilit? jai-a-lai-t? Кто его знает.
Избегайте слов, при написании которых люди часто допускают ошиб-
ки Absense, acummulate, acsend, calender, concieve, defferred, definate, independance,
occassionally, prefered, reciept, superseed и многие другие орфографические ошиб- ки весьма распространены в англоязычном мире. Список подобных слов можно найти в большинстве справочников по английскому языку. Не используйте такие слова в именах переменных.
Проводите различие между именами не только по регистру букв Если вы программируете на C++ или другом языке, в котором регистр букв играет роль,
вы можете поддастся соблазну сократить понятия
fired, final review duty и full revenue
disbursal соответственно до frd, FRD и Frd. Избегайте этого подхода. Хотя эти имена уникальны, их связь с конкретными значениями произвольна и непонятна. Имя
Frd может с тем же успехом обозначать final review duty, а FRD — full revenue disbursal,
и никакое логическое правило не поможет вам или кому-то другому запомнить,
что есть что.
Избегайте смешения естественных языков Если в проекте участвуют програм- мисты разных национальностей, обяжите их именовать все элементы программы,
используя один естественный язык. Понять код другого программиста непросто; а код, написанный на юго-восточном диалекте марсианского языка, — невозможно.
Еще более тонкая проблема связана с наличием разных диалектов английского языка. Если в проекте участвуют представители разных англоязычных стран, сде-
ГЛАВА 11 Сила имен переменных
279
лайте стандартом тот или иной вариант английского языка, чтобы вам не при- шлось вспоминать, как называется конкретная переменная: «color» или «colour»,
«check» или «cheque» и т. д.
Избегайте имен стандартных типов, переменных и методов Все языки программирования имеют зарезервированные и предопределенные имена. Про- сматривайте время от времени списки таких имен, чтобы не вторгаться во владе- ния используемого языка. Так, следующий фрагмент вполне допустим при про- граммировании на PL/I, но написать ТАКОЕ может только идиот со справкой:
if if = then then then = else;
else else = if;
Не используйте имена, которые совершенно не связаны с тем, что пред-
ставляют переменные Использование имен вроде margaret и pookie практи- чески гарантирует, что никто другой их не поймет. Не называйте переменные в честь девушки, жены, любимого сорта пива и т. д., если только девушка, жена или сорт пива не являются представляемыми в программе «сущностями». Но даже тогда вы должны понимать, что все в мире изменяется, поэтому имена
девушка, жена и
любимыйСортПива гораздо лучше!
Избегайте имен, содержащих символы, которые можно спутать с дру-
гими символами Помните, что некоторые символы выглядят очень похоже. Если два имени различаются только одним таким символом, вы можете столкнуться с проблемами. Попробуйте, например, определить, какое из имен является лишним в каждой тройке:
eyeChartl eyeChartI
eyeChartl
TTLCONFUSION
TTLCONFUSION
TTLC
0
NFUSION
hard2Read hardZRead hard2Read
GRANDTOTAL
GRANDTOTAL
6RANDTOTAL
ttl5
ttlS
ttlS
В число пар символов, которые трудно различить, входят пары (1 и l), (1 и I),
(. и ,), (0 и O), (2 и Z), (; и :), (S и 5) и (G и 6).
Действительно ли важны подобные детали? Да! Джеральд
Вайнберг пишет, что в 1970-х из-за того, что в команде
FORMAT языка Fortran вместо точки была использована за- пятая, ученые неверно рассчитали траекторию космичес- кого корабля и потеряли космический зонд стоимостью 1,6
млрд долларов (Weinberg, 1983).
Контрольный список: именование переменных
Общие принципы именования переменных
Описывает ли имя представляемую переменной сущность полно и точно?
Характеризует ли имя проблему реального мира, а не ее решение на языке программирования?
Перекрестная ссылка Вопросы,
касающиеся использования дан- ных, приведены в контрольном списке в главе 10.
http://cc2e.com/1191
280
ЧАСТЬ III Переменные
Имеет ли имя длину, достаточную для того, чтобы над ним не нужно было ломать голову?
Спецификаторы вычисляемых значений находятся в конце имен?
Используются ли в именах спецификаторы Count или Index вместо Num?
Именование конкретных видов данных
Выразительные ли имена присвоены индексам циклов (более ясные, чем i,
j и k, если цикл содержит более одной-двух строк или является вложенным)?
Всем ли «временным» переменным присвоены выразительные имена?
Можно ли по именам булевых переменных понять, какой смысл имеют зна- чения «истина» и «ложь»?
Включают ли имена элементов перечислений префикс или суффикс, опре- деляющий принадлежность элемента к перечислению — например, префикс
Color_ в случае элементов Color_Red, Color_Green, Color_Blue и т. д.?
Именованные константы названы в соответствии с представляемыми абст- рактными сущностями, а не конкретными числами?
Конвенции именования
Проводит ли конвенция различие между локальными данными, данными класса и глобальными данными?
Проводит ли конвенция различие между именами типов, именованных кон- стант, перечислений и переменных?
Идентифицировали ли вы исключительно входные параметры методов, если язык не навязывает их идентификацию?
Постарались ли вы сделать конвенцию как можно более совместимой со стандартными конвенциями конкретного языка?
Способствует ли форматирование имен удобству их чтения?
Короткие имена
Стараетесь ли вы не сокращать имена без необходимости?
Избегаете ли вы сокращения имен только на одну букву?
Все ли слова вы сокращаете согласованно?
Легко ли произнести выбранные имена?
Избегаете ли вы имен, допускающих неверное прочтение или произношение?
Документируете ли вы короткие имена при помощи таблиц преобразования?
Распространенные проблемы именования. Избежали ли вы…
…имен, которые вводят в заблуждение?
…имен с похожими значениями?
…имен, различающихся только одним или двумя символами?
…имен, имеющих похожее звучание?
…имен, включающих цифры?
…имен, намеренно написанных с ошибками с целью сокращения?
…имен, при написании которых люди часто допускают ошибки?
…имен, конфликтующих с именами методов из стандартных библиотек или предопределенными именами переменных?
…совершенно произвольных имен?
…символов, которые можно спутать с другими символами?