Файл: Руководство по стилю программирования и конструированию по.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 750
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
764
ЧАСТЬ VII Мастерство программирования
Управление
Очевиден ли номинальный путь выполнения кода?
Сгруппированы ли связанные операторы?
Вынесены ли относительно независимые группы операторов в отдельные методы?
Следует ли нормальный вариант после if, а не после else?
Просты ли управляющие структуры? Способствуют ли они минимизации сложности?
Выполняет ли цикл одну и только одну функцию, как это делает хорошо спроектированный метод?
Минимизировали ли вы вложенность?
Упростили ли вы булевы выражения путем использования дополнительных булевых переменных, булевых функций и таблиц принятия решений?
Форматирование
Характеризует ли форматирование программы ее логическую структуру?
Проектирование
Прост ли код? Избегаете ли вы «хитрых» решений?
Скрыты ли детали реализации настолько, насколько возможно?
Стараетесь ли вы писать программу в терминах проблемной области, а не структур вычислительной техники или языка программирования?
32.3. Комментировать или не комментировать?
Комментарии легче написать плохо, а не хорошо, и комментирование иногда бывает скорее вредным, чем полезным. Жаркие дискуссии по поводу достоинств комментирования часто напоминают философские дебаты о моральных досто- инствах, и это наводит меня на мысль о том, что, будь Сократ программистом, между ним и его учениками могла бы произойти следующая беседа.
Комменто
Действующие лица:
ФРАСИМАХ
Неопытный пурист теории, который верит всему, что читает.
КАЛЛИКЛ
Закаленный в боях представитель старой школы — «настоящий»
программист.
ГЛАВКОН
Молодой, самоуверенный, энергичный программист.
ИСМЕНА
Опытная разработчица, уставшая от громких обещаний и просто желающая найти несколько работающих методик.
СОКРАТ
Мудрый опытный программист.
Мизансцена:
Завершение ежедневного собрания группы
— Желает ли кто-то обсудить еще что-нибудь, прежде чем мы вернемся к работе?
— спрашивает Сократ.
— Я хочу предложить стандарт комментирования для наших проектов, — гово- рит Фрасимах. — Некоторые наши программисты почти не комментируют свой код, а всем известно, что код без комментариев нечитаем.
ГЛАВА 32 Самодокументирующийся код
765
— Ты, должно быть, еще менее опытен, чем я думал, — отвечает Калликл. — Ком- ментарии — это академическая панацея, и любому, кто писал реальные програм- мы, известно, что комментарии затрудняют чтение кода, а не облегчают. Естествен- ный язык менее точен, чем Java или Visual Basic, и страдает от избыточности, тог- да как операторы языков программирования лаконичны и попадают в самое яб- лочко. Если кто-то не может написать ясный код, разве ему удастся написать яс- ные комментарии? Кроме того, комментарии устаревают при изменениях кода.
Доверяя устаревшим комментариям, ты сам себе роешь яму.
— Полностью согласен, — вступает в разговор Главкон. — Щедро прокомментиро- ванный код читать труднее, потому что в этом случае читать приходится больше. Мало того, что я должен читать код, так мне нужно читать еще и кучу комментариев!
— Подождите минутку, — вставляет свои две драхмы Исмена, ставя чашку кофе.
— Конечно, злоупотребление комментариями возможно, но хорошие комментарии ценятся на вес золота. Мне приходилось сопровождать код как с комментариями,
так и без них, и, будь у меня выбор, я бы предпочла первый вариант. Не думаю, что нам нужен стандарт, заставляющий писать один комментарий на каждые
x строк кода, но побудить всех программистов комментировать код не помешает.
— Если комментарии — пустая трата времени, почему все их используют, Калликл?
— спрашивает Сократ.
— Или потому, что таково требование, или потому, что человек прочитал где-то о пользе комментариев. Ни один программист, когда-либо задумавшийся об этом,
не пришел к выводу, что комментарии полезны.
— Исмена считает, что они полезны. Она уже три года сопровождает твой код без комментариев и чужой код с комментариями. Ее мнение ты уже слышал. Что ты скажешь на это?
— Комментарии бесполезны, потому что они просто повторяют код в более мно- гословной…
— Подожди, — прерывает Калликла Фрасимах. — Хорошие комментарии не повторяют код и не объясняют его. Они поясняют его цель. Коммен- тарии должны объяснять намерения программиста на более высоком уровне абстракции, чем код.
— Верно, — соглашается Исмена. — Если я ищу фрагмент, который мне нужно из- менить или исправить, я просматриваю комментарии. Комментарии, повторяю- щие код, на самом деле бесполезны, потому что все уже сказано в самом коде. Когда я читаю комментарии, я хочу, чтобы они напоминали оглавление книги. Коммен- тарии должны помочь мне найти нужный раздел, а после этого я начну читать код. Гораздо быстрее прочитать одно предложение на обычном языке, чем ана- лизировать 20 строк кода на языке программирования.
Исмена наливает себе вторую чашку кофе.
— Мне кажется, что люди, отказывающиеся писать комментарии, (1) думают, что их код понятнее, чем мог бы быть, (2) считают, что другие программисты гораз- до сильнее интересуются их кодом, чем есть на самом деле, (3) думают, что дру- гие программисты умнее, чем есть на самом деле, (4) ленятся или (5) боятся, что кто-то другой узнает, как работает их код.
766
ЧАСТЬ VII Мастерство программирования
— В этом смысле очень помогли бы обзоры кода, Сократ, — продолжает Исмена.
— Если кто-то утверждает, что комментарии писать не нужно, и получает во вре- мя обзора кучу вопросов — если сразу несколько коллег спрашивают его: „Что про- исходит в этом фрагменте твоего кода?“ — он начинает писать комментарии. Если программист не дойдет до этого сам, его руководитель сможет заставить его пи- сать комментарии.
— Я не утверждаю, Калликл, что ты ленишься или боишься, что кто-то другой пой- мет твой код. Я работала с твоим кодом и могу сказать, что ты — один из лучших программистов компании. Но будь чуточку добрее, а? Мне было бы легче сопро- вождать твой код, если бы ты писал комментарии.
— Но это пустая трата времени, — не сдается Калликл. — Код хорошего програм- миста должен быть самодокументирующимся: все, что нужно знать другим про- граммистам, должно быть в самом коде.
— Нет! — Фрасимах вскакивает со стула. — В коде и так уже есть все, что нужно знать компилятору! С таким же успехом можно было бы сказать, что все, что нуж- но знать другим программистам, уже есть в двоичном исполняемом файле! Если бы мы только были достаточно умны, чтобы уметь читать его! Информации о том,
что программист
собирался сделать, в коде нет.
Фрасимах замечает, что вскочил с места, и садится.
— Сократ, это немыслимо. Почему мы спорим о важности комментариев? Во всех книгах, которые я читал, говорится, что комментарии полезны и что на них не сто- ит экономить. Мы зря теряем время.
— Успокойся, Фрасимах. Спроси у Калликла, как давно он программирует.
— Действительно, как давно, Калликл?
— Ну, я начал с системы Акрополь IV где-то 15 лет назад.
Думаю, что я стал свидетелем рождения и гибели пример- но десятка крупных приложений. А еще в десятке проектов я работал над крупными компонентами. Две из этих систем включали более полумиллиона строк кода, так что я знаю,
о чем говорю. Комментарии совершенно бесполезны.
Сократ бросает взгляд на более молодого программиста.
— Как говорит Калликл, с комментариями действительно связано много проблем,
и ты не поймешь это, пока не приобретешь больше опыта. Если комментировать код неграмотно, комментарии не просто бесполезны — они вредны.
— Они бесполезны, даже если комментировать код грамотно, — заявляет Калликл.
— Комментарии менее точны, чем язык программирования. Лично я думаю, что лучше вообще их не писать.
— Постой, — говорит Сократ. — Исмена согласна с тем, что комментарии менее точны, но она утверждает, что комментарии поднимают программиста на более высокий уровень абстракции, а все мы знаем, что абстракция — один из самых эффективных инструментов, имеющихся в нашем распоряжении.
— Я с этим не согласен, — заявляет Главкон. — Нам следует концентрироваться не на комментариях, а на читабельности кода. При рефакторинге большинство
Ясно, что на некотором уровне комментарии должны быть по- лезны. Думать иначе означало бы полагать, что понятность программы не зависит от того,
сколько информации о ней уже известно читающему програм- му человеку.
Б. Шейл (B. A. Sheil)
1 ... 86 87 88 89 90 91 92 93 ... 104
ГЛАВА 32 Самодокументирующийся код
767
моих комментариев исчезает. После рефакторинга мой код может включать 20
или 30 вызовов методов, не нуждающихся в каких бы то ни было комментариях.
Хороший программист способен определять цель автора по самому коду; к тому же какой толк в чтении о чьей-то цели, если известно, что код содержит ошибку?
Главкон умолкает, удовлетворенный своим вкладом в беседу. Калликл кивает.
— Похоже, вам никогда не приходилось изменять чужой код, — говорит Исмена.
Калликл делает вид, что его очень заинтересовали плитки на потолке.
— Почему бы вам не попробовать прочитать собственный код через шесть меся- цев или год после его написания? Вы можете развивать и навык чтения кода, и навык его комментирования. Никто не заставляет вас выбирать что-то одно. Если вы чи- таете роман, вам, может, и не нужны названия глав. Но при чтении технической книги вам, наверное, хотелось бы иметь возможность быстро найти то, что вы ищете.
Тогда мне не пришлось бы переходить в режим сверхсосредоточенности и читать сотни строк кода для нахождения двух строк, которые я хочу изменить.
— Хорошо, я понимаю, что возможность быстрого просмотра кода была бы удоб- ной, — говорит Главкон. Он видел некоторые из программ Исмены, и они не ос- тавили его равнодушным. — Но как быть с другим утверждением Калликла — что комментарии устаревают по мере изменений кода? Я программирую лишь пару лет, но даже я знаю, что никто не обновляет свои комментарии.
— Ну, и да, и нет, — говорит Исмена. — Если вы считаете комментарии неприкос- новенными, а код подозрительным, у вас серьезные проблемы. На самом деле не- соответствие между комментарием и кодом обычно говорит о том, что неверно и то, и другое. Если какие-то комментарии плохи, это не означает, что само ком- ментирование плохо. Пойду налью себе еще чашку кофе.
Исмена выходит из комнаты.
— Мое главное возражение против комментариев, — заявляет Калликл, — в том,
что они тратят ресурсы.
— Можете ли вы предложить способ минимизации времени написания коммен- тариев? — спрашивает Сократ.
— Проектирование методов на псевдокоде, преобразование псевдокода в коммента- рии и написание соответствующего им кода, — говорит Главкон.
— OK, это сработает, если комментарии не будут повторять код, — утверждает Кал- ликл.
— Написание комментария заставляет вас лучше подумать над тем, что делает ваш код, — говорит Исмена, возвращаясь с новой чашкой кофе. — Если комментарии писать трудно, это означает, что код плох или вы недостаточно хорошо его по- нимаете. В обоих случаях вы должны поработать над кодом еще, так что время,
потраченное на его комментирование, не пропадает — оно указывает вам на не- обходимую работу.
— Хорошо, — подводит итоги Сократ. — Не думаю, что у нас остались еще вопро- сы. Похоже, Исмена сегодня была самой убедительной. Мы будем поощрять ком- ментирование, но не будем относиться к нему простодушно. Мы будем выполнять обзоры кода, чтобы все поняли, какие комментарии на самом деле полезны. Если у вас возникнут проблемы с пониманием кода другого программиста, подскажи- те ему, как он может его улучшить.
768
ЧАСТЬ VII Мастерство программирования
32.4. Советы по эффективному
комментированию
Что делает следующий метод?
Загадочный метод номер один (Java)
// вывод сумм чисел 1..n для всех n от 1 до num current = 1;
previous = 0;
sum = 1;
for ( int i = 0; i < num; i++ ) {
System.out.println( “Sum = “ + sum );
sum = current + previous;
previous = current;
current = sum;
}
Этот метод вычисляет первые
num чисел Фибоначчи. Стиль кодирования этого метода чуть лучше, чем стиль метода, указанного в начале главы, но комментарий неверен, и если вы слепо доверяете комментариям, то, пребывая в блаженном неведении, пойдете в неверном направлении.
А что скажете по поводу этого метода?
Загадочный метод номер два (Java)
// присваивание переменной “product” значения переменной “base”
product = base;
// цикл от 2 до “num”
for ( int i = 2; i <= num; i++ ) {
// умножение “base” на “product”
product = product * base;
}
System.out.println( “Product = “ + product );
Этот метод возводит целое число
base в целую степень num. Комментарии в этом методе верны, но они не говорят о коде ничего нового. Это просто более много- словная версия самого кода.
Наконец, еще один метод:
Загадочный метод номер три (Java)
// вычисление квадратного корня из Num с помощью аппроксимации Ньютона-Рафсона r = num / 2;
while ( abs( r - (num/r) ) > TOLERANCE ) {
r = 0.5 * ( r + (num/r) );
}
System.out.println( “r = “ + r );
Пока существуют плохо опреде- ленные цели, странные ошибки и нереалистичные сроки, будут существовать и Настоящие Про- граммисты, желающие немед- ленно приступить к Решению
Проблемы и оставляющие доку- ментацию на потом. Да здрав- ствует Фортран!
Эд Пост (Ed Post)
ГЛАВА 32 Самодокументирующийся код
769
Этот метод вычисляет квадратный корень из
num. Код неидеален, но коммента- рий верен.
Какой метод понять было легче всего? Все они написаны довольно плохо — осо- бенно неудачны имена переменных. По сути эти методы иллюстрируют достоин- ства и недостатки внутренних комментариев. Комментарий Метода 1 неверен.
Комментарии Метода 2 просто повторяют код и потому бесполезны. Только ком- ментарий Метода 3 оправдывает свое существование. Наличие плохих коммента- риев хуже, чем их отсутствие. Методы 1 и 2 лучше было бы оставить вообще без комментариев.
В следующих подразделах я приведу советы по написанию эффективных коммен- тариев.
Виды комментариев
Комментарии можно разделить на шесть категорий, описанных ниже.
Повторение кода
Повторяющий комментарий переформулирует код иными словами и только за- ставляет больше читать, не предоставляя дополнительной информации.
Объяснение кода
Такие комментарии обычно служат для объяснения сложных, хитрых или неста- бильных фрагментов кода. В этих ситуациях они полезны, но обычно только потому, что код непонятен. Если код настолько сложен, что требует объяснения,
почти всегда разумнее улучшить код, а не добавлять комментарии. Сделайте сам код более ясным, а потом добавьте в него резюмирующие комментарии или ком- ментарии цели.
Маркер в коде
Этот тип предназначен не для того, чтобы оставаться в коде. Такая пометка ука- зывает программисту на то, что работа еще не выполнена. Некоторые разработ- чики делают маркеры синтаксически некорректными (например,
******), чтобы о невыполненной работе напомнил компилятор. Другие включают в комментарии определенный ряд символов, не приводящий к ошибке компиляции и служащий для поиска нужного фрагмента.
Мало что может сравниться с чувствами программиста, получившего от заказчика сообщение о проблеме в коде и увидевшего во время отладки что-нибудь вроде:
return NULL; // ****** НЕ СДЕЛАНО! ИСПРАВИТЬ ДО ВЫПУСКА ПРОГРАММЫ!!!
Если вы поставили заказчикам дефектную программу, это плохо; если же вы
зна-
ли, что она дефектна, это просто ужасно.
Стандартизуйте стиль комментариев-маркеров, иначе одни программисты будут использовать для этого символы
*******, другие — !!!!!!, третьи — TBD, а четвертые —
что-то еще. Применение разных нотаций повышает вероятность ошибок при механическом поиске незавершенных фрагментов кода или вообще делает его невозможным. Стандартизация стиля маркирования позволяет сделать механичес-