Руководство по стилю программирования и конструированию по
Скачать 7.6 Mb.
|
ГЛАВА 30 Инструменты программирования 695 30.1. Инструменты для проектирования Существующие инструменты для проектирования в основ- ном представляют собой графические средства, позволяю- щие создавать диаграммы проекта. Иногда они встроены в ПО для автоматизированной разработки (CASE-средства) с более широкими функ- циями. Некоторые поставщики рекламируют инструменты для проектирования как самостоятельные CASE-средства. Проектирование с помощью графических ин- струментов позволяет использовать для проекта стандартные графические нота- ции: UML, архитектурные блок-схемы, иерархические диаграммы, диаграммы связи сущностей или диаграммы классов. Некоторые инструменты поддерживают только одну нотацию, другие — несколько. Может показаться, что инструменты для проектирования — всего лишь необыч- ные графические пакеты. Однако они обладают возможностями, которых в обыч- ных графических пакетах нет: если нарисовать схему с помощью кружков и стре- лочек, а затем удалить один кружок, графическое средство проектирования авто- матически перестроит другие элементы, включая соединительные стрелки и кружки более низкого уровня, которые взаимодействовали с удаленным кружком. Инст- рументарий берет на себя служебные операции и при добавлении нового круж- ка. Средство проектирования позволяет перемещаться между уровнями абстрак- ции. Инструмент проверит целостность проекта, а некоторые могут создавать код на основе разработанного проекта. 30.2. Инструменты для работы с исходным кодом Инструменты, для работы с исходным кодом обладают более широкими и разви- тыми возможностями в сравнении со средствами, предназначенными для проек- тирования. Редактирование Эта группа инструментов служит для редактирования исходного кода. Интегрированные среды разработки (IDE) По некоторым оценкам до 40% рабочего времени программист тратит на редактирование исходного кода (Parikh, 1986; Ratliff, 1987). В таком случае покупка IDE — хорошее вложение денег. В дополнение к основным функциям по обработке текста хорошие среды разра- ботки предлагают следующую функциональность: 쐽 компиляция и поиск ошибок, не выходя из редактора; 쐽 интеграция с системой управления версиями, средствами тестирования и от- ладки; 쐽 сжатое или развернутое представление программы (вывод имен классов или логических структур без показа их содержания, также называемый «свертыва- нием»); Перекрестная ссылка О проек- тировании см. главы 5–9. 696 ЧАСТЬ VI Системные вопросы 쐽 переход к определениям классов, методов и переменных; 쐽 переход к любым местам использования класса, метода или переменной; 쐽 форматирование в соответствии с используемым языком; 쐽 интерактивная подсказка для языка редактируемой программы; 쐽 поиск соответствующих скобок (операторов begin-end); 쐽 шаблоны для часто применяемых языковых конструкций (например, редактор может ввести полную структуру цикла for после того, как программист набе- рет слово for); 쐽 интеллектуальные отступы (включая возможность простого изменения отсту- пов в блоке выражений при изменении логики); 쐽 автоматизированное преобразование и рефакторинг кода; 쐽 создание макросов на знакомом языке программирования; 쐽 список строк для поиска, который позволяет не набирать повторно часто ис- пользуемые строки; 쐽 регулярные выражения в операциях поиска и замены; 쐽 поиск и замена в группе файлов; 쐽 одновременное редактирование нескольких файлов; 쐽 параллельное сравнение файлов; 쐽 многоуровневая операция отмены. Кстати, есть программы, поддерживающие все перечисленные возможности. Поиск и замена строк в нескольких файлах Если ваш редактор не поддерживает поиск и замену строк в нескольких файлах одновременно, вы можете тем не менее найти дополнительные средства для вы- полнения этого задания. Эти инструменты позволяют искать все вхождения на- звания класса или метода. Обнаружив ошибку в своем коде, вы можете использо- вать такой инструмент для поиска похожих ошибок в других файлах. Вы можете искать точное совпадение строки, похожие строки (без учета регист- ра символов) или использовать регулярные выражения. Регулярные выражения предоставляют особенно мощные возможности, поскольку позволяют произво- дить поиск, применяя сложные строковые шаблоны. Если бы вы хотели найти все случаи применения массивов с использованием магических чисел (цифр от «0» до «9»), вы могли бы выполнить поиск символа «[», за которым идет 0 или несколько пробелов, за которыми следует одно или несколько чисел, потом опять 0 или больше пробелов и символ «]». Одна широко распространенная программа поис- ка называется «grep». Запрос для поиска магических чисел с помощью grep мог бы выглядеть так: grep “\[ *[0–9]+ *\]” *.cpp Критерий поиска можно усложнить, чтобы точней настроить поисковую строку. Полезно иметь возможность заменять строки в нескольких файлах одновремен- но. Например, чтобы дать методу, константе или глобальной переменной лучшее имя, может понадобиться выполнить замену в нескольких файлах. Это легко сде- лать с помощью утилит, позволяющих менять строки в наборе файлов, и это хо- ГЛАВА 30 Инструменты программирования 697 рошо, потому что у вас должно быть как можно меньше препятствий для созда- ния лругих имен классов, методов и констант. Для обработки изменений строк в нескольких файлах служат такие инструменты, как Perl, AWK и sed. Инструменты для сравнения Если вы сделали несколько попыток исправить ошибку и хотите удалить неудач- ные попытки, то программа сравнения сопоставит исходный и исправленный файлы и перечислит измененные строки. Если вы работаете над проектом вмес- те с другими людьми и хотите увидеть, какие исправления они внесли с тех пор, как вы работали с кодом в последний раз, программа сравнения (например, Diff) сравнит текущую версию с последней версией кода, над которой вы работали, и покажет различия. Такая функциональность часто встроена в средства для конт- роля исправлений. Инструменты для слияния Один из видов контроля исправлений заключается в блокировании исходных файлов, так что только один человек может их модифицировать. Можно также позволить нескольким сотрудникам работать с файлами одновременно, а при регистрации производить слияние изменений. Предназначенные для этого ин- струменты обычно выполняют слияние простых изменений автоматически, а в сложных случаях и при возникновении конфликтов обращаются к пользователю. Программы для украшения исходного кода Программы украшения исходного кода выделяют имена классов и методов, стандартизуют стиль отступов, единооб- разно форматируют комментарии и т. д. Некоторые из них могут помещать каждый метод на отдельную Web-страни- цу или на печатную страницу и форматировать код. Большинство инструментов позволяет настраивать способы украшения кода. Программы для украшения кода бывают двух видов. Одни используют исходный код как входные данные и не изменяют исходного кода. Другие изменяют сам исходный код, стандартизуя отступы, форматируя списки параметров и т. д. Это полезно при работе с большими объемами унаследованного кода. Средства документирования интерфейса Некоторые инструменты извлекают подробную документацию по программному интерфейсу из файлов с исходным кодом. Код в исходных файлах содержит не- которые подсказки, например, поля @tag, определяющие текст, который следует извлечь. Инструмент для документирования интерфейса извлекает помеченный текст и представляет его в красиво отформатированном виде. Прекрасным при- мером такого инструмента может служить Javadoc. Шаблоны Шаблоны упрощают задачи ввода данных с клавиатуры. Допустим, вы хотите до- бавлять стандартный пролог комментариев перед началом ваших методов. Вы можете создать скелет такого пролога с использованием правильного синтакси- Перекрестная ссылка О форма- тировании кода программы см. главу 31. 698 ЧАСТЬ VI Системные вопросы са и поместить в него нужные элементы. Этот скелет станет «шаблоном», кото- рый вы сохраните в файле или назначите клавиатурному макросу. При создании нового метода вы легко вставите шаблон в файл с исходным кодом. Шаблоны позволяют настроить как крупные сущности, скажем, классы и файлы, так и не- большие структуры вроде циклов. При работе над групповым проектом шаблоны могут стать простым способом достижения согласованного стиля кодирования и документирования. Средства создания перекрестных ссылок Инструментарий по созданию перекрестных ссылок перечисляет (обычно на Web- страницах) переменные и методы и все места, где они применяются. Генераторы иерархии классов Генератор иерархии классов предоставляет сведения о деревьях наследования. Это бывает полезно при отладке, но чаще всего применяется для анализа структуры программы или для разбиения программы на модули, пакеты или подсистемы. Такая функциональность иногда реализована и в IDE. Анализаторы качества кода Инструментарий этой категории исследует статический исходный код с целью оценки его качества. Программы углубленного контроля синтаксиса и семантики Средства контроля синтаксиса и семантики осуществляют более тщательную про- верку кода, чем это обычно делает компилятор. Ваш компилятор может проверять наличие только элементарных синтаксических ошибок. При углубленном конт- роле могут учитываться нюансы языка, что позволяет проверить наличие более коварных ошибок — тех, что не выглядят таковыми с точки зрения компилятора. Например, в C++ выражение: while ( i = 0 ) ... абсолютно законно, но обычно имеется в виду: while ( i == 0 ) ... Первая строка синтаксически корректна, но путаница со знаками = и == является распространенной ошибкой, и данная строка, возможно, неправильна. Lint — углубленный анализатор синтаксиса и семантики, используемый во многих сре- дах C/C++, — предупреждает о наличии неинициализированных переменных, пе- ременных, которым присвоено значение, но которые никогда не используются, выходных параметрах метода, которым не было присвоено значение внутри ме- тода, подозрительных операциях с указателями, подозрительных логических срав- нениях (вроде приведенного выше), недостижимом коде и прочих распростра- ненных проблемах. Другие языки предлагают похожие инструменты. ГЛАВА 30 Инструменты программирования 699 Генераторы отчетов о метриках Некоторые инструменты составляют отчет о качестве кода. Например, средства, сообщающие о сложности каждого ме- тода, позволяют направить наиболее сложные функции на дополнительное рецензирование, тестирование или перепроектирование. Неко- торые средства подсчитывают количество строк кода, объявлений данных, ком- ментариев и пустых строк как для всей программы, так и для отдельных методов. Они отслеживают дефекты, внесенные конкретными программистами, Затем фик- сируют изменения, сделанные для исправления дефектов, и программистов, вне- сших эти правки. Они подсчитывают количество модификаций ПО и выделяют процедуры, которые исправляются чаше всего. Установлено, что средства анали- за сложности положительно влияют на производительность сопровождения, уве- личивая ее примерно на 20% (Jones, 2000). Рефакторинг исходного кода Несколько инструментов оказывают помощь при конвертации исходного кода из одного формата в другой. Инструменты для рефакторинга Программа рефакторинга поддерживает процесс рефакто- ринга кода как в автономном режиме, так и с интеграцией в IDE. Браузеры рефакторинга позволяют легко изменить имя класса по всему исходному коду. Они дают возможность создавать новый метод, просто выделив код, который в него нужно перенести, указав имя для этого но- вого метода и перечислив список параметров. Средства рефакторинга делают процесс изменения кода более быстрым и менее подверженным ошибкам. Они уже доступны для языков Java и Smalltalk и получают все большее распростране- ние для других языков. Об инструментах рефакторинга см. также главу 14 «Refac- toring Tools» в книге «Refactoring» (Fowler, 1999). Инструменты для реструктуризации Программа реструктуризации преобразует тарелку спагетти-кода с операторами goto в более питательное блюдо из структурированного кода без goto. Кейперс Джонс сообщает, что в процессе сопровождения средства реструктуризации могут повы- сить производительность на 25–30% (Jones, 2000). Программе реструктуризации при конвертации кода приходится делать массу допущений, и, если логика оригинала была ужасной, она останется такой и в сконвертированной версии. Однако если вы выполняете преобразование вручную, вы можете использовать этот инструмент для простых вариантов, а сложные участки обработать вручную. В качестве альтер- нативы можно прогнать код через программу реструктуризации и использовать ре- зультат как отправную точку для ручного преобразования. Трансляторы кода Некоторые инструменты переводят код с одного языка программирования на другой. Транслятор позволяет перенести большой объем кода в другую среду. Учтите Перекрестная ссылка О метри- ках см. раздел 28.4. Перекрестная ссылка О рефак- торинге см. главу 24. 700 ЧАСТЬ VI Системные вопросы однако, что, если вы изначально имеете плохой код, транслятор просто переве- дет этот плохой код на другой язык. Управление версиями Справиться с быстро растущим количеством версий ПО по- зволяют инструменты управления версиями, которые пре- доставляют следующие возможности: 쐽 управление исходным кодом; 쐽 управление зависимостями наподобие того, что делает утилита make в операционных системах UNIX; 쐽 управление версиями проектной документации; 쐽 установка соответствия между элементами проекта, такими как требования, код и тестовые данные, чтобы в случае изменения требований вы могли опреде- лить, какой код и какие тесты будут затронуты. Словари данных Так называются базы данных, которые описывают важную для проекта информа- цию. Во многих случаях словарь связан преимущественно со схемами баз данных. В больших проектах такой словарь служит для отслеживания сотен или тысяч оп- ределений классов. В больших групповых проектах он позволяет избежать конф- ликтов имен. Конфликт может быть просто синтаксическим (когда одно и то же имя используется дважды) и более запутанным, при котором различные имена слу- жат для обозначения одного и того же понятия или одно и то же имя обозначает немного разные вещи. Для каждого элемента данных (таблицы базы данных или класса) словарь содержит имя и описание. Кроме того, в нем могут содержаться пояснения относительно применения элемента. 30.3. Инструменты для работы с исполняемым кодом Средства для работы с исполняемым кодом столь же разнообразны, как и инст- рументы, предназначенные для исходного кода. Создание кода Инструменты, описанные в этом разделе, оказывают помощь при создании про- граммы. Компиляторы и компоновщики Компиляторы преобразуют исходный код в исполняемый. Большинство программ предназначено для компиляции, хотя еще встречается и интерпретируемый код. Типичный компоновщик связывает один или несколько объектных файлов, ко- торые компилятор сгенерировал из ваших исходников, со стандартным кодом, необходимым для создания исполняемых программ. Компоновщики, как прави- ло, могут объединять файлы, созданные на разных языках, позволяя вам выбирать Перекрестная ссылка О таких инструментах см. подраздел «Изменения в коде программ- ного обеспечения» раздела 28.2. ГЛАВА 30 Инструменты программирования 701 язык, наиболее подходящий для каждой части вашей программы, и не задумываться над деталями интеграции. Оверлейные компоновщики помогают вместить 10 фунтов в 5-фунтовый мешок, создавая программы, выполняющиеся в меньшем объеме памяти, чем требуется для их размещения. Оверлейный компоновщик создает такой исполняемый файл, который в любой момент времени загружен в память только частично, а остав- шаяся часть хранится на диске «до востребования». Инструменты для сборки Инструменты сборки ускоряют создание программы из текущих версий файлов исходного кода. Для каждого объектного файла вы указываете исходные файлы, от которых он зависит, и правила его создания. Программы сборки также устраняют ошибки несогласованности исходных данных, они гарантируют, что все файлы будут приведены в согласованное состояние. К распространенным средствам сборки относится утилита make в UNIX и ant, используемая в Java-программах. Допустим, у вас есть объектный файл userface.obj. В make-файле вы определяете, что для создания userface.obj нужно скомпилировать файл userface.cpp. Вы также указываете, что userface.cpp зависит от userface.h, stdlib.h и project.h. «Зависит от» просто означает, что если файлы userface.h, stdlib.h или project.h изменяются, то файл userface.cpp надо перекомпилировать. При сборке программы утилита make проверяет перечисленные зависимости и определяет файлы, которые необходимо перекомпилировать. Если 5 из 250 ис- ходных файлов зависят от определения данных в userface.h, в котором произо- шли изменения, то make автоматически перекомпилирует эти зависящие от него пять файлов. Она не трогает остальные 245 файлов, не связанные с userface.h. Ис- пользование make или ant предоставляет альтернативу перекомпиляции всех 250 файлов или ручной компиляции отдельных файлов, чреватую пропуском одного из них и получением загадочных ошибок, появляющихся в результате рас- синхронизации. Такие средства, как make или ant, заметно повышают скорость и надежность цикла компиляции, компоновки и выполнения. В некоторых группах найдены интересные альтернативы инструментам провер- ки зависимостей. Так, группа, работающая над Microsoft Word, выяснила, что пол- ная сборка всех исходных файлов проходит быстрее, чем выполнение всесторон- ней проверки зависимостей с помощью make при условии оптимизации самих исходных файлов (в частности, содержимого заголовочных файлов и т. п.). При таком подходе средняя машина разработчика Word может полностью собрать исполняемый файл Word — а это несколько миллионов строк кода — примерно за 13 минут. Библиотеки кода Хороший способ быстро написать высококачественный код состоит в том, что- бы не писать его полностью, а найти версию с открытым исходным кодом. Вы можете найти высококачественные библиотеки для: 쐽 контейнерных классов; 쐽 сервисов транзакций по кредитным картам (службы e-commerce); 702 ЧАСТЬ VI Системные вопросы 쐽 межплатформенных средств разработки: вы можете написать код, который сможет выполняться в Microsoft Windows, Apple Macintosh и X Window System путем простого перекомпилирования в каждой среде; 쐽 средств для сжатия данных; 쐽 типов данных и алгоритмов; 쐽 средств для работы с базами данных и манипуляций с файлами данных; 쐽 инструментов для создания диаграмм, графиков и схем; 쐽 средств для работы с изображениями; 쐽 управления лицензиями; 쐽 математических операций; 쐽 инструментов для сетевого взаимодействия и работы в Интернете; 쐽 генераторов отчетов и конструкторов запросов; 쐽 средств для шифрования и обеспечения безопасности; 쐽 инструментов для создания электронных таблиц и сеток; 쐽 текстовых редакторов и систем проверки правописания; 쐽 инструментов для голосовой, телефонной и факсимильной передачи данных. Мастера для генерации кода Как насчет того, чтобы кто-нибудь написал код вместо вас? Вам не придется наде- вать желтый клетчатый пиджак и учиться тараторить, как торговец автомобилями, чтобы уговорить кого-то другого написать для вас этот код. Вы можете использо- вать инструменты для создания кода, и эти средства часто интегрированы в IDE. Инструменты генерации кода обычно ориентированы на приложения для баз данных, но к этому классу относятся и другие программы. Широко распростра- нены кодовые генераторы для баз данных, пользовательского интерфейса и ком- пиляторов. Генерируемый ими код редко так же хорош, как написанный програм- мистом, но во многих приложениях разработанный вручную код и не требуется. Для некоторых пользователей предпочтительней иметь 10 работающих приложе- ний, чем одно, но работающее исключительно хорошо. Генераторы кода также помогают при создании прототипов промышленного кода. С посомощью кодогенератора вы за несколько часов смастерите прототип про- граммы, который позволит продемонстрировать ключевые аспекты пользователь- ского интерфейса, или проведете эксперименты с несколькими подходами к про- ектированию. При ручном кодировании такой ассортимент функциональности потребовал бы нескольких недель работы. Если вы просто экспериментируете, почему бы не делать это наиболее дешевым способом? Наиболее распространенный недостаток кодовых генераторов в том, что создан- ный ими код обычно практически нечитаем. Сопровождая такой код, вы можете пожалеть о том, что сразу не написали его вручную. Программы установки Средства, предназначенные для создания программ установки, обычно поддержи- вают работу с дискетами, CD или DVD или позволяют создавать программы уста- новки через Web. Они проверяют, существуют ли на целевой машине общие биб- лиотечные файлы, контролируют номера версий и т. д. |