Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kernigan_paik.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.91 Mб
Скачать

Интерфейсы

Прячьте детали реализации.

Ограничьтесь небольшим набором независимых примитивов.

Не делайте ничего "за спиной" у пользователя.

Всегда делайте одинаковое одинаково.

Высвобождайте ресурсы на том же уровне, где выделяли их.

Обнаруживайте ошибки на низком уровне, обрабатывайте на

высоком. Используйте исключения только для исключительных

ситуаций.

Отладка

Ищите знакомые ситуации.

Проверьте самое последнее изменение.

Не повторяйте дважды одну и ту же ошибку.

Не откладывайте отладку на потом.

Пользуйтесь стеком вызова.

Читайте код перед тем, как исправлять.

Объясните свой код кому-либо еще.

Сделайте ошибку воспроизводимой.

Разделяй и властвуй.

Изучайте нумерологию ошибок.

Выводите информацию, локализующую место ошибки.

Пишите код с самоконтролем.

Ведите журнальный файл.

Постройте график.

Используйте инструменты.

Ведите записи.

Тестирование

Тестируйте граничные условия кода.

Тестируйте пред- и постусловия.

Используйте утверждения.

Используйте подход защитного программирования.

Проверяйте коды возврата функций.

Тестируйте по возрастающей.

Тестируйте сначала простые блоки.

Четко определите, чего вы ожидаете на выходе теста.

Проверяйте свойства сохранности данных.

Сравните независимые версии.

Оценивайте охват тестов.

Автоматизируйте возвратное тестирование.

Создавайте замкнутые тесты.

Производительность

Автоматизируйте замеры времени.

Используйте профилировщик.

Концентрируйтесь на критических местах.

Постройте график.

Улучшайте алгоритм и структуру данных.

Используйте оптимизацию компилятора.

Выполните тонкую настройку кода.

Не оптимизируйте то, что не имеет значения.

Объединяйте общие выражения.

Замените дорогостоящие операции на более дешевые.

Избавьтесь от циклов или упростите их.

Кэшируйте часто используемые значения.

Напишите специальную функцию захвата памяти (аллокатор).

Буферизуйте ввод и вывод.

Специальные случаи обрабатывайте отдельно.

Используйте предварительное вычисление результатов.

Используйте приближенные значения.

Перепишите код на языке более низкого уровня.

Используйте минимально возможный тип данных.

Не храните то, что можете без труда вычислить.

Переносимость

Придерживайтесь стандарта.

Следуйте основному руслу.

Избегайте неоднозначных конструкций языка.

Попробуйте несколько компиляторов.

Используйте стандартные библиотеки.

Используйте только то, что доступно везде.

Избегайте условной компиляции.

Выносите системные различия в отдельные файлы.

Прячьте системные различия за интерфейсами.

Используйте текст для обмена данными.

Используйте при обмене данными фиксированный порядок байтов.

При изменении спецификации изменяйте и имя.

Поддерживайте совместимость с существующими программами и данными.

Не рассчитывайте на ASCII.

Не ориентируйтесь только на английский язык.

1 Слово "иерархическая" означает, что указание на другие вершины создает своего рода непосредственную подчиненность вершин, и корню косвенно подчи­нены все остальные вершины. Здесь речь идет только о направленных деревьях, в других приложениях дерево определяется несколько иначе.

2 Простой пример использования нисходящего порядка — вычисление рас­стояний от корня до всех вершин или пропускных способностей путей. Терми­ны pre-order, post-order и in-order переводятся у нас по-разному, например — КЛП-, ЛПК- и ЛКП-порядки. Не следует употреблять термины из первого из­дания "Искусства программирования" Д. Кнута, сам автор вскоре исправил эти термины.

3 "Show me your flowcharts and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won't usually need your flowcharts; they'll be obvious".

4 Примечательно, что сама эта техника появилась при исследовании А. А. Мар­ковым закономерностей чередования букв в русском тексте (конкретно ~ в романе А. С. Пушкина "Евгений Онегин").

