Файл: Руководство по стилю программирования и конструированию по.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 870
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
В табл. 11-3, 11-4 и 11-5 описаны конвенции именования для языков C, C++, Java и Visual Basic, основанные на уже известных вам принципах. Использовать имен- но эти конвенции не обязательно, однако они помогут вам понять, что может включать неформальная конвенция именования.
270
ЧАСТЬ III Переменные
Табл. 11-3. Пример конвенции именования для языков C++ и Java
Сущность
Описание
ClassName
Имена классов начинаются с заглавной буквы и включают буквы обоих регистров.
TypeName
Имена типов, в том числе перечислений и типов, определяе- мых при помощи директив
typedef, начинаются с заглавной буквы и включают буквы обоих регистров.
EnumeratedTypes
Кроме предыдущего правила, имена перечислений всегда име- ют форму множественного числа.
localVariable
Имена локальных переменных начинаются со строчной буквы и включают буквы обоих регистров. Имя должно характеризо- вать сущность, представляемую переменной, и не должно зави- сеть от фактического типа переменной.
routineParameter
Имена параметров методов форматируются так же, как имена локальных переменных.
RoutineName()
Имена методов включают буквы обоих регистров (об удачных именах методов см. раздел 7.3).
m_ClassVariable
Имена переменных-членов, доступных только методам класса,
дополняются префиксом
m_.
g_GlobalVariable
Имена глобальных переменных дополняются префиксом g_.
CONSTANT
Имена именованных констант включают
ТОЛЬКО_ЗАГЛАВ-
НЫЕ_БУКВЫ.
MACRO
Имена макросов включают
ТОЛЬКО_ЗАГЛАВНЫЕ_БУКВЫ.
Base_EnumeratedType
Имена элементов перечислений дополняются именем самого перечисления в единственном числе:
Color_Red, Color_Blue.
Табл. 11-4. Пример конвенции именования для языка C
Сущность
Описание
TypeName
Имена типов начинаются с заглавной буквы и включают буквы обоих регистров.
GlobalRoutineName()
Имена открытых методов включают буквы обоих регистров.
f_FileRoutineName()
Имена методов, видимых в одном модуле (файле), дополняются префиксом
f_.
LocalVariable
Имена локальных переменных включают буквы обоих регист- ров. Имя должно характеризовать сущность, представляемую переменной, и не должно зависеть от фактического типа переменной.
RoutineParameter
Имена параметров методов форматируются так же, как имена локальных переменных.
f_FileStaticVariable
Имена переменных, видимых в одном модуле (файле), дополня- ются префиксом
f_.
G_GLOBAL_Glo-
Имена глобальных переменных дополняются префиксом
G_ и
balVariable
обозначением модуля (файла), в котором определена перемен- ная; обозначение модуля (файла) включает только заглавные буквы:
SCREEN_Dimensions.
ГЛАВА 11 Сила имен переменных
271
Табл. 11-4. (окончание)
Сущность
Описание
LOCAL_CONSTANT
Имена именованных констант, видимых в одном методе или модуле (файле), включают только заглавные буквы:
ROWS_MAX.
G_GLOBALCONSTANT
Имена глобальных именованных констант включают только заглавные буквы и дополняются префиксом
G_ и обозначением модуля (файла), в котором определена именованная константа;
обозначение модуля (файла) включает только заглавные буквы:
G_SCREEN_ROWS_MAX.
LOCALMACRO()
Имена макросов, видимых в одном методе или модуле (файле),
включают только заглавные буквы.
G_GLOBAL_MACRO()
Имена глобальных макросов включают только заглавные буквы и дополняются префиксом
G_ и обозначением модуля (файла),
в котором определен макрос; обозначение модуля (файла)
включает только заглавные буквы:
G_SCREEN_LOCATION().
Так как Visual Basic безразличен к регистру букв, для различения имен типов и переменных приходится применять специфические правила (табл. 11-5).
Табл. 11-5. Пример конвенции именования для языка Visual Basic
Сущность
Описание
C_ClassName
Имена классов дополняются префиксом
C_, начинаются с заглавной буквы и включают буквы обоих регистров.
T_TypeName
Имена типов дополняются префиксом T_, начинаются с заглавной буквы и включают буквы обоих регистров.
T_EnumeratedTypes
Кроме предыдущего правила, имена перечислений всегда имеют форму множественного числа.
localVariable
Имена локальных переменных начинаются со строчной буквы и включают буквы обоих регистров. Имя должно характеризо- вать сущность, представляемую переменной, и не должно зави- сеть от фактического типа переменной.
routineParameter
Имена параметров методов форматируются так же, как имена локальных переменных.
RoutineName()
Имена методов включают буквы обоих регистров (об удачных именах методов см. раздел 7.3).
m_ClassVariable
Имена переменных-членов, доступных только методам класса,
дополняются префиксом
m_.
g_GlobalVariable
Имена глобальных переменных дополняются префиксом
g_.
CONSTANT
Имена именованных констант включают
ТОЛЬКО_ЗАГЛАВНЫЕ_БУКВЫ.
Base_EnumeratedType
Имена элементов перечислений дополняются именем самого перечисления в единственном числе:
Color_Red, Color_Blue.
272
ЧАСТЬ III Переменные
11.5. Стандартизованные префиксы
Стандартизация префиксов обеспечивает лаконичный, но в то же время согласованный и понятный способ именова- ния данных. Самая известная схема стандартизации префик- сов — венгерская нотация — представляет собой набор де- тальных принципов именования переменных и методов
(а не жителей Венгрии!) , который когда-то широко применялся при программи- ровании для ОС Microsoft Windows. Сейчас венгерскую нотацию используют ред- ко, но ее суть — создание стандартизованного набора лаконичных точных абб- ревиатур — от этого не становится менее полезной.
Стандартизованный префикс состоит из двух частей: аббревиатуры типа, опреде- ленного пользователем (user-defined type, UDT), и семантического префикса.
Аббревиатура типа, определенного пользователем
Аббревиатура UDT обозначает тип объекта или переменной. Как правило, аббреви- атуры UDT служат для описания таких сущностей, как окна, области экрана и шриф- ты, но не предопределенных типов данных конкретного языка программирования.
Типы UDT описываются краткими кодами, которые вы создаете и стандартизиру- ете для конкретной программы. Коды — это мнемонические обозначения, такие как
wn в случае окна и scr в случае области экрана. В табл. 11-6 приведены при- меры UDT, которые можно было бы задействовать в текстовом редакторе.
Табл. 11-6. Примеры UDT текстового редактора
Аббревиатура UDT
Значение
ch
Символ (тип данных, используемый для представления символа документа, а не символ C++)
doc
Документ
pa
Абзац (paragraph)
scr
Область экрана
sel
Выбранный текст
wn
Окно
При работе с UDT следует также определить типы данных с именами, соответству- ющими аббревиатурам UDT. Таким образом, при использовании UDT из табл.
11-6 у вас получились бы подобные объявления данных:
CH chCursorPosition;
SCR scrUserWorkspace;
DOC docActive
PA firstPaActiveDocument;
PA lastPaActiveDocument;
WN wnMain;
Разумеется, аббревиатуры следует создавать для тех UDT, которые чаще всего встре- чаются в конкретной среде.
Дополнительные сведения О
венгерской нотации см. статью
«The Hungarian Revolution» (Si- monyi and Heller, 1991).
ГЛАВА 11 Сила имен переменных
273
Семантические префиксы
Семантические префиксы дополняют аббревиатуры UDT, характеризуя использо- вание переменной или объекта. В отличие от аббревиатур UDT, зависимых от конкретного проекта, семантические префиксы являются в некотором смысле стандартными (табл. 11-7).
Табл. 11-7. Семантические префиксы
Семантический
префикс
Значение
c
Количество (записей, символов и т. д.).
first
Элемент массива, обрабатываемый первым. Префикс
first
аналогичен префиксу
min, но связан с текущей операцией,
а не с самим массивом.
g
Глобальная переменная.
i
Индекс массива.
last
Элемент массива, обрабатываемый последним. Префикс
last
дополняет префикс
first.
lim
Верхняя граница обрабатываемого массива. Значение с пре- фиксом
lim уже не является допустимым индексом. Как и last,
префикс
lim дополняет префикс first. В отличие от префикса
last, используемого для представления последнего допустимого элемента, значение с
lim выходит за пределы массива.
В общем,
lim равняется last + 1.
m
Переменная уровня класса.
max
Индекс последнего элемента массива или другого списка.
Префикс
max связан с самим массивом, а не с выполняемыми над массивом операциями.
min
Индекс первого элемента массива или другого списка.
p
Указатель.
Семантические префиксы включают строчные буквы или буквы обоих регистров и по мере необходимости объединяются с аббревиатурами UDT и другими семанти- ческими префиксами. Например, имя переменной, определяющей первый абзац документа, включило бы аббревиатуру
pa, говорящую о том, что это абзац, и пре- фикс
first, показывающий, что это первый абзац. В итоге мы получили бы имя firstPa.
Индекс набора абзацев был бы назван
iPa; счетчик или число абзацев — cPa, а первый и последний абзацы текущего активного документа —
firstPaActiveDocument
и
lastPaActiveDocument соответственно.
Достоинства стандартизованных префиксов
Стандартизованные префиксы обеспечивают все общие преимущества конвенций именования, а также некоторые дополнительные. Стандарти- зация имен снижает число имен элементов программы или класса, ко- торые нужно помнить.
Стандартизованные префиксы позволяют уточнить имена, которые без этого ча- сто оказываются неточными. Особенно полезны точные различия между префик- сами
min, first, last и max.
274
ЧАСТЬ III Переменные
Стандартизованные префиксы делают имена более компактными. Так, переменной,
определяющей число абзацев, можно присвоить имя
cpa, а не totalParagraphs. Ин- декс массива абзацев можно назвать
ipa, а не indexParagraphs или paragraphsIndex.
Наконец, стандартизованные префиксы облегчают проверку правильности исполь- зования абстрактных типов данных, когда компилятор оказывается беспомощным.
Так, выражение
paReformat = docReformat скорее всего ошибочно, потому что аб- бревиатуры
pa и doc соответствуют разным UDT.
Главная ловушка при использовании стандартизованных префиксов — отказ от дополнения префикса выразительным именем переменной. Так, если имя
ipa од- нозначно определяет индекс массива абзацев, есть соблазн не присваивать пере- менной более выразительное имя, такое как
ipaActiveDocument. Помните про удо- бочитаемость кода и присваивайте переменным описательные имена.
11.6. Грамотное сокращение имен переменных
Стремление к сокращению имен переменных в некотором смысле ста- ло пережитком. В более старых языках, таких как ассемблер, обычный
Basic и Fortran, имена переменных были ограничены 2–8 символами.
Кроме того, раньше программирование было более тесно связано с математикой,
что побуждало использовать в уравнениях и других выражениях переменные с «ма- тематическими» именами
i, j, k и т. п. C++, Java, Visual Basic и другие современные языки позволяют создавать имена почти любой длины, поэтому сокращение вы- разительных имен уже не имеет под собой практически никаких оснований.
Если обстоятельства требуют создания коротких имен, помните, что некоторые способы сокращения имен лучше других. Удачные короткие имена можно создать,
устранив ненужные слова, выбрав более короткие синонимы и использовав ка- кую-нибудь из нескольких стратегий сокращения. Целесообразно знать несколь- ко методик сокращения имен, потому что ни одна из них не является одинаково эффективной во всех случаях.
Общие советы по сокращению имен
Ниже я привел несколько рекомендаций по сокращению имен. Некоторые из них противоречат другим, так что не пытайтесь использовать все советы сразу. Итак:
쐽
используйте стандартные аббревиатуры (общепринятые, которые можно найти в словаре);
쐽
удаляйте все гласные, не являющиеся первыми буквами имен (
computer — cmptr,
screen — scrn, apple — appl, integer — intgr);
쐽
удаляйте артикли и союзы, такие как
and, or, the и т. д.;
쐽
сохраняйте одну или несколько первых букв каждого слова;
쐽
«обрезайте» слова согласованно: после первой, второй или третьей буквы (вы- бирайте вариант, уместный в конкретном случае);
쐽
сохраняйте первую и последнюю буквы каждого слова;
쐽
сохраняйте до трех выразительных слов;
쐽
удаляйте бесполезные суффиксы:
ing, ed и т. д.
ГЛАВА 11 Сила имен переменных
275
쐽
сохраняйте наиболее выразительный звук каждого слога;
쐽
проверяйте, чтобы смысл имени переменной в ходе сокращения не искажался;
쐽
используйте эти способы, пока не сократите имя каждой переменной до 8–20
символов или до верхнего предела, ограничивающего длину имен в конкрет- ном языке.
Фонетические аббревиатуры
Некоторые люди сокращают слова, опираясь на их звучание, а не написание.
В результате
skating превращается в sk8ing, highlight — в hilite, before — в b4, execute
— в
xqt и т. д. Этот способ не отличается понятностью, поэтому я рекомендую забыть про него. Попробуйте, например, догадаться, что означают имена:
ILV2SK8
XMEQWK
S2DTM8O
NXTC
TRMN8R
Комментарии по поводу сокращения имен
Сокращая имена, вы можете попасть в одну из нескольких ловушек. Ниже описа- ны некоторые правила, позволяющие их избежать.
Не сокращайте слова только на один символ Напечатать лишний символ не так уж трудно, и экономия одного символа едва ли может оправдать ухудше- ние удобочитаемости кода. При этом имена становятся похожими на названия ме- сяцев в календаре. Нужно очень уж сильно торопиться, чтобы написать «Июн» вме- сто «Июнь». Обычно после сокращения слов на один символ потом трудно вспом- нить, действительно ли вы удалили этот символ. Или удаляйте более одного сим- вола, или пишите все слово.
Сокращайте имена согласованно Всегда используйте один и тот же вариант сокращения — например, только
Num или только No, но не оба варианта. Аналогич- но не сокращайте слово только в некоторых именах. Если в одних именах вы ис- пользовали слово
Number, не сокращайте его в других именах до Num и наоборот.
Сокращайте имена так, чтобы их можно было произнести Используйте имена
xPos и needsComp, а не xPstn и ndsCmptg. Возьмите на заметку телефонный тест: если вы не можете прочитать код другому человеку по телефону, присвойте переменным более членораздельные имена (Kernighan and Plauger, 1978).
Избегайте комбинаций, допускающих неверное прочтение или произно-
шение имени Если вам нужно как-то обозначить конец B, назовите переменную
ENDB, а не BEND. Если вы грамотно разделяете части имен, этот совет вам не пона- добится, так как сочетания
B-END, BEnd или b_end нельзя произнести неправильно.
Обращайтесь к словарю для разрешения конфликтов имен При сокраще- нии некоторых имен в итоге получается одна и та же аббревиатура. Так, если длина имени ограничена тремя символами и вам нужно использовать в одной части программы элементы
fired и full revenue disbursal, вы можете по неосторожности сократить оба варианта до
frd.
Предотвратить конфликт имен позволяют синонимы, и тут на помощь приходит словарь. В нашем примере
fired можно было бы заменить на синоним dismissed, а
full revenue disbursal — на complete revenue disbursal. В итоге получаются аббреви- атуры
dsm и crd, что устраняет конфликт имен.