значительными отличиями) во всех существующих императивных и объектно-ориентированных языках программирования.
Однако, хотя это может показаться несколько неожиданным, с теоретической точки зрения компьютерной науки лишь не-
многие из этих структур являются действительно необходимыми для записи алгоритма решения любой задачи на некотором
языке программирования. Мы обсудим это позже, в главе 11. Пока же просто отметим, что изучение языка программирования
не сводится к бесконечному изучению различных управляющих операторов. В действительности большинство управляющих
структур, имеющихся в современных языках программирования, по сути, являются лишь вариантами тех структур, которые
мы уже рассмотрели здесь.
Выбор набора управляющих структур, предназначенных для включения в язык программирования, является одним из
аспектов его разработки. Задача состоит не только в том, чтобы обеспечить язык средствами выражения алгоритмов в наи-
более удобной форме, но и в том, чтобы помочь программисту действительно достичь этого. Для достижения этой цели не-
обходимо отказаться от использования тех языковых конструкций, которые допускают небрежное программирование, и по-
ощрить применение более продуманных проектных решений. Результатом такого подхода стала разработка часто неверно
трактуемой методологии, известной как структурное программирование (structured programming). Она объединяет в себе
строгие требования к организации проектирования с соответствующим использованием управляющих структур языка про-
граммирования. Назначение этого подхода заключается в создании понятных и хорошо организованных программ, полно-
стью отвечающих требованиям своих спецификаций.
Комментарии. Как показывает практика, независимо от того, насколько хорошо разработан язык программирования и
насколько правильно использованы его возможности, всякий раз, когда человек пытается разобраться в программе сколько-
нибудь значительного размера, дополнительная информация о ней оказывается либо полезной, либо просто необходимой.
Поэтому в языках программирования предусмотрены синтаксические конструкции для вставки в программу поясняющих
операторов, называемых комментариями (comments). Документация, составленная из таких комментариев, называется
внутренней, поскольку она заключена внутри программы, а не в отдельном документе.
Транслятор игнорирует внутреннюю документацию, поэтому ее наличие или отсутствие с машинной точки зрения ни-
как не влияет на саму программу. Машинная версия программы, созданная транслятором, будет одной и той же, независимо
от того, содержит исходный код комментарии или нет. Однако содержащаяся в этих комментариях информация является
важной частью программы с точки зрения человека. Без такого документирования большие и сложные программы часто
превышают пределы понимания программиста.
Существуют два способа выделения комментариев из остального текста программы. Первый состоит в том, чтобы по-
метить весь комментарий специальными маркерами, поставив один из них в начале, а второй – в конце текста комментария.
Другой способ – отметить начало комментария и считать, что он занимает всю оставшуюся часть строки справа от маркера.
Оба способа применяются в языках C, C++ и Java. В них комментарий может размещаться между парами символов /* и */
и содержать более одной строки, или начинаться символами // и продолжаться до конца текущей строки. Таким
образом, в языках C, C++ и Java оба приведенные ниже варианта оператора комментария являются правильными:
/* Это комментарий. */
// Это тоже комментарий.
Скажем несколько слов о том, что следует считать осмысленным комментарием. Начинающие программисты при вне-
сении комментариев в целях создания внутренней документации обычно делают это следующим образом:
Total := Price + Tax; // Вычисляем Total, складывая Price и Tax
Подобные комментарии совершенно излишни и скорее просто увеличивают размер программы, нежели проясняют ее
суть. Запомните, что задача внутренней документации – объяснить другому программисту смысл программы, а не просто
перефразировать выполняемые в ней действия. Более приемлемым комментарием для приведенного выше оператора было
бы краткое пояснение, зачем вычисляется значение Total, если это не очевидно из предыдущего текста. Например, ком-
ментарий "Переменная Total используется ниже при вычислении значения переменной GrandTotal
и после этого будет не нужна" будет более полезен, чем предыдущий.
Кроме того, программа, в которой комментарии беспорядочно разбросаны среди выполняемых операторов, может быть
еще более непонятной, чем программа вовсе без комментариев. Лучше собрать все относящиеся к некоторому модулю про-
граммы комментарии в одном месте, например в начале модуля, где читатель программы сможет найти объяснения. Здесь
также целесообразно будет описать задачу и общие свойства данного программного модуля. Если это принять для всех мо-
дулей, то получится единообразно выполненная программа, каждая часть которой будет состоять из блока поясняющих
комментариев и следующих за ними выполняемых операторов. Такое единообразие программы существенно улучшает ее
читабельность.
Вопросы для самопроверки
1. Почему использование констант вместо литералов считается лучшим стилем программирования?
2. В чем разница между оператором объявления и выполняемым оператором?
3. Перечислите некоторые из наиболее распространенных типов данных.
4. Назовите некоторые из наиболее распространенных управляющих структур, существующих в императивных и объ-
ектно-ориентированных языках программирования.
5. Чем отличаются однородные и неоднородные массивы?
5.3. ПРОЦЕДУРЫ И ФУНКЦИИ
В предыдущих главах мы убедились в преимуществах разделения больших программ на более мелкие и удобные в ра-
боте модули. Для выполнения такой декомпозиции языки программирования предоставляют много различных средств. Язы-
ки, поддерживающие функциональную парадигму, естественным образом требуют разделения программы на отдельные