Файл: Руководство по стилю программирования и конструированию по.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 836
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
ГЛАВА 9 Процесс программирования с псевдокодом
215
쐽
постусловия, которые гарантированно должны соблюдаться, прежде чем ме- тод вернет управление вызывающей программе (выходные значения находят- ся в заданном диапазоне, потоки инициализированы, файлы открыты или за- крыты, буферы заполнены или очищены и т. д.).
Вот как это выглядит для метода
ReportErrorMessage():
쐽
метод скрывает текст сообщения и текущий метод обработки (интерактивный или командной строки);
쐽
выполнение каких-либо предусловий не требуется;
쐽
входными данными является код ошибки;
쐽
выходные данные двух видов: сообщение об ошибке и статус, возвращаемый
ReportErrorMessage() вызывающей программе;
쐽
возвращаемый статус должен принимать одно из двух значений:
Success или
Failure.
Название метода Вопрос именования метода кажется тривиальным, но хорошее название — признак высокого стиля программирования и дело это непростое. Вообще ме- тод должен иметь понятное, недвусмысленное имя. Затруднения в выборе имени метода могут свидетельствовать о том, что его назначение не совсем понятно. Не- ясное, невыразительное имя метода сродни предвыборным обещаниям политиков.
Вроде бы о чем-то оно говорит, но если задуматься — непонятно о чем. Если мож- но дать методу более ясное имя, сделайте это. Если невыразительное имя — результат неясных проектных решений, вернитесь к ним и измените их.
В нашем примере
ReportErrorMessage() — вполне недвусмысленное имя. Хорошее имя.
Решите, как тестировать метод В процессе написа- ния метода думайте о том, как вы будете его тестировать. Это принесет пользу вам при блочном тестировании и тести- ровщикам, проводящим независимое тестирование.
В нашем примере входные данные просты, так что можно планировать тестирование
ReportErrorMessage() со всеми допустимыми кодами ошибок и различными неверными кодами.
Исследуйте функциональность, предоставляемую стандартными биб-
лиотеками Основная возможность улучшить качество и производительность своего кода — повторно использовать имеющийся хороший код. Если метод ка- жется вам слишком сложным и у вас возникают проблемы с его проектировани- ем, спросите себя, не реализована ли часть его функциональности в библиотеках языка, платформы или средства разработки, которые вы применяете. Нет ли нуж- ного кода в стандартных библиотеках вашей компании? Множество алгоритмов уже реализовано, протестировано, обсуждено в профессиональной литературе,
пересмотрено и усовершенствовано. Не тратьте время на реализацию готового алгоритма, по которому написана кандидатская диссертация.
Продумайте обработку ошибок Подумайте обо всем плохом, что может слу- читься с вашим методом. Подумайте о плохих входных данных, недопустимых значениях, возвращаемых другими методами, и т. д.
Перекрестная ссылка Об имено- вании методов см. раздел 7.3.
Дополнительные сведения О
различных подходах к констру- ированию, ориентированных на предварительное написание те- стов см. книгу «Test-Driven De- velopment: By Example» (Beck,
2003).
216
ЧАСТЬ II Высококачественный код
Методы могут обрабатывать ошибки разными способами, и вам нужно четко опре- делиться с одним из них. Если стратегию обработки ошибок определяет архитек- тура программы, вы можете просто следовать этой стратегии. В других случаях вам следует решить, какой подход будет оптимален в данном конкретном случае.
Думайте об эффективности В зависимости от ситуации вы можете подхо- дить к эффективности одним из двух способов. В первом случае — в подавляю- щем большинстве систем — эффективность некритична. При этом убедитесь, что интерфейс метода достаточно абстрагирован, а код читабелен и при необходи- мости вы сможете его легко усовершенствовать. При хорошей инкапсуляции вы сможете заменить медленные, ресурсоемкие конструкции языка высокого уров- ня более эффективным алгоритмом или реализацией на быстром, компактном язы- ке низкого уровня, не затронув при этом другие методы.
Во втором случае — в незначительном числе систем — про- изводительность критична. Проблемы производительности могут быть связаны с недостатком соединений с базой дан- ных, ограниченной памятью, малым количеством доступных дескрипторов и дру- гими ресурсами. Архитектура должна указывать, сколько ресурсов каждому мето- ду (или классу) может быть предоставлено и как быстро он должен выполнять свои операции.
Как правило, не стоит тратить много усилий на оптимизацию отдельных мето- дов. Эффективность в основном определяется конструкцией высокого уровня.
Обычно микрооптимизация выполняется, только когда закончена вся программа и выясняется, что высокоуровневая конструкция исчерпала свои возможности обеспечить нужную производительность. Не теряйте время на вылизывание от- дельных методов, пока не выяснится, что это необходимо.
Исследуйте алгоритмы и типы данных Если доступные стандартные биб- лиотеки не предоставляют нужной функциональности, имеет смысл исследовать литературу с описанием алгоритмов. Если вы нашли подходящий готовый алго- ритм, корректно адаптируйте его к применяемому вами языку программирования.
Пишите псевдокод У вас не будет сложностей, если вы прошли все предыду- щие этапы, основное назначение которых в том, чтобы у вас сложилось четкое понимание того, что нужно писать.
Закончив предыдущие этапы, можно приступать к написа- нию высокоуровневого псевдокода. Запускайте редактор кода или интегрированную среду разработки и пишите псевдокод, который станет основой исходного текста про- граммы.
Начните с основных моментов, а затем детализируйте их.
Самая главная часть метода — заголовок-комментарий, описывающий действия метода, так что начните с краткой формулировки назначения метода. Написание этой формулировки поможет вам прояснить ваше понимание метода. Если вы испытываете затруднения при написании этого обобщенного комментария, вам,
видимо, следует лучше разобраться с ролью этого метода. Вот пример краткого заголовка-комментария метода:
Перекрестная ссылка Об эф- фективности см. главы 25 и 26.
Перекрестная ссылка Это обсуж- дение предполагает, что при создании псевдокода метода применялись правильные спосо- бы проектирования (см. главу 5).
1 ... 24 25 26 27 28 29 30 31 ... 104
ГЛАВА 9 Процесс программирования с псевдокодом
217
Пример заголовка метода
Этот метод выводит сообщение об ошибке на основании кода ошибки, получаемого от вызывающей программы. Способ вывода сообщения зависит от режима работы, который он определяет сам. Он возвращает значение, указывающее на успешное завершение или сбой.
Написав общий комментарий, добавьте высокоуровневый псевдокод:
Пример псевдокода метода
Этот метод выводит сообщение об ошибке на основании кода ошибки, получаемого от вызывающей программы. Способ вывода сообщения зависит от режима работы, который он определяет сам. Он возвращает значение, указывающее на успешное завершение или сбой.
Установить статус по умолчанию в “сбой”.
Найти сообщение, соответствующее коду ошибки.
Если код ошибки корректен
Если работа в интерактивном режиме, вывести сообщение и указать успешный статус.
Если работа в режиме командной строки, запротоколировать сообщение об ошибке и указать успешный статус.
Если код ошибки некорректен, информировать пользователя об обнаружении внутренней ошибки.
Вернуть статус
Еще раз: этот псевдокод достаточно высокого уровня, он не содержит конструк- ций языка программирования, а объясняет последовательность действий на ес- тественном языке.
Продумайте применение данных К структуре данных можно подходить с разных позиций. В нашем примере дан- ные простые, и манипуляция над ними не является суще- ственной частью метода. В противном случае важно проду- мать основные фрагменты данных до построения логики метода. Когда вы буде- те строить логику метода, структуры основных типов данных окажутся весьма полезны.
Проверьте псевдокод Написав псевдокод и спроектиро- вав данные, уделите минутку просмотру написанного. Заду- майтесь, как бы вы объяснили это кому-то другому.
Попросите кого-нибудь прочитать написанное или выслушать ваше объяснение.
Вам может показаться глупым просить коллегу посмотреть на какие-то 11 строк псевдокода, но результат вас удивит. Псевдокод более явно обозначит ваши оши- бочные намерения, чем код на языке программирования. К тому же люди охот- ней просматривают несколько строк псевдокода своих коллег, чем 35 строк про- граммы на C++ или Java.
Перекрестная ссылка Об ис- пользовании переменных см.
главы 10–13.
Перекрестная ссылка О методи- ках обзоров см. главу 21.
218
ЧАСТЬ II Высококачественный код
Убедитесь, что вы имеете четкое представление о том, что и как делает метод. Если вы не понимаете его концептуально, на уровне псевдокода, какой же тогда у вас шанс разобраться в нем на уровне языка программирования? Если его не пони- маете вы, кто его поймет?
Опишите несколько идей псевдокодом и выберите луч-
шую (пройдите по циклу) Прежде чем кодировать, ре- ализуйте как можно больше своих идей в псевдокоде. При- ступив к кодированию, вы эмоционально вовлекаетесь в этот процесс, и вам труднее отказаться от плохого проекта и начать заново.
Общая идея: раз за разом проходиться по псевдокоду, пока каждое его предложе- ние не станет настолько простым, что под ним можно будет вставить строку про- граммы, а псевдокод оставить в качестве документации. Часть псевдокода, напи- санного при первых проходах, может оказаться достаточно высокоуровневой и потребовать дальнейшей декомпозиции. Не забывайте это сделать. Если вам не понятно, как закодировать какой-то фрагмент, продолжайте работать с псевдо- кодом, пока это не прояснится. Продолжайте уточнение и декомпозицию, пока это не будет выглядеть как напрасная трата времени по сравнению с написанием настоящего кода.
Кодирование метода
Спроектировав метод, приступайте к его конструированию. Конструирование можно производить в стандартном порядке, а при необходимости отступить от него (рис. 9-3).
Рис. 9-3. Вы пройдете все эти этапы, но не обязательно именно
в такой последовательности
Объявление метода Напишите интерфейсный оператор метода: объявление функции на C++, метода на Java, функции или подпрограммы на Microsoft Visual
Basic и т. д. в зависимости от применяемого языка. Превратите существующий
Перекрестная ссылка Об итера- циях см. раздел 34.8.