5 Авторы пишут на протяжении всей книги "алгоритм Маркова", но в рус­ской литературе этот термин связан с именем другого человека, А. А. Маркова-младшего. Выбором латинского написания мы постарались отстранить алго­ритм от конкретных лиц.

6 Чтобы читатель представил себе получающийся текст, мы пропустили че­рез программу текст Книги Псалмов на русском языке. При этом все буквы были сделаны строчными, а знаки препинания убраны, так как русская система падежей обеспечивает достаточное управление. Вот один из "псалмов":

спаси меня от делающих беззаконие спаси от кровожадных ибо вот они подстерегают душу мою милостив господь и достохвален страшен он для всех любящих оные дело его слава и красота и правда его пребывает во веки и веки

В эту траекторию вошло 16 переходов с однозначным выбором.

7 По моему личному опыту, лучше объяснять программу не мужчинам, а жен щинам: они чувствуют неуверенность в вашем голосе, когда вы объясняете трудное для вас место, и начинают "копаться" в нем, требуя более подробных объяснений.

8 При построении подобных графиков удобно выводить данные для него в упоминавшемся формате CSV, а затем использовать электронные таблицы.

9 RCS (Revision Control System) — система, предназначенная для сравнения версий программных систем и сохранения истории их развития. Документацию по этой системе легко найти в Интернете.

10 В работе этой программы существенно используется определение функции | getc, которую вызывает макрофункция getchar, данное стандартом ANSI С: эта | функция всегда возвращает число в диапазоне от 0 до UCHAR_MAX. Напомним, что | в распространенной системе Turbo С следование стандарту зависит от установ­ки ключей и в режиме по умолчанию getc указанным свойством не обладает.

11 Awk — аббревиатура, составленная по именам авторов: А - Ахо, W — Вайн-бергер и К — Керниган, один из авторов этой книги.

12 Структура данных "бор" описана у Кнута в книге "Искусство программирова­ния для ЭВМ. Сортировка и поиск",с. 572-581. Вкратце, это хэш-таблица, элемен­тами которой являются двоичнырованные деревья.

13 Это типичный случай так называемой редкозаполненной матрицы, объекта, очень часто встречающегося в современных вычислениях. В каждом конкрет­ном алгоритме выбор способа представления такой матрицы существенно зави­сит от кластера (набора) необходимых операций и от частот их использования.

14 Добавим немного детален: байт вида Оххххххх используется для однобайто­вой кодировки символов, байт вида 10хххххх -- для расширения многобайтовых представлений, байт вида 110ххххх и байт 1110хххх начинают, соответственно, двух- и трехбайтовые представления. Для наиболее интересующих нас двух­байтовых представлений, в которые помешается кириллица, полумается 2048 возможностей.

15 В русском переводе "Гулливера в стране лилипутов", когда речь идет о поли­тической важности вопроса о том, с какого конца есть яйцо, эти термины пере­ведены как "тупоконечники" и "остроконечники".

16 Аналогично, [b-e] обозначает множество символов, идущих подряд от b до е, то есть в задании шаблона можно пользоваться диапазонами символов.

17 Не следует путать такое поведение с поведением жадных (также greedy) оп­тимизационных алгоритмов, при работе которых отказ от выбранных решений исключается.

18 В языке Форт реализована именно такая стековая машина, о которой пишут авторы. Отметим, что такие же идеи используются и в ПостСкрипте, о котором как-то было сказано, что он "больше Форт, чем сам Форт".

19 Макросредства С удобно использовать и для решения задачи из преды­дущего параграфа о списке ошибок. Можно описать каждую ошибку макросом с двумя параметрами и дважды условно компилировать список ошибок, полу­чая обе требуемые конструкции из одного источника.

20 В современной русскоязычной компьютерной литературе термин JIT за­частую не переводят, то есть так и пишут — "JIT-компиляторы"; этот же термин будем использовать и мы.

21 Разработанная Д. Кнутом технология "грамотного программирования" описана в его книге (Knuth D. Literate, Programming. Center for the Study of Language and Information, 1992). Программную поддержку этого подхода мож­но найти в Интернете.

239

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]