Файл: Руководство по стилю программирования и конструированию по.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 802
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
720
ЧАСТЬ VII Мастерство программирования
31.2. Способы форматирования
Вы можете получить хороший формат кода, по-разному используя несколько инструментов для форматирования.
Неотображаемые символы
Используйтенеотображаемыесимволыдляулучшениячитаемости. Неотображаемые символы, к которым относятся пробелы, знаки табуляции, переводы строк и пус- тые строки, — это основное средство для демонстрации структуры программы.
Вам вряд ли придет в голову писать книгу без пробелов между словами, разбиения на абзацы и деления на главы. Может,
такую книгу и можно прочитать от начала до конца, но прак- тически невозможно просматривать ее в поисках какой-то мысли или важного эпизода. Еще хуже, что такой формат книги не позволит показать читателю, как автор намеревал- ся организовать информацию. Структура, предлагаемая ав- тором, дает подсказку о логической организации темы.
Разбиение книги на главы, абзацы и предложения показывает читателю, как сле- дует мысленно организовывать тему. Если эта организация неочевидна, читате- лю приходится самому ее домысливать, что налагает на него более тяжкое бремя и увеличивает вероятность никогда не узнать, как на самом деле организована данная тема.
Информация, содержащаяся в программе, сосредоточена еще плотней, чем инфор- мация в большинстве книг. Если страницу книги можно прочесть и понять за 1
или 2 минуты, то большинство программистов не могут читать и понимать лис- тинг программы со скоростью, даже приблизительно сравнимой с этой. Программа должна давать гораздо больше подсказок о своей организации, чем книга.
Группировка Еще один способ применения неотображаемых символов — груп- пировка взаимосвязанных выражений
В литературе мысли группируются в абзацы. Хорошо написанный абзац содер- жит предложения, относящиеся только к определенной идее. Он не должен со- держать посторонних предложений. Точно так же абзац кода должен содержать только взаимосвязанные операторы, выполняющие одно задание.
Пустые строки Кроме необходимости группировать взаимосвязанные опера- торы, очень важно отделять несвязанные выражения друг от друга. Начало ново- го абзаца в книге обозначается отступом или пустой строкой. Начало нового аб- заца в коде нужно указывать с помощью пустой строки.
Пустые строки позволяют продемонстрировать организацию программы. Вы можете использовать их для деления групп взаимосвязанных операторов на аб- зацы, отделения методов друг от друга и выделения комментариев.
Хотя эту статистику тяжело применить на практике, но одно исследова- ние показало, что оптимальное число пустых строк в программе состав- ляет от 8% до 16%. Если оно больше 16%, то время, затрачиваемое на от- ладку, заметно увеличивается (Gorla, Benander and Benander, 1990).
Перекрестная ссылка Некото- рые исследователи проводят аналогии между структурой книги и структурой программы
(см. подраздел «Книжная пара- дигма документирования про- грамм» раздела 32.5).
1 ... 81 82 83 84 85 86 87 88 ... 104
ГЛАВА 31 Форматирование и стиль
721
Отступы Применяйте отступы для демонстрации логической структуры про- граммы. Как правило, операторы выделяются отступами, когда они следуют пос- ле некоторого выражения, от которого они логически зависят.
Существуют данные, что отступы влияют на способность программиста понимать код. В статье «Program Indentation and Comprehensibility» со- общается, что некоторые исследования выявили корреляцию между на- личием отступов и способностью к пониманию кода (Miaria et al., 1983). В тесте на понимание испытуемые показали результат на 20–30% лучше, когда програм- мы использовали схему отступов из 2–4-х пробелов, чем когда программы вооб- ще не содержали отступов.
То же исследование выявило, что нельзя не только недостаточно выде- лять, но и чрезмерно подчеркивать логическую структуру программы.
Меньше всего баллов за понимание получили программы, совсем не со- держащие отступов. Второй с конца результат принадлежал программам, исполь- зующим отступы из 6 пробелов. Авторы пришли к выводу, что оптимальными яв- ляются отступы из 2–4-х пробелов. Интересно, что многим испытуемым отступы из 6 пробелов показались удобнее, чем другие, даже несмотря на то, что оконча- тельный результат оказался хуже. Возможно, это связано с тем, что отступы из 6
пробелов выглядят приятнее. Но независимо от того, насколько красиво они вы- глядят, отступы из 6 пробелов оказались хуже читаемыми. Это один из примеров коллизии между эстетикой и читабельностью.
Скобки
Используйте скобки чаще, чем вам это кажется необходимым. Применяйте скоб- ки для разъяснения выражений, состоящих из двух и более членов. Возможно, в скобках нет нужды, но они добавляют ясности и ничего вам не стоят. Например,
скажите, как вычисляются следующие выражения?
Вариант на C++: 12 + 4% 3 * 7 / 8
Вариант на Microsoft Visual Basic: 12 + 4 mod 3 * 7 / 8
Пришлось ли вам задуматься о том, как эти выражения вычисляются, вот в чем вопрос? Можете ли вы быть уверенными в своем ответе без обращения к спра- вочной информации? Даже опытные программисты не отвечают с полной уверен- ностью, и именно поэтому следует использовать скобки, если есть хоть малейшее сомнение в том, как вычисляется выражение.
31.3. Стили форматирования
Большинство вопросов форматирования касается размещения блоков — групп операторов, располагающихся под управляющими выражениями. Блок окружен скобками или ключевыми словами:
{ и } в C++ и Java,
if-then-endif в Visual Basic и другими похожими структурами в других языках. Для простоты в большей части этого обсуждения используются общие обозначения
begin и end. Я предполагаю,
что вы поймете, как это можно соотнести со скобками в C++ и Java или анало- гичными механизмами выделения блоков в других языках. Ниже описаны четы- ре основных стиля форматирования:
722
ЧАСТЬ VII Мастерство программирования
쐽
явные блоки;
쐽
эмуляция явных блоков;
쐽
использование пар
begin-end (скобок) для обозначения границ блока;
쐽
форматирование в конце строки.
Явные блоки
Большинство споров по поводу форматирования возникает из-за несовершенства большинства популярных языков программирования. Хорошо спроектированный язык имеет явную структуру блоков, которая приводит к естественному стилю отступов. Так, в Visual Basic у каждой управляющей структуры есть свой термина- тор, и вы не сможете ее использовать без этого терминатора. Код разбивается на блоки естественным образом. Несколько примеров на Visual Basic приведено в листингах 31-6, 31-7 и 31-8:
Листинг 31-6. Пример явного блока if (Visual Basic)
If pixelColor = Color_Red Then statement1
statement2
End If
Листинг 31-7. Пример явного блока while (Visual Basic)
While pixelColor = Color_Red statement1
statement2
Wend
Листинг 31-8. Пример явного блока case (Visual Basic)
Select Case pixelColor
Case Color_Red statement1
statement2
Case Color_Green statement1
statement2
Case Else statement1
statement2
End Select
Управляющая структура на Visual Basic всегда состоит из начального выражения
(в этих примерах —
If-Then, While и Select-Case) и всегда содержит соответствую-
ГЛАВА 31 Форматирование и стиль
723
щий оператор
End. Отступы внутри такой структуры не подвергаются сомнению,
а варианты выравнивания других ключевых слов частично ограничены. Листинг
31-9 показывает абстрактное представление того, как выглядит такой вид форма- тирования:
Листинг 31-9. Абстрактный пример стиля форматирования явного блока
A XXXXXXXXXXXXXXXXXXXX
B XXXXXXXXXXXX
C XXXXXXXXXXXXXXX
D XXXX
В этом примере управляющая конструкция начинается оператором A и кончает- ся оператором D. Выравнивание между этими двумя операторами обеспечивает визуальное единство конструкции.
Дебаты по поводу форматирования управляющих структур частично возникают потому, что некоторые языки не
требуют применения блоковых структур. Вы можете использовать оператор
if-then, за которым следует единственное выраже- ние, а не формальный блок. Для создания блока вам приходится добавлять пару
begin-end или открывающую и закрывающую скобки вместо их автоматического получения с каждой управляющей структурой. Отделение
begin и end от самой структуры — так, как языки, подобные C++ и Java, делают это со скобками
{ и }, —
приводит к вопросу: куда поместить эти
begin и end? Поэтому меньше проблемы с отступами становятся проблемами только потому, что вам приходится компен- сировать недостатки плохо спроектированных языковых структур. Способы та- кой компенсации описаны ниже.
Эмуляция явных блоков
Хорошим подходом в языках, не имеющих явных блоков, будет рассмотрение ключевых слов
begin и end (или символов { и }) в виде расширений управляющих структур, с которыми они используются. Далее, имеет смысл попробовать сэму- лировать форматирование языка Visual Basic на вашем языке. Листинг 31-10 со- держит абстрактное представление визуальной структуры, которую вы пытаетесь эмулировать:
Листинг 31-10. Абстрактный пример стиля форматирования явного блока
A XXXXXXXXXXXXXXXXXXXX
B XXXXXXXXXXXX
C XXXXXXXXXXXXXXX
D XXXX
При таком стиле управляющая конструкция открывает блок в операторе A и за- крывает блок в операторе D. Это предполагает, что
begin должен находиться в конце оператора A, а
end должен быть оператором D. Говоря абстрактно, для эмуляции явных блоков вам надо сделать нечто, подобное листингу 31-11:
724
ЧАСТЬ VII Мастерство программирования
Листинг 31-11. Абстрактный пример эмуляции стиля явного блока
A XXXXXXXXXXXXXX{X
B XXXXXXXXXXXXXX
C XXXXXXXXXXXXXXXXX
D }X
Несколько примеров такого стиля на C++ приведено в листингах 31-12, 31-13 и
31-14:
Листинг 31-12. Пример эмуляции явного блока if (C++)
if ( pixelColor == Color_Red ) {
statement1;
statement2;
}
Листинг 31-13. Пример эмуляции явного блока while (C++)
while ( pixelColor == Color_Red ) {
statement1;
statement2;
}
Листинг 31-14. Пример эмуляции явного блока switch/case (C++)
switch ( pixelColor ) {
case Color_Red:
statement1;
statement2;
break;
case Color_Green:
statement1;
statement2;
break;
default:
statement1;
statement2;
break;
}
Этот стиль выравнивания вполне функционален. Он хорошо выглядит, его мож- но применять единообразно, а также его удобно сопровождать. Он соответствует
Основной теореме форматирования в том плане, что помогает показать логичес- кую структуру кода. Это вполне разумный вариант стиля. Такой стиль является стандартом в Java и широко распространен в C++.
{
}
ГЛАВА 31 Форматирование и стиль
725
Использование пар begin-end (скобок)
для обозначения границ блока
Альтернативой структуре явного блока может служить использование пар
begin-
end в качестве границ блока. (В дальнейшем обсуждении пары begin-end приме- няются для общего обозначения операторов
begin-end, скобок и других эквива- лентных языковых структур.) Если вы берете за основу этот подход, то рассмат- риваете
begin и end как операторы, следующие за управляющей структурой, а не как фрагменты, являющиеся ее частью. Графически это выглядит идеально, так же,
как и при эмуляции явного блока, приводимой еще раз в листинге 31-15:
Листинг 31-15. Абстрактный пример стиля форматирования явного блока
A XXXXXXXXXXXXXXXXXXX
B XXXXXXXXXXXX
C XXXXXXXXXXXXXX
D XXXX
Но для того, чтобы в новом стиле
begin и end трактовались как составные части структуры блока, а не управляющего выражения, надо поместить
begin в начало блока (а не в конец управляющего выражения), а
end — в конец блока (а не в ка- честве терминатора управляющего выражения). Говоря абстрактно, вам нужно сделать нечто, подобное структуре, изображенной в листинге 31-16:
Листинг 31-16. Абстрактный пример использования begin и end в качестве границ блока
A XXXXXXXXXXXXXXXXXXXX
{XXXXXXXXXXXXXXXX
B XXXXXXXXXXXXXXXXX
C XXXXXXXXXXXXXXXXX
}X
Несколько примеров использования
begin и end в качестве границ блоков, пока- зано в листингах 31-17, 31-18 и 31-19:
Листинг 31-17. Пример применения begin и end в качестве границ блока if (C++)
if ( pixelColor == Color_Red )
{
statement1;
statement2;
}
Листинг 31-18. Пример применения begin и end в качестве границ блока while (C++)
while ( pixelColor == Color_Red )
{
statement1;
statement2;
}
}
{