Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 171
Текст из файла (страница 171)
Изложение фокусируется на методах проектирования и эффективной реализации проекта в терминах языковых конструкций. Главы 23. Обший взгляд на разработку программ. Проектирование 24. Проектирование и программирование 25. Роли классов «Я только сейчас начинаю испытывать всю сложность реализации идей на бумаге. По- ка речь идет об описании чего-либо, все просто; но как только в игру вступают рассу- ждения, так сразу взаимосвязи, ясность и беглость изложения становятся для меня весьма нелегкой задачей, о чем ранее я и понятия не имел. — Чарльз Дарвин Общий взгляд на разработку программ. Проектирование Не сущесгпеуеа серебряной пули.
— Ф. Брукс Разработка программного продукта — цели и средства — процесс разработки— цикл разработки — этапы проектирования — вьивление классов — определение операций — определение зависимостей — определение интерфейсов — реорганизация иерархии классов — модели — экспериментирование и анализ — тестирование — сопровождение программного продукта — эффективность руководство разработкой — повторное использование — масштаб — важность личностей — гибридное проектирование — аннотированная библиография— советы. 23.1.
Обзор Данная глава является первой из трех глав, посвященных процессу разработки программ, начиная с относительно высокоуровнего взгляда на проектирование и заканчивая специфическими для языка С++ концепциями и программными технологиями, призванными непосредственно поддержать проектные решения. После введения и короткого обсуждения целей и средств программирования в 523.3, настоящая глава сосредотачивается на двух главных темах, которые можно охарактеризовать как; ° э23.4 Общий взгляд на разработку программ.
° з23.5 Практические советы по поводу организации процесса разработки программ. В главе 24 обсуждается взаимосвязь проектирования и языка программирования. Глава 25 рассказывает о той роли, которую классы играют в организации программ на этапе проектирования. В целом эти три главы, составляющие часть ГЧ на- Глава 23. Общий взгляд на разработку программ. Проектирование 812 стоящей книги, призваны навести мосты между двумя крайними методиками: между высокоуровневым проектированием, мнящим себя независимым от деталей языка, и сугубо приземленным программированием, близоруко цепляющимся за мелкие детали языка.
Оба конца столь широкого спектра находят свое место в рамках обширного программного проекта, но во избежание излишне высокой цены проекта или его неудачи их нужно тщательно согласовывать на предмет соответствия задач и предлагаемых методик. 23.2. Введение Разработка и создание любого нетривиального программного продукта является весьма сложной задачей. Даже для программиста-индивидуала непосредственное написание программных конструкций является лишь частью процесса. В типичном случае, анализ исходной задачи, создание общего проекта программы, ее документация, тестирование и поддержка, а также управление всеми этими аспектами разработки намного превосходят по сложности написание и отладку отдельных фрагментов кода.
Можно, конечно, назвать всю такую деятельность программированием и заявить, что «нет, я не занимаюсь проектированием, а только лишь программированием», но все равно, независимо от названий, нужно уметь и фокусироваться на отдельных частях, и уметь рассмотреть все это в целом. Ни детали, ни общая картина не должны теряться из-за стремления поскорее сдать готовую систему — хотя часто именно так и происходит. Данная глава посвящена тем аспектам разработки программных продуктов, которые не связаны с написанием и отладкой конкретного кода для отдельных частей программы. Обсуждение указанных вопросов менее точно и менее подробно, чем рассмотрение конкретных деталей языка С++ или специфических приемов программирования, рассмотренных в нашей книге.
Однако это неизбежно, ибо не существует готовых рецептов создания хороших программных продуктов. Подробные рекомендации в стиле «сделай так-то и так-то» возможны лишь для отдельных типов приложений, а не для общего случая. Ничем невозможно заменить интеллект, опыт и вкус в программировании. Поэтому данная глава предлагает лишь общие советы, альтернативные подходы и некоторые полезные предостережения. Обсуждение затрудняется абстрактной природой программного обеспечения и тем фактом, что приемы, хорошо работающие для небольших проектов (скажем, для одного-двух человек на 10000 строк кода), не обязательно пригодны для проектов среднего или большого масштаба.
По этой причине ряд положений формулируется на примере родственных тем из менее абстрактных инженерных дисциплин, а не программирования. Вам следует помнить, что «доказательства по аналогии» часто обманчивы, так что мы используем аналогии лишь для наглядной иллюстрации (а не доказательства). Переформулирование общих утверждений непосредственно в терминах языка С++ и сопутствующих примеров кода осуществляется в главах 24 и 25. Идеи же данной главы неявно подкрепляются языковыми средствами и примерами, рассмотренными во всех остальных главах книги. Помните также, что из-за огромного разнообразия прикладных областей, людей и применяемых средств разработки не следует ожидать, что каждое высказывание непосредственно применимо к вашей конкретной задаче.
Приведенные в настоя- 23.2. Введение 813 щей главе высказывания вытекают из опыта разработки реальных проектов и применимы к широкому кругу задач, но они не являются абсолютно универсальными. Относитесь к ним со здравой долей скептицизма. Известно, что С++ можно использовать как улучшенный С. Однако в таком случае останутся незадействованными самые мощные средства этого языка, и лишь малая часть выгод от применения С++ будет достигнута.
Данная глава фокусируется на подходе к проектированию, при котором удается эффективно применить механизм абстракции данных и средства объектно-ориентированного программирования языка С++; такой подход часто называют обьеклгно-оряеняированным лроекгя ированием (об/есг-ог!ел ге!! без(ял). Несколько важнейших мыслей насквозь пронизывают данную главу: ° Самое важное в разработке программ — ясно понимать, что именно вы пытаетесь сделать.
° Успешный процесс разработки программного продукта — это длительный процесс. ° Разрабатываемые системы всегда эволюционируют в направлении предела сложности, который доступен нам самим и применяемым средствам разработки. ° Не существует готовых рецептов проектирования и программирования, которые могли бы заменить интеллект, опыт и вкус. ° Экспериментирование незаменимо для любого нетривиального программного проекта. ° Проектирование и программирование — итеративные процессы.
° Невозможно четко отделить друг от друга такие фазы разработки, как проектирование, программирование и тестирование. ° Не стоит рассматривать проектирование и программирование в отрыве от вопросов управления этими процессами. Легко недооценить эти положения (это может дорого обойтись в результате). Трудно превратить эти абстрактные идеи в реальную практику. Поэтому здесь крайне важно экспериментирование. Как в самых разных областях деятельности— в судостроении, в велосипедном спорте или программировании, твердые навыки проектирования невозможно получить на основе одной лишь теории.
Часто мы забываем про человеческий фактор в проектировании и рассматриваем процесс построения программных продуктов как последовательность строго определенных шагов, каждый из которых порождает определенные действия над входными данными, соответствующими правилам их преобразования в требуемые выходные результаты». На самом деле, любой язык программирования, любые методики проектирования и построения на основе проекта программного кода обязаны принимать во внимание человеческий фактор. Забыть про это — загубить всю работу. Данная глава нацелена на рассмотрение вопросов проектирования систем, находящихся на пределе возможностей коллектива разработчиков (или индивидуалов).
Кажется, что в самой природе людей заключается их стремление браться за задачи, находящиеся на последней грани их ресурсов. Менее амбициозные проекты слабо нуждаются в подробном рассмотрении вопросов проектирования. У них имеются 814 Глава 23. Общий взгляд на разработку программ. Проектирование свои привычные среды и приемы разработки, от которых не стоит отказываться.
Однако для совершенно новых и чрезвычайно сложных задач нужны новые, более мощные и изощренные средства и методики. А проекты, которые «мы знаем какделать», можно отдать относительным новичкам, которые еше этого не знают. Не существует единственно верного способа проектировать и строить любые системы. Я бы даже счел веру в единственно верный способ некоторой разновидностью детской болезни, если бы не изрядное количество подверженных этой вере опытных проектировщиков и разработчиков. Пожалуйста, помните, что если некоторая методика хорошо сработала у вас в прошлом году для некоторого проекта, это не значит, что она безо всяких изменений будет столь же хорошо работать у другого разработчика или для другого проекта.
Очень важно, чтобы ваш ум был всегда открыт новым обстоятельствам и идеям. Ясно, что большая часть обсуждения относится к разработке больших систем промышленного масштаба. Читатели, не имеющие отношения к таким разработкам, могут удобно развалиться в кресле и посмотреть на «ужасные картины», которых они избежали.