Файл: Руководство по стилю программирования и конструированию по.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 829
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
1 ... 23 24 25 26 27 28 29 30 ... 104
ГЛАВА 9 Процесс программирования с псевдокодом
209
Г Л А В А 9
Процесс программирования
с псевдокодом
Содержание
쐽
9.1. Этапы создания классов и методов
쐽
9.2. Псевдокод для профи
쐽
9.3. Конструирование процедур с использованием ППП
쐽
9.4. Альтернативы ППП
Связанные темы
쐽
Создание высококачественных классов: глава 6
쐽
Характеристики высококачественных методов: глава 7
쐽
Проектирование при конструировании: глава 5
쐽
Стиль комментирования: глава 32
Всю эту книгу можно рассматривать как подробное описание процесса програм- мирования, в результате которого создаются классы и методы, и в данной главе этапы этого процесса рассматриваются во всех деталях. Здесь описывается «про- граммирование в малом» — конкретные шаги построения отдельных классов и составляющих их методов, шаги, неизбежные в проекте любого размера. В этой главе также рассмотрен процесс программирования с псевдокодом (ППП, Pseu- docode Programming Process), уменьшающий объем работы по проектированию и документированию и улучшающий качество и первого, и второго.
Если вы опытный программист, можете пропустить эту главу, но взгляните на обзор этапов и просмотрите советы по конструированию методов с помощью ППП в разделе 9.3. Некоторые программисты применяют описываемый процесс на пол- ную, поскольку он приносит большую выгоду.
ППП — это не единственная процедура создания классов и методов. В разделе 9.4
описаны наиболее популярные альтернативные подходы, включая разработку с изначальными тестами и проектирование по контракту.
http://cc2e.com/0936
210
ЧАСТЬ II Высококачественный код
9.1. Этапы создания классов и методов
К конструированию классов можно подходить по-разному, но обычно это итера- тивный процесс создания общей структуры класса, создание списка его методов,
их конструирование и проверка класса как единого целого. Создание класса мо- жет быть запутанным процессом (рис. 9-1), поскольку проектирование как тако- вое — тоже процесс запутанный (причины описаны в разделе 5.1).
Рис. 9-1. Детали конструирования классов могут различаться,
но обычно порядок действий такой
Этапы создания класса
Ниже перечислены основные этапы создания класса.
Создание общей структуры класса Проектирование класса связано с мно- жеством отдельных вопросов. Определите функции класса, «секреты», скрытые в нем и точный уровень абстракции, предоставляемый интерфейсом класса. Опре- делите, наследуется ли класс от другого класса и могут ли другие классы наследо- ваться от него. Определите основные открытые методы класса и спроектируйте все нетривиальные структуры данных, используемые им. Пройдитесь по всем этим пунктам столько раз, сколько необходимо для создания четкой структуры класса.
Эти и многие другие вопросы подробно обсуждаются в главе 6.
Конструирование всех методов класса Определив на первом этапе основ- ные функции класса, переходите к конструированию каждого отдельного мето- да. При конструировании отдельных методов обычно выясняется потребность в дополнительных методах (как более низкого, так и более высокого уровня), и вопросы, возникающие при их создании, приводят к необходимости пересмотра общей структуры класса.
Оценка и тестирование всего класса Обычно каждый метод тестируется при его создании. После того как класс в целом становится работоспособным, его нужно пересмотреть и протестировать как единое целое для выявления тех проблем,
которые невозможно определить на уровне отдельных методов.
ГЛАВА 9 Процесс программирования с псевдокодом
211
Этапы построения метода
Многие метода класса, такие как аксессоры или интерфейсы к другим классам, могут быть простыми и понятными для реализации. Реализация других будет сложнее,
и для их создания требуется систематический подход. Основные действия по со- зданию метода — проектирование, проверка структуры, кодирование и проверка кода — обычно выполняются в такой последовательности (рис. 9-2):
Рис. 9-2. Основные действия по созданию метода
Специалисты разработали множество подходов к созданию методов, но мой лю- бимый — процесс программирования с псевдокодом — описан в следующем раз- деле.
9.2. Псевдокод для профи
Псевдокодом называют неформальную нотацию на естественном языке, описы- вающую работу алгоритма, метода, класса или программы. «Процесс программи- рования с псевдокодом» относится к конкретной методике применения псевдо- кода для эффективного создания кода методов.
Поскольку псевдокод напоминает естественный язык, разумно предположить, что любая перефразировка ваших мыслей, выполненная на нем, будет иметь одина- ковый эффект. На практике же вы обнаружите, что некоторые стили псевдокода предпочтительней других.
쐽
Применяйте формулировки, в точности описывающие отдельные действия.
쐽
Избегайте синтаксических элементов языков программирования. Псевдокод позволяет проектировать на несколько более высоком уровне, чем код. При- меняя конструкции языка программирования, вы мыслите на более низком уровне и теряете преимущества проектирования на высоком уровне, загружая себя ненужными синтаксическими ограничениями.
212
ЧАСТЬ II Высококачественный код
쐽
Пишите псевдокод на уровне намерений. Описывайте назначение подхода, а не то, как этот подход нужно реали- зовать на выбранном языке программирования.
쐽
Пишите псевдокод на достаточно низком уровне, так что- бы код из него генерировался практически автоматически.
Если псевдокод написан на слишком высоком уровне, могут возникнуть про- блемы кодирования. Детализируйте псевдокод до тех пор, пока вам не пока- жется, что проще было бы написать код.
1
Написав псевдокод, вы окружаете его кодом, а псевдокод превращаете в коммен- тарии программы. Если вы руководствуетесь перечисленными правилами созда- ния псевдокода, комментарии в вашей программе будут полными и ясными.
Вот пример псевдокода, в котором нарушены практически все перечисленные правила:
Пример плохого псевдокода
увеличить номер ресурса на 1
выделить структуру dlg посредством malloc если malloc() возвращает NULL вернуть 1
вызвать OSrsrc_init для инициализации ресурса
*hRsrcPtr = номер ресурса вернуть 0
Какие намерения описывает этот блок псевдокода? Трудно сказать, поскольку написан он плохо. Этот так называемый псевдокод плох потому, что включает конкретику целевого языка программирования:
*hRsrcPtr (описание указателя,
специфичное для языка C) и
malloc() (функция C). Этот блок псевдокода показы- вает, как будет написан код, а не описывает его назначение. Он вдается в излиш- ние подробности: вернет ли процедура
1 или 0. Если посмотреть, можно ли пре- вратить этот псевдокод в нормальные комментарии, видно, что толку от него мало.
А вот описание тех же действий на гораздо лучшем псевдокоде:
Пример хорошего псевдокода
Отслеживать текущее число используемых ресурсов
Если другой ресурс доступен
Выделить структуру для диалогового окна
Если структура для диалогового окна может быть выделена
Учесть, что используется еще один ресурс
Инициализировать ресурс
Хранить номер ресурса в вызывающей программе
Конец «если»
Конец «если»
Вернуть true, если новый ресурс был создан; иначе вернуть false
Перекрестная ссылка Об уров- нях комментирования см. под- раздел «Виды комментариев»
раздела 32.4.
1
К сожалению, эти советы хорошо применимы лишь для псевдокода на английском языке или для случаев использования экзотических языков программирования с конструкциями, осно- ванными на естественном языке, отличном от английского. —
Прим. перев.
ГЛАВА 9 Процесс программирования с псевдокодом
213
Этот псевдокод лучше предыдущего, так как полностью написан на естественном языке и не использует специфических конструкций целевого языка программи- рования. В первом примере псевдокод подлежал реализации только на C. Во вто- ром же псевдокод не накладывает ограничений на используемый язык. Второй блок также написан на уровне описания намерений. О чем речь во втором блоке? На- верное, это легче понять, чем в первом блоке.
Хотя второй блок написан на понятном естественном языке, он достаточно то- чен и подробен, чтобы быть основой программы. Когда предложения этого псев- докода будут преобразованы в комментарии, они станут хорошим пояснением на- значения кода.
Вот выгоды, которые вы получите, применяя такой стиль псевдокода.
쐽
Псевдокод упрощает пересмотр конструкции — вам не потребуется вникать в исходный код.
쐽
Псевдокод поддерживает идею итеративного усовершенствования. Вы начинаете с высокоуровневой конструкции, уточняете ее до псевдокода, который в свою очередь преобразуете в исходный код. Такое последовательное усовершенство- вание, осуществляемое шаг за шагом, позволяет проверять свои проектные решения по мере перехода на более низкие уровни. В результате вы обнару- живаете высокоуровневые ошибки на самом верхнем уровне, среднеуровне- вые — на среднем, а низкоуровневые — на самом нижнем, прежде чем они создадут проблемы.
쐽
Псевдокод упрощает внесение изменений. Что проще:
исправить линию на чертеже или снести стену и сдви- нуть ее на метр в сторону? В программировании эффект не столь драматичен в плане физических усилий, но идея та же: несколько строк псевдокода легче исправить, чем страницу кода. Одна из основ успеха проекта — отловить ошибку на «наименее значимой стадии», когда для ее исправления требуется минимум усилий. Поиск ошибки на стадии псевдокода требует гораздо мень- ше затрат, чем после полного кодирования, тестирования и отладки, так что есть экономический стимул обнаружить ошибку как можно раньше.
쐽
Псевдокод упрощает комментирование программ. В типичной ситуации вы сначала пишете код, а затем добавляете комментарии. В ППП предложения псевдокода становятся комментариями, так что на самом деле их проще оста- вить, чем удалить.
쐽
Псевдокод сопровождать проще, чем другие виды проектной документации. При других подходах проектная документация отделена от кода, и внесение в нее изменений порождает несоответствие. В ППП предложения псевдокода стано- вятся комментариями программы. Внося изменения в комментарии, вы, таким образом, поддерживаете в корректном состоянии проектную документацию.
Псевдокод как инструмент проектирования трудно переоценить. Иссле- дования показали, что программисты предпочитают псевдокод за его воз- можности упрощать создание программных конструкций, помощь в определении некорректных проектных решений, простоту документирования и внесения изменений (Ramsey, Atwood, and Van Doren, 1983). Псевдокод — не един-
Дополнительные сведения О пре- имуществах внесения изменения на наименее значимых стадиях см. книгу Энди Гроува «High Out- put Management» (Grove, 1983).
214
ЧАСТЬ II Высококачественный код ственный инструмент детального проектирования, но наряду с ППП — полезная вещь в инструментарии программиста. Попробуйте его в деле. В следующем раз- деле я расскажу как.
9.3. Конструирование методов
с использованием ППП
В этом разделе описаны этапы конструирования методов, а именно:
쐽
проектирование метода;
쐽
кодирование метода;
쐽
проверка кода;
쐽
наведение глянца;
쐽
повторение предыдущих шагов при необходимости.
Проектирование метода
Определив состав методов класса, приступайте к их проек- тированию. Допустим, вы хотите написать метод вывода сообщения об ошибке, основанного на коде ошибки, и на- звали этот метод
ReportErrorMessage(). Вот неформальная спецификация
ReportErrorMessage():
ReportErrorMessage() принимает в качестве входного параметра код ошибки и выводит сообщение об ошибке, соответствующее этому коду. Он отвечает за обработку недопустимых кодов. Если программа интерактивная,
ReportError-
Message() выводит сообщение пользователю. Если она работает в режиме ко- мандной строки,
ReportErrorMessage() заносит сообщение в файл. После выво- да сообщения
ReportErrorMessage() возвращает значение статуса, указывающее,
успешно ли он завершился.
Этот метод используется в качестве примера во всей главе, а в оставшейся части этого раздела описывается его проектирование.
Проверка предварительных условий Прежде чем что- либо делать с самой процедурой, убедитесь, что функции метода четко определены и соответствуют общим проект- ным решениям.
Определите задачу, решаемую методом Сформулируйте задачу, решаемую методом настолько детально, чтобы можно было переходить созданию метода. Если проект высокого уровня достаточно подробен, эта работа уже сделана. Проект верхнего уровня должен содержать по крайней мере:
쐽
информацию, скрываемую методом;
쐽
входные данные;
쐽
выходные данные;
쐽
предусловия, которые гарантированно должны соблюдать- ся до вызова метода (входные значения находятся в задан- ном диапазоне, потоки инициализированы, файлы открыты или закрыты, буферы заполнены или очищены и т. д.);
Перекрестная ссылка О других аспектах проектирования см.
главы с 5 по 8.
Перекрестная ссылка О провер- ке предварительных условий см.
главы 3 и 4.
Перекрестная ссылка О пред- и постусловиях см. раздел 8.2.