Совершенный код. Совершенный код. Мастер-класс. Стив Макконнелл. Руководство по стилю программирования и конструированию по
Скачать 5.88 Mb.
|
Тема конструирования игнорировалась Одно время разработка ПО и кодирование рассматривались как одно и то же. Однако по мере идентификации разных процессов цикла разработки ПО лучшие умы отрасли стали посвящать время анализу и обсуждению методик управления проектами, выработки тре# бований, проектирования и тестирования. Из#за пристального внимания к этим новым областям конструирование кода превратилось в бедного родственника разработки ПО. Кроме того, обсуждению конструирования препятствовало предположение, согласно ко# торому подход к конструированию как к отдельному процессу разработки ПО подразуме# вает, что конструирование нужно рассматривать при этом как отдельный этап. На самом деле процессы и этапы разработки не обязаны быть связаны какими#то отношениями, и обсуждение процесса конструирования полезно независимо от того, выполняются ли другие процессы разработки ПО как этапы, итерации или как#то иначе. Конструирование важно Другая причина того, что конструирование игнорируется учеными и авторами, заключа# ется в ошибочной идее, что в сравнении с другими процессами разработки ПО констру# ирование является относительно механическим процессом, допускающим мало возмож# ностей улучшения. Ничто не может быть дальше от истины. На конструирование кода обычно приходятся около 65% работы в небольших и 50% в средних проектах. Во время конструирования допускаются около 75% ошибок в неболь# http://cc2e.com/1234 Предисловие XVII ших проектах и от 50 до 75% в средних и крупных. Очевидно, что любой процесс, связан# ный с такой долей ошибок, можно значительно улучшить (подробнее эти статистические данные рассматриваются в главе 27). Некоторые авторы указывают, что, хотя ошибки конструирования и составляют высокий процент от общего числа ошибок, их обычно дешевле исправлять, чем ошибки в требо# ваниях или архитектуре, поэтому они менее важны. Утверждение, что ошибки конструи# рования дешевле исправлять, верно, но вводит в заблуждение, потому что стоимость не# исправленной ошибки конструирования может быть крайней высокой. Ученые обнару# жили, что одними из самых дорогих ошибок в истории, приведшими к убыткам в сотни миллионов долларов, были мелкие ошибки кодирования (Weinberg, 1983; SEN, 1990). Не# высокая стоимость исправления ошибок не подразумевает, что их исправление можно считать низкоприоритетной задачей. Ирония ослабления внимания к конструированию состоит в том, что конструирование — единственный процесс, который выполняется всегда. Требования можно предположить, а не разработать, архитектуру можно обрисовать в самых общих чертах, а тестирование можно сократить или вообще опустить. Но если вы собираетесь написать программу, из# бежать конструирования не удастся, и это делает конструирование на редкость плодотвор# ной областью улучшения методик разработки. Отсутствие похожих книг Когда я начал подумывать об этой книге, я был уверен, что кто#то другой уже написал об эффективных методиках конструирования. Необходимость такой книги казалась очевид# ной. Но я обнаружил лишь несколько книг о конструировании, описывающих лишь неко# торые его аспекты. Одни были написаны 15 или более лет назад и были основаны на от# носительно редких языках, таких как ALGOL, PL/I, Ratfor и Smalltalk. Другие были написа# ны профессорами, не работавшими над реальным кодом. Профессора писали о методи# ках, работающих в студенческих проектах, но часто не имели представления о том, как эти методики проявят себя в полномасштабных средах разработки. В третьих книгах ав# торы рекламировали новейшие методологии, игнорируя многие зрелые методики, эффек# тивность которых прошла проверку временем. Короче говоря, я не смог найти ни одной книги, автор которой хотя бы попытался отразить в ней практические приемы програм# мирования, возникшие благодаря накоплению профессионального опыта, отраслевым исследованиям и академическим изысканиям. Обсуждение конструирования нужно было привести в соответ# ствие современным языкам программирования, объектно#ориен# тированному программированию и ведущим методикам разработ# ки. Ясно, что книгу о программировании должен был написать человек, знакомый с последними достижениями в области теории и в то же время создавший достаточно реального кода, чтобы хорошо представлять со# стояние практической сферы. Я писал эту книгу как всестороннее обсуждение конструи# рования кода, имеющее целью передачу знаний от одного программиста другому. К читателям Я буду рад получить от вас вопросы по темам, обсуждаемым в этой книге, сообщения об обнаруженных ошибках, комментарии и предложения. Для связи со мной используйте адрес stevemcc@construx.com или мой Web#сайт www.stevemcconnell.com. Беллвью, штат Вашингтон 30 мая 2004 года Когда вместе собираются кри- тики, они говорят о Теме, Ком- позиции и Идее. Когда вместе собираются художники, они го- ворят о том, где купить деше- вый скипидар. Пабло Пикассо XVIII Предисловие Служба поддержки Microsoft Learning Technical Support Мы приложили все усилия, чтобы обеспечить точность сведений, изложенных в этой книге. Поправки к книгам издательства Microsoft Press публикуются в Интернете по адресу: http://www.microsoft.com/learning/support/ Чтобы подключиться к базе знаний Microsoft и задать вопрос или запросить ту или иную информацию, откройте страницу: http://www.microsoft.com/learning/support/search.asp Если у вас есть замечания, вопросы или предложения по поводу этой книги, присылайте их в Microsoft Press по обычной почте: Microsoft Press Attn: Code Complete 2E Editor One Microsoft Way Redmond, WA 98052%6399 или по электронной почте: mspinput@microsoft.com Примечание издателя перевода В книге приняты следующие условные графические обозначения: Ключевой момент Достоверные данные Ужасный код ГЛАВА 1 Добро пожаловатьв мир конструирования ПО! XIX Благодарности Книги никогда не создаются в одиночку (по крайней мере это относится ко всем моим книгам), а работа над вторым изданием — еще более коллективное пред# приятие. Мне хотелось бы поблагодарить всех, кто принял участие в обзоре данной книги: это Хакон Агустссон (Hбkon Бgъstsson), Скотт Эмблер (Scott Ambler), Уилл Барнс (Will Barns), Уильям Д. Бартоломью (William D. Bartholomew), Ларс Бергстром (Lars Bergstrom), Ян Брокбанк (Ian Brockbank), Брюс Батлер (Bruce Butler), Джей Цин# котта (Jay Cincotta), Алан Купер (Alan Cooper), Боб Коррик (Bob Corrick), Эл Кор# вин (Al Corwin), Джерри Девилль (Jerry Deville), Джон Ивз (Jon Eaves), Эдвард Эс# трада (Edward Estrada), Стив Гоулдстоун (Steve Gouldstone), Оуэйн Гриффитс (Owain Griffiths), Мэтью Харрис (Matthew Harris), Майкл Ховард (Michael Howard), Энди Хант (Andy Hunt), Кевин Хатчисон (Kevin Hutchison), Роб Джаспер (Rob Jasper), Стивен Дженкинс (Stephen Jenkins), Ральф Джонсон (Ralph Johnson) и его группа разработки архитектуры ПО из Иллинойского университета, Марек Конопка (Marek Konopka), Джефф Лэнгр (Jeff Langr), Энди Лестер (Andy Lester), Митика Ману (Mitica Manu), Стив Маттингли (Steve Mattingly), Гарет Маккоан (Gareth McCaughan), Ро# берт Макговерн (Robert McGovern), Скотт Мейерс (Scott Meyers), Гарет Морган (Gareth Morgan), Мэтт Пелокин (Matt Peloquin), Брайан Пфладж (Bryan Pflug), Джеффри Рихтер (Jeffrey Richter), Стив Ринн (Steve Rinn), Даг Розенберг (Doug Rosenberg), Брайан Сен#Пьер (Brian St. Pierre), Диомидис Спиннелис (Diomidis Spinellis), Мэтт Стивенс (Matt Stephens), Дэйв Томас (Dave Thomas), Энди Томас# Крамер (Andy Thomas#Cramer), Джон Влиссидес (John Vlissides), Павел Возенилек (Pavel Vozenilek), Денни Уиллифорд (Denny Williford), Джек Вули (Jack Woolley) и Ди Зомбор (Dee Zsombor). Сотни читателей прислали комментарии к первому изданию этой книги, и еще больше — ко второму. Спасибо всем, кто потратил время, чтобы поделиться в той или иной форме своим мнением. Хочу особо поблагодарить рецензентов из Construx Software, которые провели фор# мальную инспекцию всей рукописи: это Джейсон Хиллз (Jason Hills), Брейди Хон# сингер (Bradey Honsinger), Абдул Низар (Abdul Nizar), Том Рид (Tom Reed) и Па# мела Перро (Pamela Perrott). Я был поистине удивлен тщательностью их обзора, особенно если учесть, сколько глаз изучило эту книгу до того, как они начали работать с ней. Спасибо также Брейди, Джейсону и Памеле за помощь в создании Web#сайта cc2e.com. Мне было очень приятно работать с Девон Масгрейв (Devon Musgrave) — редак# тором этой книги. Я работал со многими прекрасными редакторами в других проектах, но даже на их фоне Девон выделяется добросовестностью и легким XX Благодарности характером. Спасибо, Девон! Благодарю Линду Энглман (Linda Engleman), кото# рая поддержала идею второго издания — без нее эта книга не появилась бы. Бла# годарю также других сотрудников издательства Microsoft Press, в их число входят Робин ван Стинбург (Robin Van Steenburgh), Элден Нельсон (Elden Nelson), Карл Дилтц (Carl Diltz), Джоэл Панчо (Joel Panchot), Патрисия Массерман (Patricia Masserman), Билл Майерс (Bill Myers), Сэнди Резник (Sandi Resnick), Барбара Нор# флит (Barbara Norfleet), Джеймс Крамер (James Kramer) и Прескотт Классен (Prescott Klassen). Я хочу еще раз сказать спасибо сотрудникам Microsoft Press, участвовавшим в подготовке первого издания книги: это Элис Смит (Alice Smith), Арлен Майерс (Arlene Myers), Барбара Раньян (Barbara Runyan), Кэрол Люк (Carol Luke), Конни Литтл (Connie Little), Дин Холмс (Dean Holmes), Эрик Стру (Eric Stroo), Эрин О’Кон# нор (Erin O’Connor), Джинни Макгиверн (Jeannie McGivern), Джефф Кэри (Jeff Carey), Дженнифер Харрис (Jennifer Harris), Дженнифер Вик (Jennifer Vick), Джудит Блох (Judith Bloch), Кэтрин Эриксон (Katherine Erickson), Ким Эгглстон (Kim Eggleston), Лиза Сэндбург (Lisa Sandburg), Лиза Теобальд (Lisa Theobald), Маргарет Харгрейв (Margarite Hargrave), Майк Халворсон (Mike Halvorson), Пэт Фоджетт (Pat Forgette), Пегги Герман (Peggy Herman), Рут Петтис (Ruth Pettis), Салли Брунсмен (Sally Brunsman), Шон Пек (Shawn Peck), Стив Мюррей (Steve Murray), Уоллис Болц (Wallis Bolz) и Заафар Хаснаин (Zaafar Hasnain). Наконец, я хотел бы выразить благодарность рецензентам, внесшим такой боль# шой вклад в первое издание книги: это Эл Корвин (Al Corwin), Билл Кистлер (Bill Kiestler), Брайан Догерти (Brian Daugherty), Дэйв Мур (Dave Moore), Грег Хичкок (Greg Hitchcock), Хэнк Меуре (Hank Meuret), Джек Вули (Jack Woolley), Джой Уай# рик (Joey Wyrick), Марго Пейдж (Margot Page), Майк Клейн (Mike Klein), Майк Зевенберген (Mike Zevenbergen), Пэт Форман (Pat Forman), Питер Пэт (Peter Pathe), Роберт Л. Гласс (Robert L. Glass), Тэмми Форман (Tammy Forman), Тони Пискулли (Tony Pisculli) и Уэйн Бердсли (Wayne Beardsley). Особо благодарю Тони Гарланда (Tony Garland) за его обстоятельный обзор: за 12 лет я еще лучше понял, как вы# играла эта книга от тысяч комментариев Тони. Библиография XXI Контрольные списки Требования ................................................................................................................................................................................................................. 42 Архитектура ............................................................................................................................................................................................................ 54 Предварительные условия ....................................................................................................................................................................... 59 Основные методики конструирования ................................................................................................................................... 69 Проектирование при конструировании .............................................................................................................................. 122 Качество классов ............................................................................................................................................................................................ 157 Высококачественные методы ........................................................................................................................................................... 185 Защитное программирование ......................................................................................................................................................... 211 Процесс программирования с псевдокодом .................................................................................................................. 233 Общие вопросы использования данных ............................................................................................................................. 257 Именование переменных ..................................................................................................................................................................... 288 Основные данные .......................................................................................................................................................................................... 316 Применение необычных типов данных .............................................................................................................................. 343 Организация последовательного кода .................................................................................................................................. 353 Использование условных операторов ................................................................................................................................... 365 Циклы .......................................................................................................................................................................................................................... 388 Нестандартные управляющие структуры ........................................................................................................................... 410 Табличные методы ........................................................................................................................................................................................ 429 Вопросы по управляющим структурам ................................................................................................................................. 459 План контроля качества ......................................................................................................................................................................... 476 Эффективное парное программирование ........................................................................................................................ 484 Эффективные инспекции ..................................................................................................................................................................... 491 Тесты ............................................................................................................................................................................................................................. 532 Отладка ...................................................................................................................................................................................................................... 559 Разумные причины выполнения рефакторинга ......................................................................................................... 570 Виды рефакторинга ..................................................................................................................................................................................... 577 Безопасный рефакторинг ..................................................................................................................................................................... 584 Стратегии оптимизации кода .......................................................................................................................................................... 607 Методики оптимизации кода ........................................................................................................................................................... 642 Управление конфигурацией .............................................................................................................................................................. 669 Интеграция ............................................................................................................................................................................................................ 707 Инструменты программирования ............................................................................................................................................... 724 Форматирование ............................................................................................................................................................................................. 773 Самодокументирующийся код ........................................................................................................................................................ 780 Хорошие методики комментирования .................................................................................................................................. 816 |