Файл: Руководство по стилю программирования и конструированию по.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 816
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
706
ЧАСТЬ VI Системные вопросы
쐽
Microsoft планировала включить новую технологию работы со шрифтами в графическую среду Windows. Поскольку и файлы с информацией о шрифтах,
и ПО для отображения этих шрифтов были новыми, ошибки могли возникать как в данных, так и в программе. Разработчики Microsoft написали несколько специализированных утилит, которые проверяли наличие ошибок в файлах данных, что позволило проще различать места возникновения ошибок: в файлах данных или в ПО.
쐽
Страховая компания разработала большую систему для расчета повышений ставок. Поскольку система была сложной, а к точности предъявлялись повы- шенные требования, сотни рассчитанных ставок необходимо было тщатель- но проверить, хотя вычисление одной ставки вручную занимало несколько минут. Компания написала отдельное программное средство для расчета од- ной ставки, позволяющее делать это за несколько секунд и проверить ставки,
полученные из основной программы гораздо быстрее, чем при проверке ста- вок вручную.
Планируя проект, необходимо подумать об инструментах, которые могут пона- добиться, и выделить время для их создания.
Сценарии
Сценарий — это инструмент автоматизации повторяющихся рутинных операций.
В некоторых системах сценариями называются командные файлы или макросы.
Сценарии могут быть простыми и сложными, а наиболее полезные из них очень легко написать. Например, я веду дневник и для защиты конфиденциальной ин- формации всегда держу его в зашифрованном виде, кроме тех моментов, когда делаю в нем записи. Чтобы быть уверенным, что я всегда шифрую и дешифрую его надлежащим образом, я использую сценарий, который дешифрует мой днев- ник, запускает текстовый процессор, а затем шифрует дневник снова. Сценарий может выглядеть так:
crypto c:\word\journal.* %1 /d /Es /s word c:\word\journal.doc crypto c:\word\journal.* %1 /Es /s
Поле
%1 предназначено для пароля, который по понятным причинам в сценарии не записан. Сценарий делает за меня работу (причем без ошибок) по вводу всех параметров и гарантирует, что я всегда выполню все операции, причем в правиль- ном порядке.
Если вы обнаружите, что набираете строку длиннее пяти символов по многу раз в день, то эта процедура — хороший кандидат для использования в сценарии или командном файле. В качестве примеров можно привести последовательности компиляции/компоновки, команды резервного копирования и любые команды с большим количеством параметров.
ГЛАВА 30 Инструменты программирования
707
30.6. Волшебная страна
инструментальных средств
Десятилетиями поставщики инструментария и ученые мужи обещают, что создание средств, которые позволят отказаться от программирования, не за горами. Первым и, кажется,
самым забавным случаем присвоения этого ярлыка, был язык
Fortran. Fortran (Formula Translation Language, язык преоб- разований формул) задумывался как средство, которое даст ученым и инженерам возможность просто набирать формулы и, таким образом, обойтись без помощи программистов.
Fortran действительно позволил ученым и инженерам писать программы, но с сегодняшней точки зрения он выглядит сравнительно низкоуровневым языком про- граммирования. Он едва ли позволил обойтись без программистов, а опыт, полу- ченный при работе с Fortran, послужил прогрессу отрасли ПО в целом.
Индустрия ПО постоянно разрабатывает новые инструменты, которые уменьша- ют влияние (или совсем исключают) некоторых наиболее утомительных аспек- тов программирования: деталей размещения операторов исходного кода; шагов,
предпринимаемых для редактирования, компиляции, компоновки и выполнения программы; работы по поиску несогласованных скобок; действий по созданию стандартных текстовых сообщений и т. д. Поскольку каждое из этих новых средств начинает демонстрировать выигрыш в производительности, ученые мужи экст- раполируют этот выигрыш до бесконечности, предполагая, что благодаря ему в конце концов «исчезнет необходимость в программировании». Но на самом деле каждая инновация содержит некоторые изъяны. С течением времени изъяны ис- правляются, и потенциал инновации реализуется полностью. Однако после реа- лизации фундаментальной концепции инструмента дальнейший выигрыш дости- гается путем удаления случайных трудностей, возникших в качестве побочного эффекта при создании нового инструмента. Устранение этих случайных проблем по сути не увеличивает производительность, а просто исключает «шаг назад» из типичного уравнения «два шага вперед, один шаг назад».
За последние десятилетия программисты видели массу инструментов, которые предположительно должны были устранить необходимость программирования.
Сначала это были языки третьего поколения, потом — четвертого. Потом — авто- матическое программирование. Потом — CASE-средства. Потом — визуальное программирование. Каждое из этих достижений привносило значительные улуч- шения, и общими усилиями они сделали программирование абсолютно неузна- ваемым для тех, кто изучал его до этих нововведений. Но ни одна из этих инно- ваций не устранила программирования как такового.
Причина в том, что программирование — принципиально
сложный процесс даже при наличии хорошего инструментария. Дело не в инстру- ментах — программистам приходится бороться с несовер- шенством реального мира; нам нужно досконально проду- мывать последовательности, зависимости и исключения,
иметь дело с конечными пользователями, которые никак не могут ничего решить. Нам всегда придется бороться с пло-
Перекрестная ссылка Доступ- ность инструментария зависит от степени развития технологи- ческой среды (см. раздел 4.3).
Перекрестная ссылка О причи- нах сложности программирова- ния см. подраздел «Существен- ные и несущественные пробле- мы» раздела 5.2.
708
ЧАСТЬ VI Системные вопросы хо определенными интерфейсами с другими программными и аппаратными сред- ствам и всегда принимать во внимание инструкции, бизнес-правила и другие источники сложных проблем, возникающие вне мира программирования.
Нам всегда будут нужны люди, способные заполнить брешь между задачей реаль- ного мира, которую нужно решить, и компьютером, предназначенным для реше- ния этой задачи. Эти люди будут называться программистами независимо от того,
манипулируют они машинными регистрами на ассемблере или диалоговыми ок- нами в Microsoft Visual Basic. Пока у нас есть компьютеры, нам будут нужны люди,
которые говорят компьютерам, чтó делать, и эта деятельность будет называться программированием.
Когда вы слышите заявления о том, что «новый инструментарий устранит необ- ходимость компьютерного программирования», бегите! Или хотя бы посмейтесь про себя над этим наивным оптимизмом.
Дополнительные ресурсы
Дополнительную информацию о программном инструментарии содержат следу- ющие источники.
www.sdmagazine.com/jolts. Web-сайт, посвященный ежегодной премии Jolt Productivity журнала «Software Development Maga- zine», — хороший источник информации о лучших на се- годняшний день инструментах.
Hunt, Andrew and David Thomas.
The Pragmatic Programmer.
Boston, MA: Addison-Wesley, 2000. Раздел 3 этой книги содержит всестороннее исследование программного инструментария, включая редакторы, кодогенераторы,
отладчики, системы управления версиями и другие аналогичные инструменты.
Vaughn-Nichols, Steven. «Building Better Software with Better
Tools»,
IEEE Computer, September 2003, pp. 12–14. В этой статье приводится обзор инициатив в области разработки инст- рументальных средств, выдвинутых IBM, Microsoft Research и Sun Research.
Glass, Robert L.
Software Conflict: Essays on the Art and Science of Software Engineering.
Englewood Cliffs, NJ: Yourdon Press, 1991. В главе «Recommended: A Minimum Standard
Software Toolset» в противовес мнению о том, что чем больше инструментов, тем лучше, автор ратует за определение минимального набора инструментов, кото- рый должен быть доступен каждому разработчику и предлагаться в виде старто- вого комплекта.
Jones, Capers.
Estimating Software Costs. New York, NY: McGraw-Hill, 1998.
Boehm, Barry, et al.
Software Cost Estimation with Cocomo II. Reading, MA: Addison-Wesley,
2000. Книги Джонса и Бома содержат разделы, посвященные влиянию инструмен- тальных средств на производительность.
http://cc2e.com/3098
http://cc2e.com/3005
http://cc2e.com/3012
ГЛАВА 30 Инструменты программирования
709
Контрольный список: программный
инструментарий
Используете ли вы эффективную IDE?
Поддерживает ли ваша IDE интеграцию с системой управления исходным кодом, средствами компоновки, тестирования и отладки и другую полезную функциональность?
Есть ли у вас инструменты для автоматизации часто выполняемого рефак- торинга?
Используете ли вы систему управления версиями для управления исходным кодом, содержанием, требованиями, результатами проектирования, плана- ми работ и другими элементами проекта?
Используете ли вы при работе над очень большим проектом словарь дан- ных или другой центральный репозиторий, содержащий официальное опи- сание каждого класса, пирменяемого в системе?
Рассматривался ли вопрос использования библиотек кода в качестве аль- тернативы написанию собственного кода там, где это возможно?
Пользуетесь ли вы интерактивным отладчиком?
Используете ли вы make или другое ПО для контроля зависимостей, чтобы создавать программы эффективно и надежно?
Содержит ли ваша среда тестирования инструменты для автоматического тестирования, генераторы тестов, мониторы покрытия, средства для стрес- сового тестирования, инструменты для сравнения и ПО для отслеживания дефектов?
Создаете ли вы специальные средства, способные помочь в поддержке специальных нужд проекта, особенно инструменты, автоматизирующие по- вторяющиеся задания?
Получает ли ваша среда преимущества от применения надлежащего инст- рументария?
Ключевые моменты
쐽
Хороший инструментарий может значительно облегчить вам жизнь.
쐽
Можно легко приобрести инструменты для редактирования, анализа качества кода, рефакторинга, управления версиями, отладки, тестирования и настрой- ки кода.
쐽
Вы можете создать множество инструментов специального назначения.
쐽
Хорошие инструменты могут упростить наиболее утомительные аспекты раз- работки ПО, но они не могут исключить необходимость программирования,
хотя и способствуют эволюции того понятия, которое мы вкладываем в слово
«программирование».
http://cc2e.com/3019
1 ... 80 81 82 83 84 85 86 87 ... 104
ГЛАВА 30 Инструменты программирования
711
Часть VII
МАСТЕРСТВО
ПРОГРАММИРОВАНИЯ
Глава 31. Форматирование и стиль
Глава 32. Самодокументирующийся код
Глава 33. Личность
Глава 34. Основы мастерства
Глава 35. Где искать дополнительную информацию
712
ЧАСТЬ VII Мастерство программирования
Г Л А В А 3 1
Форматирование и стиль
Содержание
쐽
31.1. Основные принципы форматирования
쐽
31.2. Способы форматирования
쐽
31.3. Стили форматирования
쐽
31.4. Форматирование управляющих структур
쐽
31.5. Форматирование отдельных операторов
쐽
31.6. Форматирование комментариев
쐽
31.7. Форматирование методов
쐽
31.8. Форматирование классов
Связанные темы
쐽
Самодокументируемый код: глава 32
쐽
Инструменты для форматирования кода: «Редактирование» в разделе 30.2
В этой главе рассматривается эстетический аспект программирования — форма- тирование исходного кода программы. Зрительное и интеллектуальное наслаж- дение, получаемое от хорошо отформатированного кода, — удовольствие, кото- рое способны оценить лишь немногие непрограммисты. Но программисты, гор- дящиеся своей работой, получают огромное эстетическое удовлетворение от про- цесса шлифовки визуальной структуры кода.
Методики, описанные в этой главе, не влияют на скорость выполнения, объем памяти и другие внешние аспекты программы. Но от них зависит, насколько лег- ко вы сможете понять, пересмотреть и исправить этот код спустя несколько ме- сяцев после его создания. От них также зависит, насколько легко другие смогут его прочесть, понять и изменить в ваше отсутствие.
Эта глава полна мелких подробностей, которые обычно имеют в виду, говоря о
«внимании к деталям». В течение жизни проекта внимание к таким деталям влия- ет на качество и итоговое удобство сопровождения создаваемого кода. Они слиш- ком интегрированы в процесс кодирования, чтобы их можно было эффективно изменить потом. Если вы вообще собираетесь их учитывать, учтите их при пер- http://cc2e.com/3187
ГЛАВА 31 Форматирование и стиль
713
воначальном конструировании. Перед началом работы над групповым проектом,
дайте своей команде прочитать эту главу и согласуйте общий стиль кодирования.
Вы можете согласиться не со всем, что здесь прочтете, но я стремился не столько добиться полного одобрения моего мнения, сколько убедить вас рассмотреть вопросы, связанные со стилем форматирования. Если вы гипертоник, переходи- те к следующей главе — она вызовет меньше споров.
31.1. Основные принципы форматирования
В этом разделе мы обсудим теорию хорошего форматирования. Остальная часть главы посвящена практике.
Экстремальные случаи форматирования
Посмотрите на метод, приведенный в листинге 31-1:
Листинг 31-1.
Пример № 1 форматирования кода (Java)
/* Используем способ сортировки методом вставок для сортировки массива «data» в возрастающем порядке. Этот метод предполагает, что [ firstElement ] не является первым элементом данных и элемент data[ firstElement-1 ] достижим. */ public void
InsertionSort( int[] data, int firstElement, int lastElement ) { /* Заменяем элемент, расположенный на нижней границе интервала, элементом, который гаранти- рованно будет первым в сортированном списке. */ int lowerBoundary = data
[ firstElement-1 ]; data[ firstElement-1 ] = SORT_MIN; /* Элементы в позициях от firstElement до sortBoundary-1 всегда сортированы. При каждом проходе цикла sort-
Boundary увеличивается, и элемент, соответствующий новому sortBoundary, возможно,
будет неправильно отсортирован, поэтому он вставляется в надлежащую позицию массива где-то между firstElement и sortBoundary. */ for ( int sortBoundary =
firstElement+1; sortBoundary <= lastElement; sortBoundary++ ) { int insertVal =
data[ sortBoundary ]; int insertPos = sortBoundary; while ( insertVal < data[
insertPos-1 ] ) { data[ insertPos ] = data[ insertPos-1 ]; insertPos = insertPos-1;
} data[ insertPos ] = insertVal; } /* Возвращаем исходное значение элементу,
расположенному на нижней границе интервала */ data[ firstElement-1 ] = lowerBoundary; }
Этот метод синтаксически корректен. Он прокомментирован и содержит хоро- шие имена переменных и понятную логику. Если не верите, прочтите его и най- дите ошибку! Чего не хватает этому методу, так это хорошего форматирования.
Это крайний случай, стремящийся к «минус бесконечности» на шкале способов форматирования с диапазоном от плохих до хороших. Листинг 31-2 показывает менее экстремальный вариант:
Листинг 31-2.
Пример № 2 форматирования кода (Java)
/* Используем способ сортировки методом вставок для сортировки массива «data» в возрастающем порядке. Этот метод предполагает, что [ firstElement ] не является первым элементом данных и элемент data[ firstElement-1 ] достижим. */
public void InsertionSort( int[] data, int firstElement, int lastElement ) {
/* Заменяем элемент, расположенный на нижней границе интервала, элементом,