Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 182
Текст из файла (страница 182)
«Невский Диалект». 1998. С. Н. Паркинсон. Законы Паркинсона. Минск.. Поппури». 1997. [РагЫпзогь 1957) 23.7. Советы [1] Поймите, чего вы хотите добиться; 9 23.3. [2] Всегда помните, что разработка программного продукта — человеческая деятельность; 9 23.2, н 23.5.3. [3] Доказательство по аналогии — это обман; 9 23.4. [4) Поставьте себе четкие и осязаемые цели; 9 23.4. [5] Не применяйте технические приемы для решения социальных задач; 9 23.4, [6) В проектировании и в обращении с людьми учитывайте деятельность за большой период времени; й 23.4.1, з 23.5.3. [7) Нет нижнего предела размера программ, для которых имеет смысл создать проект, прежде чем начинать писать код; 9 23.2. [8] Проектируйте процесс так, чтобы поощрять обратную связь; в 23А. [9) Не путайте бурную деятельность с продвижением к цели; 9 23.3, 9 23А.
[10] Не обобщайте болыпе, чем нужно, больше, чем вам позволяет опыт, и больше, чем вы можете протестироватгя 9 23А.1, 9 23А.2. [11) Представляйте основные понятия в виде классов; 9 23.4.2, 9 23А.3.1. [12] Существуют свойства системы, которые нельзя представить в виде классов; в 23.4.3.1. [13] Представляйте иерархические взаимоотношения между понятиями в виде иерархии классов; 9 2ЗА.3.1.
[14] Лктивно ищите общность в понятиях прикладной области и реализации и представляйте найденные более общие понятия в виде базовых классов; ~ 23.4.3.1, ~ 23А.3.5. [15] Классификация в других областях не обязательно является полезной классификацией в модели наследования прикладной программы; й 23,4.3.1. [16] Проектируйте иерархию классов, основываясь ца поведении и инвариантах; 9 23.4.3.1, 9 23А.3.5, 9 24.3:7.1.
23.7. Советы 795 [17) [18) . [19) [20) [21) [22) [23) [24) [25) [26] [27) [28) [29) [30) [31) [32) [ЗЗ) [34) [35) [36) [37) [38) Рассмотрите случаи использования; 9 23.4.3.1. Рассмотрите возможность использования СКС-карточек; 9 2ЗА.3.1. Используйте в качестве модели существующие системы, это послужит источ- никам вдохновения и хорошей отправной точкой; 9 23.4.3.6.
Опасайтесь конструирования на уровне наглядных схем; 9 23А.3.1. Отбросьте прототип до того, как он станет помехой; 9 23АА. Закладывайте в проект возможность изменения; сосредоточьтесь на гибкости, способности к расширению, переносимости и повторному использованию; 9 2ЗА.2, Сосредоточьтесь на проектировании компонент; 9 23.4.3. Воспользуйтесь к.лассами для представления основных понятий; 9 23А.3.1.
Проектируйте стабильность при неизбежности изменении; 9 23А.2. Стабилизируйте проект, сделав интенсивно используемые интерфейсы мини- мальными, общими и абстрактными; 9 23.4.3.2, 9 23.4.3.5. Не давайте проекту разрастись, Не добавляйте свойств чпросто на всякий слу- чай»; 9 2ЗА.3.2.
Всегда рассматривайте альтернативные представления класса. Если нет аль- тернативных представлений, то класс, по всей вероятности, не представляет собой чистого понятия; 9 23А.3.4. Многократно пересматривайте и уточняйте проект и реализацию; 9 23АВА. Для тестирования и анализа проблемы, проекта и реализапии пользуйтесь са- мыми лучшими доступными средствами; 9 23.3, 9 23.4.1, 6 23.4А.
Экспериментируйте, анализируйте и тестируйте как можно раньше и как мож- но чаше; з 23А.4, з 23.4.5. Не забывайте об эффективности; 9 23А.7. Уровень формальности должен соответствовать масштабу проекта; 9 23.5.2. Убедитесь, что кто-то отвечает за проект в целом; 9 23.5.2. Документируйте, пропагандируйте и поддерживайте повторно используе- мые компоненты; 9 23.5.1, Документируйте задачи и принципы наравне с деталями; 9 23,4.6.
В качестве части документации напишите руководство для новых разработчи- ков; 9 23А.6. Награждайте и поощряйте повторное использование проектов, библиотек и классов; 9 23.5.1. Проектирование и программирование Пусть это будет просто: просто, как только можно, но ие проис. — Л.
Эииттеин Проектирование и язык программирования — классы — наследование -- проверка типов — программирование — что представляют классы? — иерархия классов— зависимости — включение — включение и наследование — альтернативы проектирования — использование отношений — запрограммированные отношения — инварианты — утверждения — инкапсуляция — компоненты— шаблоны — интерфейсы и реализации — советы. 24.1. Обзор В этой главе рассматривается, каким образом языки программирования вообще и С++ в частности мокнут поддержать проектирование: з 24.2 Фундаментальная роль классов, иерархии классов, проверки типа и собственно программирования.
4 24.3 Использование классов и иерархии классов, фокусирующееся на взаимозависимости между разными частями программы. з 24.4 Понятие колтонентьн которая является основной единицей проектирования, и некоторые практические размьппления о том, как выражать интерфейсы. Более общее рассмотрение вопросов проектирования приведено в главе 23, а различные применения классов подробно рассматриваются в главе 25. 24.2. Проектирование и язык программирования Если бы мне пришлось строить мост, я бы серьезно задумался, нз какого материала его построить.
Сам проект моста в большой степени зависит от выбора материала и наоборот.,Разумный проект каменного моста отличается от разумного проекта стального моста, деревянного моста и т. п. Не" думаю, что я смог бы выбрать правильный материал, ничего не зная о различных материалах и их использовании. Естествевпо, чтобы спроектировать деревянный мост, вам не нужно быть искусным плотником, но чтобы выбрать между деревом и сталью для постройки моста, нужно знать основные 798 Глава 24. Проектирование и программирование сведения о деревянных конструкциях.
Более того, несмотря на то, что для проектирования моста вам самому не нужно быть хорошим плотником, вам понадобится тонкое знание свойств дерева и нравов плотников. Аналогично, чтобы выбрать язык для некоторого программного продукта, вам нужно быть знакомым с несколысими языками, а чтобы успешно спроектировать часть программного продукта, необходимо довольно хорошо знать выбранный для реализации язык -- даже если сами вы ие напишете ни строчки программы. Хороший проектировщик мостов учитывает свойства материалов и использует их для улучшения проекта.
Аналогично, хороший проектировщик программных продуктов строит проект, полагаясь на сильные стороны языка реализации, и — насколько возможно— избегает такого использования данного языка, которое может вызвать затруднения у тех, кто реализует проект. Кто-то может подумать, что зта чувствительность к выбору языка приходит естественным путем, когда в разработке участвует единственный проектировщик/программист. Однако даже в таких случаях программист может соблазниться не тем языком из-за недостаточного опыта или чрезмерного уважения к стилю программирования, привычного для совершенно других языков.
Когда проектировщик отличается ат программиста — и особенна, если они не воспитаны в рамках некой общей культуры — можно говорить не о вероятности, а предопределенности того, что в получившейся системе будут ошибки, а сама система получится неизящной и незффектпвной. Так что же значит для проектировщика язык программирования? Он может предоставить механизмы, которые позволят выразить проектные понятия прямо иа языке программирования. Это облегчает реализацию, поддержание соответствия между проектом и реализацией, лучшее взаимопонимание между проектировщиками и исполнителями реализации, а также позволяет создать лучшие инструментальные средства в помощь тем и другим.
Например, большинство методов проектирования тщательно изучают взаимозависимости между разнымп частями програмхзы (обычно стремясь свести их к мили- муму и сделать так, чтобы они были четко определены и понятны). Язык, поддерживающий явные интерфейсы между разными частями программы, может отразить соответствующие понятия проекта. Он может гарантировать, что существуют только ожидаемые зависимости. Когда многие зависимости выражены явно в коде, написанном на таком языке, можно предоставить средства, которые бы читали программу и составляли карту зависимостей. Это облегчает работу проектировщиков и всех тех, кому нужно разобраться в структуре программы.
Такой язык программирования как С++, можно использовать для уменыпения разрыва между проектированием и программированием, а следовательно, для уменьшения возможной путаницы и устранения недоразумений. Ключевое понятие С++ — класс. Класс в С++ — это тип. Наряду с пространствами имен классы также являются механизмом сокрытия информации. Программы можно определить в терминах типов, определяемые пользователем, и иерархии таких типов. И встроенные типы, и типы, определяемые пользователем, подчиняются правилам статической проверки типов. Виртуальные функции обеспечивают механизм динамического связывания без нарушения правил статической типизации.
Шаблоны поддерживают проектирование параметризованных типов. Исключения обеспечивают более регулярный способ обработки ошибок. Данные особенности С++ можно использовать, 799 24.2. Проектирование и язык программирования не внося дополнительных затрат времени и памяти по сравнению с программами на С. Это основные свойства С++, и проектировщик должен их понять и учитывать. Кроме того, сильно повлиять на проектирование могут общедоступные основные библиоте- ки — такие как библиотеки матриц, интерфейсы к базам данных, библиотеки графи- ческого интерфейса пользователя и библиотеки поддержки параллелизма. Страх перед новым ведет к неоптимальному использованию С++. К этому же ведет неправильное применение опыта, накопяенного в других языках, системах и приклад- ных областях. Ухудшить проект могут также неадекватные средства проектирования. Стоит упомянуть пять ошибок проектирования, которые не позволяют воспользовать- ся преимуществами языка и учесть его о1раничения: [1) Отказ ат классов; в результате проект выражается так, что при реализации приходится пользоваться только подмножеством языка, совместимым с С.
[21 Отказ от производных классов и виртуальных функций, использование только подмножества языка, связанного с абстракцией данных. [31 Отказ от статической проверки типов; в результате проект выражается так, чт. приходится реализовать его, симулируя динамическую проверку типов. (41 Отказ от программирования и выражение системы таким образом, чтобы исключить программистов. (51 Отказ от всего, кроме иерархии классов, Эти ошибки характерны соответственно для проектировщиков: (11 имеющих опыт работы с С, традиционным САЯЕ-проектированием и структурированным проектированием; [21 имеющих опыт работы с Аг[а83 и У1зца! Вагйс или активно использовавших абстракцию данных; [3] имеющих опыт работы со Яша1!га(к или Е1зр; [41 имеющих опыт работы в нетехнических или сугубо специализированных областях; (5~ сильно увлекающихся упором на «чистое» объектно-ориентированное программирование.