Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 183
Текст из файла (страница 183)
ООР8[.А'86. Роп1апд, Огейоп. Возможно, это первое хорошее описание взаимосвязи инкапсуляции и наследования. Содержит также хорошее обсуждение некоторых понятий множественного наследования. [%!гВ-Вгосй, 1990[ КеЬесса 1У!гЬ-Вгос[г, Впап %!18епзоп, апг[ 1.аигеп ЪЧепег Оез!8- и!п8 ОЬ1есг-Опеп! Бо|пчаге. Ргепйсе На!1. 1990.
Описывает метод антропоморфического проектирования, основанного на СКС-карточках. Текст книги имеет склонность к языку Бта!!гайс 23.7. Советы 1. Поймите, чего вы хотите добиться; 823.3. 2. Не забывайте, что разработка программ — это человеческая деятельность; 823.2, 823.5.3. 3. Часто доказательство по аналогии — это ошибка (или обман); 823.4. 4. Ставьте четкие и осязаемые цели; 823.4.
5. Не пытайтесь использовать технические приемы для решения проблем, связанных с людьми и обществом; 823.4. 6. Создавая проекты и управляя людьми, старайтесь планировать на долгосрочную перспективу; 823.4.1, $23.5.3. 7. Создавать проекты полезно даже для сколь угодно малых программ; 823.2. 8. В проектировании очень важна обратная связь; 823.4. 9. Не путайте бурную деятельность с реальным прогрессом; 823.3, 823.4. 10. Не пытайтесь обобщать сверх меры, больше того, что можно протестировать и что позволяет ваш опыт; я23.4.1, 823.4.2. 11. Концепции представляйте в виде классов; 823.4.2, $23.4.3.1. 12. У систем имеются свойства, не представимые классами; 823.4.3.1. 13.
Иерархические взаимосвязи понятий представляйте в виде иерархии классов; ~23.4.3.1. 14. Выискивайте общность в концепциях приложения и представляйте более общие понятия в виде базовых классов; 823.4.3.1, 823.4.3.5. 15. Классификация предметной области не всегда полезна лля модели наследования в приложении; 823.4.3.1. 848 Глава 23. Общий взгляд на разработку программ Проектирование 16. Проектируйте классовые иерархии, отталкиваясь от поведения моделируемой системы и от инвариантов; в23.4.3.1, в23.4.3.5, в24.3.7.1. 17.
Рассмотрите типичные примеры использования; В23.4.3.1. 18. Рассмотрите возможность использования СКС-карточек; В23.4.3.1. 19. Используйте готовые системы в качестве моделей, вдохновляющих примеров и отправных точек; в23.4.3.6. 20. Остерегайтесь излишней графической инженерии; в23.4.3.1. 21. Отбросьте прототип до того, как он станет помехой; в23.4.4. 22.
Проектируйте с учетом неизбежных изменений, обращая внимание на гибкость, расширяемость, переносимость и повторное использование; 523.4.2. 23. Сфокусируйтесь на проектировании компонентов; в23.4.3. 24. Желательно, чтобы каждый интерфейс представлял концепцию на одном уровне абстракции; 023.4.3.1. 25. Проектируйте так, чтобы была определенная стабильность прн неизбежности изменений; в23.4.2. 26. Повышайте стабильность проекта, делая интенсивно используемые интер фейсы минимальными, общими и абстрактными; 023.4.3.2, 023.4.3.5.
27. Придерживайтесь принципа минимализма — не добавляйте ничего просто на всякий случай»; В23.4.3.2 28. Всегда" рассматривайте альтернативные реализации классов. Если альтерна- тив нет — то, возможно, класс не отражает чистой концепции; в23.4.3.4. 29.
Многократно пересматривайте и улучшайте проект и реализацию; В23.4, $23.4.3. 30. Применяйте самые лучшие доступные инструменты для тестирования и анализа проблем, для проектирования и реализации; В23.3, 523.4.1, $23.4:4. 31. Экспериментируйте, анализируйте н тестируйте как можно раньше и как можно чаще; 023.4.4, в23.4.5. 32. Никогда не забывайте об эффективности; В23.4.7.
ЗЗ. Сопоставляйте уровень формализации масштабу проекта; в23.5,2. 34. Обязательно кто-то должен отвечать за проект в целом; 023.5.2. 35. Документируйте, рекламируйте и поддерживайте компоненты многократного использования; 023.5.1. 36. Документируйте не только детали, но и общие цели и принципы; $23.4.6. 37. В составе документации пишите и руководство для новых разработчиков; в23.4.6.
38. Поощряйте повторное использование проектов, библиотек и классов; в23.5.!. Проектирование и программирование Саремиаесь, чтобы все было просто: просто, как только возможно, но не проще того. — А. Эйнштейн Проектирование и язык программирования — классы — наследование — проверка типов — программирование — что представляют собой классы? — иерархии классов — зависимости — агрегация — агрегация и наследование— альтернативы проектирования — отношение использования — программируемые отношения — инварианты — утверждения — инкапсуляция — компоненты — шаблоны — интерфейсы и реализации — советы.
24.1. Обзор В этой главе рассматривается; как языки программирования вообще и язык С++ в частности могут поддержать процесс проектирования: ° 524.2 Фундаментальная роль классов, классовых иерархий, проверок типов и собственно программирования. ° 524.3 Применение классов и классовых иерархий с акцентом на взаимозависимости отдельных частей программы. ° 524.4 Понятие компонента (соаропепг), который является основной единицей проекта, и практические соображения по определению интерфейсов.
Более общие вопросы проектирования рассматриваются в главе 23, а различные приемы использования классов более подробно обсуждаются в главе 25. 850 Глава 24. Проектирование и программирование 24.2. Проектирование и язык программирования Если бы мне пришлось строить мост, я бы серьезно задумался над тем, из какого материала его строить. Ясно, что проект моста в сильнейшей степени зависел бы от выбранного материала, и наоборот. Разумный проект каменного моста отличается от разумного проекта стального моста, деревянного моста и т.д.
Я не сумел бы сделать разумный выбор материала без необходимого минимума знаний о материалах и их применении в строительстве. Естественно, что для проектирования деревянного моста не нужно быть искусным плотником, но чтобы осуществить выбор между деревом и сталью, нужно знать основные характеристики деревянных конструкций.
Более того, хотя лично вам и не требуется быть искусным плотником при проектировании деревянного моста, вам нужно знать детальные конструкционные характеристики дерева и приемы его обработки (которыми владеют плотники). Аналогично, чтобы выбрать язык для реализации некоторого программного продукта, надо знать несколько языков программирования, а чтобы спроектировать некоторую часть системы, вам нужно знать выбранный для реализации язык— даже если вам лично и не пришлось писать на нем ни строчки. Хороший проектировщик мостов учитывает свойства применяемого материала и отталкивается от этих свойств для достижения высокого качества проекта. Аналогично, хороший проектировщик программной системы учитывает свойства выбранного языка программирования и старается по максимуму использовать его сильные стороны, а также старается, насколько возможно, избегать приемов его использования, которые вызовут излишние трудности у тех, кто будет реализовывать проект в коде.
Кто-то может подумать, что важность выбора языка актуальна в первую очередь в тех случаях, когда проектировщик/программист — это одно и то же лицо. В этом случае программист может соблазниться не тем языком, как из-за недостатка опыта, так и по причине чрезмерного увлечения некоторыми стилями программирования. Когда же проектируют и программируют разные люди, тогда различия в их опыте, предпочтениях, культуре и знаниях почти наверняка породят ошибки, не- элегантность и неэффективность результирующей системы. Что может дать язык программирования проектировщику? Он может предоставить средства, позволяющие непосредственно выразить ключевые концепции системы с их помощью.
Это упрощает процесс программирования, позволяет легче следить за соответствием между проектом и реализацией, улучшает взаимопонимание между проектировщиками и программистами и позволяет создать более качественные инструменты поддержки, как первых, так и вторых. Например, большинство методов проектирования концентрируется на взаимозависимостях между разными частями программы (обычно, стараясь минимизировать и точно определить эти зависимости). Язык, позволяющий явным образом выразить интерфейсы взаимодействия между разными частями программы, непосредственно поддерживает такую озабоченность проектировщиков.
Он гарантирует, что нет никаких других зависимостей, кроме явно оговоренных. Из-за того, что зависимости явно представлены в коде программы, облегчается создание автоматизированных инструментов, читающих код и строящих наглядные диаграммы зависимостей. Это радикально облегчает работу проектировщиков и всех людей, нуждающихся в изучении структуры программы. Язык С++ — как раз такой язык, который 24.2 Проектирование и язык программирования 851 помогает уменьшить естественный зазор между проектом и программным кодом, и тем самым, уменьшить путаницу и недоразумения.
Ключевое понятие языка Сч-+ — класс. Класс — это тип. Наряду с пространствами имен классы являются механизмом сокрытия информации. Программы могут быть представлены в терминах пользовательских типов данных и их иерархий. И встроенные типы, и типы данных, определяемые пользователем, подчиняются правилам статической проверки типов. Виртуальные функции обеспечивают механизм динамического (позднего) связывания без нарушения правил статической типизации. Шаблоны поддерживают проектирование параметризованных типов.
Исключения предоставляют регулярный способ обработки ошибок времени выполнения. И все эти возможности языка С++ не требуют дополнительных затрат памяти и времени по сравнению с программами на языке С. Перечисленные средства относятся к основным средствам языка, которые проектировщик должен хорошо знать и принимать во внимание.