Файл: Руководство по стилю программирования и конструированию по.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 760
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
114
ЧАСТЬ
II
Высококачественный код
С другой стороны, иногда я имею дело с проектами, стра- дающими от слишком объемной проектной
документа-
ции. Здесь вступает в игру своеобразный закон Грешема
1
, и
«механические действия начинают вытеснять творчество»
(Simon, 1965). Чрезмерное внимание к созданию проектной документации — хорошее подтверждение этого закона. Я бы предпочел, чтобы разработчики тратили 80% усилий на разработку и анализ различных вариантов проектирования и 20% — на создание менее изысканной документации, а не наоборот: 20% — на создание посредственных решений и 80% — на совершенствование документации не совсем удачных проектов.
Регистрация процесса проектирования
Традиционным способом регистрации проекта является его описание в формальной проектной документации. Однако есть масса других способов, эффективных при использова- нии неформального подхода, при создании небольших систем или когда нужна
«облегченная» методика регистрации проекта:
Включайте проектную документацию прямо в код
Документируйте основные аспекты проектирования в ком- ментариях — как правило, в заголовках файлов или классов.
Дополнив этот подход использованием утилиты извлечения документации (такой как JavaDoc), вы позволите програм- мистам, работающим над конкретными фрагментами кода, с легкостью обращаться к соответствующей проектной до- кументации, и повысите вероятность того, что они будут поддерживать ее актуальность.
Регистрируйте протоколы обсуждения проекта и
принятые решения при помощи Wiki Сохраняйте пись- менные протоколы обсуждения проекта в системе Wiki (на- бор Web-страниц, которые может редактировать каждый член группы при помощи
Web-браузера). Это позволяет автоматизировать регистрацию нужных данных, хотя и требует дополнительных затрат на набор текста. Кроме того, в Wiki мож- но хранить полезные цифровые фотографии, ссылки на Web-сайты, содержащие обоснования принятых решений, документы и другие материалы. Этот метод особенно полезен, если члены группы отдалены друг от друга.
Пишите резюме дискуссий в форме электронной почты Обсудив проект системы, поручите кому-нибудь записать резюме беседы — особенно принятые решения — и отправить его каждому члену группы. Сохраняйте копии писем в папке, доступной всем участникам проекта.
Я никогда не встречал человека, желающего читать 17 000 стра- ниц документации, а если бы встретил, то убил бы его, чтобы он не портил генофонд.
Джозеф Костелло
(Joseph Costello)
http://cc2e.com/0506
Плохие новости заключаются в том, что мы, как нам кажется, никогда не найдем философско- го камня. Мы никогда не най- дем процесса, позволяющий проектировать ПО абсолютно рациональным образом. Но есть и хорошая новость: мы можем его подделать.
Дэвид Парнас
и Пол Клементс (David Parnas
and Paul Clements)
1
Закон Грешема (Gresham’s Law) — монетарный принцип, названный в честь лорда Томаса
Грешема, управляющего английским монетным двором при королеве Елизавете. Суть закона
Грешема в том, что «худшие» деньги (некачественные или с пониженным содержанием бла- городного металла) вытесняют «лучшие» деньги из обращения, т. е. более «дешевые» деньги вытесняют более «дорогие». —
Прим. перев.
ГЛАВА
5 Проектирование при конструировании
115
Используйте цифровой фотоаппарат Одним частым барьером, препятствую- щим документированию проекта, является утомительность рисования проектов традиционным способом. Однако способы документирования не ограничиваются вариантами «регистрации проекта с использованием красиво отформатированной формальной нотации» и «полного отсутствия проектной документации».
Фотографируйте диаграммы, которые разработчики рисуют на доске, и включайте их в традиционные документы: это гораздо проще, чем рисовать схемы вручную, но не менее эффективно.
Храните плакаты со схемами проекта Нет закона, утверждающего, что для документирования проекта нужно использовать стандартные листы бумаги почто- вого размера. Если вы рисуете диаграммы проектов на больших листах, можете просто сохранить их в удобном месте или, что еще лучше, развесить на стенах, чтобы разработчики могли обращаться к ним и обновлять по мере надобности.
Используйте карточки CRC (Class, Responsibility,
Collaborator — класс, ответственность, сотрудни-
чество) Еще один простой вариант документирования проекта — использовать карточки. Напишите на каждой карточке имя класса, аспекты его ответственности и имена классов, с которыми он сотрудничает. Про- должайте работать с карточками, пока не будете удовлетворены результатом. В этот момент вы можете просто сохранить карточки на будущее. Этот способ почти не требует расходов, не пугает своей сложностью и поощряет взаимодействие членов группы (Beck, 1991).
Создавайте диаграммы UML с уместным уровнем детальности Одним из популярных способов создания диаграмм проектов является язык UML (Unified
Modeling Language; унифицированный язык моделирования), стандартизацией ко- торого занимается организация Object Management Group (Fowler, 2004). Пример
UML-диаграммы классов вы уже видели на рис. 5-6. UML предоставляет богатый набор формализованных репрезентаций для проектирования сущностей и их отношений. Вы можете использовать неформальные версии UML для анализа и обсуждения подходов к проектированию. Начните с минимальных набросков и добавляйте детали, только выбрав конкретный вариант проекта. Так как UML стан- дартизирован, он позволяет эффективнее обмениваться идеями и может ускорить процесс рассмотрения вариантов проектов при работе в группе.
Описанные способы работают и в различных комбинациях, так что можете сво- бодно смешивать их, приспосабливая к конкретным проектам и даже разным областям одного проекта.
5.5. Комментарии по поводу популярных
методологий
История проектирования ПО отмечена бурными спорами фанатичных сторонников конфликтующих подходов к проектированию. Когда в начале 1990-х вышло в свет первое издание этой книги, фанатики проектирования утверждали, что перед на- чалом кодирования нужно расставить все точки над «i» на этапе проектирования.
Эта рекомендация не имела никакого смысла.
http://cc2e.com/0513
116
ЧАСТЬ
II
Высококачественный код
Сейчас, в середине первого десятилетия XXI века, некоторые
«проповедники» утверждают, что проектирование вообще не требуется. «Крупномасштабное Предварительное Проекти- рование — это плохо, — говорят они. — Лучше вообще не выполнять проектирование перед началом кодирования!»
За десять лет маятник сместился от «проектирования всего» до «проектирования ничего». Но альтернативой Крупномас- штабному Предварительному Проектированию является не отсутствие предварительного проектирования, а Небольшое
Предварительное Проектирование или Достаточное Пред- варительное Проектирование.
Какой объем проектирования достаточен? Никто не мо- жет точно ответить на этот вопрос. Тем не менее можно с полной уверенностью утверждать, что два варианта обяза- тельно окажутся неудачными: проектирование всех деталей до единой и полное отсутствие проектирования. Крайние точки зрения всегда ошибочны!
Как сказал Ф. Дж. Плоджер, «чем догматичнее вы будете в отношении методики проектирования, тем меньше реальных проблем решите» (Plauger, 1993). Рассма- тривайте проектирование как грязный, неряшливый эвристический процесс. Не останавливайтесь на первом проекте, который пришел вам в голову. Сотрудни- чайте. Стремитесь к простоте. Создавайте прототипы, если нужно. Не забывайте про итерацию. Вы будете довольны своими проектами.
Дополнительные ресурсы
Проектирование ПО описанно во множестве работ. Проблема в том, чтобы определить, какие из них наиболее полезны.
Позволю себе дать вам некоторые советы.
Общие вопросы проектирования ПО
Weisfeld, Matt.
The Object-Oriented Thought Process, 2d ed. — SAMS, 2004 — понятное введение в объектно-ориентированное программирование. Если вы уже знакомы с объектно-ориентированным программированием, возможно, вам следует поис- кать более серьезную книгу, но если вы новичок в этой области, эта книга по- знакомит вас с фундаментальными объектно-ориентированными концепциями, такими как объекты, классы, интерфейсы, наследование, полиморфизм, перегруз- ка, абстрактные классы, агрегация и ассоциация, конструкторы/деструкторы, ис- ключения и т. д.
Riel, Arthur J.
Object-Oriented Design Heuristics. — Reading, MA: Addison-Wesley, 1996.
В этой книге основное внимание уделяется проектированию на уровне классов.
Еще она легко читается.
Plauger, P. J.
Programming on Purpose: Essays on Software Design. — Englewood Cliffs,
NJ: PTR Prentice Hall, 1993. В этой книге я нашел столько хороших советов по про- ектированию ПО, сколько во всех остальных прочитанных мной книгах вместе
Люди, описывающие проекти- рование ПО как дисциплиниро- ванный процесс, тратят много энергии, заставляя всех нас по- чувствовать себя виноватыми.
Мы никогда не станем доста- точно структурированными или объектно-ориентированными для достижения нирваны при жизни. Все мы расплачиваемся за первородный грех — изуче- ние Basic в особо впечатлитель- ном возрасте. Но я готов спо- рить, что большинство из нас проектируют программы лучше, чем кажется пуристам.
Ф. Дж. Плоджер
(P. J. Plauger)
http://cc2e.com/0520
ГЛАВА
5 Проектирование при конструировании
117
взятых. Плоджер прекрасно разбирается во многих подходах к проектированию, он прагматичен, и он отличный писатель.
Meyer, Bertrand.
Object-Oriented Software Construction, 2d ed. — New York, NY: Pren tice
Hall PTR, 1997. Мейер приводит убедительные доводы в защиту чистого объек- тно-ориентированного программирования.
Raymond, Eric S.
The Art of UNIX Programming. — Boston, MA: Addison-Wesley, 2004.
Эта книга — хорошо обоснованный взгляд на проектирование ПО сквозь призму
UNIX. В разделе 1.6 приведено лаконичное объяснение 17 ключевых принципов проектирования ПО для UNIX.
Larman, Craig.
Applying UML and Patterns: An Introduction to Object-Oriented Analysis and
Design and the Unified Process, 2d ed. — Englewood Cliffs, NJ: Prentice Hall, 2001. Это популярное введение в объектно-ориентированное проектирование в контексте метода Unified Process. Кроме того, здесь обсуждается объектно-ориентированный анализ.
Теория проектирования ПО
Parnas, David L., and Paul C. Clements. «A Rational Design Process: How and Why to Fake
It». —
IEEE Transactions on Software Engineering SE-12, no. 2 (February 1986): 251–57.
В этой классической статье описывается разрыв между реальным и желательным процессами проектирования программ. Суть статьи в том, что в действительности никто никогда не следует рациональному упорядоченному процессу проектирования, но стремление к этому приводит в итоге к созданию лучших проектов.
Работы, в которых было бы приведено исчерпывающее обсуждение сокрытия информации, мне неизвестны. В большинстве учебников по разработке ПО оно обсуждается кратко, часто в контексте объектно-ориентированных подходов. На- верное, до сих пор лучшими материалами по сокрытию информации являются три статьи, принадлежащие перу Парнаса.
Parnas, David L. «On the Criteria to Be Used in Decomposing Systems into Modules».
—
Communications of the ACM 5, no. 12 (December 1972): 1053-58.
Parnas, David L. «Designing Software for Ease of Extension and Contraction». —
IEEE
Transactions on Software Engineering SE-5, no. 2 (March 1979): 128-38.
Parnas, David L., Paul C. Clements, and D. M. Weiss. «The Modular Structure of Com plex Systems».
—
IEEE Transactions on Software Engineering SE-11, no. 3 (March 1985): 259-66.
Шаблоны проектирования
Gamma, Erich, et al.
Design Patterns. — Reading, MA: Addison-Wesley, 1995. Очень по- лезная книга о шаблонах проектирования, написанная «Бандой четырех»
1
Shalloway, Alan, and James R. Trott.
Design Patterns Explained. — Boston, MA: Addison-
Wesley, 2002. Данная книга представляет собой несложное введение в шаблоны проектирования.
1
«Бандой четырех (Gang of Four)» называют группу авторов, в которую входят Эрих Гамма,
Ричард Хелм, Ральф Джонсон и Джон Влиссидес. —
Прим. перев.
118
ЧАСТЬ
II
Высококачественный код
Проектирование в общем
Adams, James L.
Conceptual Blockbusting: A Guide to Better Ideas, 4th ed. — Cambridge,
MA: Perseus Publishing, 2001. Нельзя сказать, что эта книга посвящена непосред- ственно проектированию ПО, но это не умаляет ее достоинств: она была написана как учебник по проектированию для студентов инженерного факультета Стэн- фордского университета. Даже если вы никогда ничего не проектировали и не проектируете, в ней вы найдете увлекательное обсуждение творческого мышления и много упражнений, позволяющих развить мышление, для эффективного проек- тирования. Кроме того, данная книга включает список литературы, посвященной проектированию и творческому мышлению, с подробными аннотациями. Если вам нравится решать проблемы, вам понравится эта книга.
Polya, G.
How to Solve It: A New Aspect of Mathematical Method, 2d ed. — Princeton,
NJ: Princeton University Press, 1957. Это обсуждение эвристики и решения про- блем концентрируется на математике, но актуально и для разработки ПО. Книга
Полья стала первым трудом, посвященным применению эвристики для решения математических проблем. В ней проводится четкое различие между небрежной эвристикой, используемой для обнаружения решений, и более аккуратными ме- тодами, которые применяются для представления найденных решений. Читать ее нелегко, но если вы интересуетесь эвристикой, то в итоге все равно прочитаете ее, хотите вы того или нет. Полья ясно показывает, что решение проблем не является детерминированным процессом и что приверженность единственной методоло- гии аналогично ходьбе в кандалах. Когда-то в Microsoft эту книгу выдавали всем новым программистам.
Michalewicz, Zbigniew, and David B. Fogel.
How to Solve It: Modern Heuristics. — Berlin:
Springer-Verlag, 2000. Это обновленный вариант книги Полья, который содержит некоторые нематематические примеры и менее требователен к читателю.
Simon, Herbert.
The Sciences of the Artificial, 3d ed. — Cambridge, MA: MIT Press, 1996.
В этой интересной книге проводится различие между науками, имеющими дело с естественным миром (биология, геология и т. д.), и науками, изучающими ис- кусственный мир, созданный людьми (бизнес, архитектура и информатика). За- тем в ней обсуждаются характеристики наук об искусственном, при этом особое внимание уделяется проектированию. Книга написана в академическом стиле, и ее следует прочитать всем, кто решил сделать карьеру в области разработки ПО или любой другой «искусственной» области.
Glass, Robert L.
Software Creativity. — Englewood Cliffs, NJ: Prentice Hall PTR, 1995. Что в большей степени управляет процессом разработки ПО: теория или практика?
Является ли он преимущественно творческим или преимущественно детерминиро- ванным? Какие интеллектуальные качества нужны разработчику ПО? В этой книге приведено интересное обсуждение природы разработки ПО со специфическим акцентом на проектировании.
Petroski, Henry.
Design Paradigms: Case Histories of Error and Judgment in Engineering.
— Cambridge: Cambridge University Press, 1994. Главная идея этой книги в том, что анализ прошлых неудач способствует успешному проектированию не в меньшей, а то и в большей степени, чем исследование прошлых успехов. В подтверждение своей позиции автор приводит многие факты из области гражданского строи- тельства (особенно проектирования мостов).
ГЛАВА
5 Проектирование при конструировании
119
Стандарты
IEEE Std 1016-1998, Recommended Practice for Software Design Descriptions. Данный документ содержит стандарт IEEE-ANSI описания проектов ПО, определяющий, что следует включать в проектную документацию.
IEEE Std 1471-2000. Recommended Practice for Architectural Description of Software Intensive
Systems. Los Alamitos, CA: IEEE Computer Society Press. Этот документ представляет собой руководство IEEE-ANSI по созданию спецификаций архитектуры ПО.
Контрольный список: проектирование при конструировании
Методики проектирования
Выполнили ли вы несколько итераций проектирования, выбрав самую лучшую попытку, а не просто первую?
Попробовали ли вы выполнить декомпозицию системы несколькими спосо- бами с целью нахождения наилучшего варианта?
Использовали ли вы для решения проблемы и нисходящий, и восходящий способы проектирования?
Выполнили ли вы прототипирование сомнительных или плохо известных частей системы, создав абсолютный минимум подлежащего выбрасыванию кода, нужного для ответа на отдельные вопросы?
Был ли выполнен формальный или неформальный обзор вашего проекта другими разработчиками?
Довели ли вы проектирование до той точки, в которой реализация проекта кажется очевидной?
Выполнили ли вы регистрацию проекта уместными способами, такими как
Wiki, электронная почта, плакаты, цифровые фотографии, UML, карточки
CRC или комментарии в самом коде?
Цели проектирования
Адекватно ли проект решает проблемы, которые были определены и от- ложены на этапе разработки архитектуры?
Разделен ли проект на уровни?
Удовлетворены ли вы тем, как выполнена декомпозиция программы на под- системы, пакеты и классы?
Удовлетворены ли вы тем, как выполнена декомпозиция классов на методы?
Достигнуто ли минимальное взаимодействие классов между собой?
Спроектированы ли классы и подсистемы так, чтобы их можно было ис- пользовать в других системах?
Будет ли программа легкой в сопровождении?
Является ли проект полным, но минимальным? Все ли его части действи- тельно необходимы?
Подразумевает ли проект использование только стандартных методик?
Смогли ли вы избежать применения экзотических, трудных для понимания элементов?
Помогает ли проект в целом минимизировать и несущественную, и суще- ственную сложность?
http://cc2e.com/0527
120
ЧАСТЬ
II
Высококачественный код
Ключевые моменты
쐽
Главным Техническим Императивом Разработки ПО является управление слож- ностью. Управлять сложностью будет гораздо легче, если при проектировании вы будете стремиться к простоте.
쐽
Есть два общих способа достижения простоты: минимизация объема существен- ной сложности, с которой приходится иметь дело в любой конкретный момент времени, и подавление необязательного роста несущественной сложности.
쐽
Проектирование — эвристический процесс. Слепое следование какой-либо единственной методологии подавляет творческое мышление и снижает каче- ство ваших программ.
쐽
Оптимальный процесс проектирования итеративен; чем больше вариантов про- ектирования вы попробуете, тем удачнее будет ваш окончательный проект.
쐽
Одной из самых полезных концепций проектирования является сокрытие информации. Вопрос «Что мне скрыть?» устраняет много сложных проблем проектирования.
쐽
Много полезной и интересной информации о проектировании можно найти в других книгах. Описанные в этой главе идеи — лишь вершина айсберга.