- •Джесс Либерти
- •Об авторе
- •Посвящение
- •Благодарности
- •Введение
- •Для кого эта книга
- •Неделя №1 Основные вопросы
- •Несколько слов для программистов на языке c
- •Что дальше
- •День 1-й. Первые шаги Введение
- •Программы
- •Решение многих проблем
- •Процедурное, структурированное и объектно-ориентированное программирование
- •Инкапсуляция
- •Наследование и многократное использование
- •Полиморфизм
- •Нужно ли сначала изучить язык c
- •Стандарт ansi
- •Подготовка к программированию
- •Среда разработки
- •Компиляция исходного кода программы
- •Создание исполняемого файла с помощью компоновщика
- •Цикл разработки
- •Построение проекта приветствия
- •Ошибки компиляции
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •Кратко об объекте cout
- •Комментарии
- •Виды комментариев
- •Использование комментариев
- •Напоследок предупреждение: осторожнее с комментариями!
- •Функции
- •Использование функций
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 3-й. Переменные и константы
- •Что такое переменная
- •Резервирование памяти
- •Размер целых
- •Знаковые и беззнаковые типы
- •Базовые типы переменных
- •Определение переменной
- •Чувствительность к регистру букв
- •Ключевые слова
- •Создание нескольких переменных одного типа
- •Присваивание значений переменным
- •Ключевое слово typedef
- •В каких случаях следует использовать типы short и long
- •Переполнение беззнаковых целых
- •Переполнение знаковых целочисленных значений
- •Символы
- •Символы и числа
- •Специальные символы
- •Константы
- •Литеральные константы
- •Символьные константы
- •Определение констант с помощью директивы #deiine
- •Определение констант с помощью ключевого слова const
- •Константы перечислений
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 4-й. Выражения и операторы
- •Выражения
- •Символы пробелов
- •Блоки и комплексные варажения
- •Операции
- •Операторы
- •Оператор присваивания
- •Математические операторы
- •Целочисленное деление и деление по модулю
- •Совместное использование математических операторов с операторами присваивания
- •Инкремент декремент
- •Префикс и постфикс
- •Приоритеты операторов
- •Вложение круглых скобок
- •Что такое истинно
- •Операторы отношений
- •Оператор if
- •Использование отступов в программных кодых
- •Ключевое слово else
- •Сложные конструкции с if
- •Использование фигурных скобок для вложенных операторов if
- •Логические операторы
- •Логическое и
- •Логическое или
- •Логическое нет
- •Вычисление по сокращенной схеме
- •Приоритеты операторов отношений
- •Подробнее об истине и лжи
- •Условный оператор
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 5-й. Функции
- •Что такое функция
- •Возвращаемые значения, параметры и аргументы
- •Объявление и определение функций
- •Объявление функции
- •Прототипы функций
- •Определение функции
- •Выполнение функций
- •Локальные переменные
- •Глобальные переменные
- •Глобальные переменные; будьте начеку
- •Подробнее о локальных переменных
- •Операторы, используемые в функциях
- •Подробнее об аргументах функций
- •Использование функций в качестве параметров функций
- •Параметры - это локальные переменные
- •Подробнее о возвращаемых значениях
- •Значения параметров, используемые по умолчанию
- •Перегрузка функций
- •Дополнительные сведения о функциях
- •Подставляемые inline-функции
- •Рекурсия
- •Работа функций - приподнимаем завесу тайны
- •Уровни абстракции
- •Разбиение памяти
- •Стек и функции
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 6-й. Базовые классы
- •Создание новых типов
- •Зачем создавать новый тип
- •Классы и члены классов
- •Объявление класса
- •Несколько слов об используемых именах
- •Определение объекта
- •Классы в сравнении с объектами
- •Получение доступа к членам класса
- •Значения присваиваются объектам, а не классам
- •Что объявишь, то и будешь иметь
- •Ограничение доступа к членам класса
- •Оставьте данные класса закрытыми
- •Ограничение доступа к данным - это не способ защиты данных, а лишь средство облегчения программирования
- •Определение методов класса
- •Конструкторы и деструкторы
- •Конструкторы и деструкторы, заданные по умолчанию
- •Использование конструктора, заданного по умолчанию
- •Объявление функций-членов со спецификатором const
- •Чем отличается интерфейс от выполнения класса
- •Где следует распологать в программе объявления классов и определения методов
- •Выполнение с подстановкой
- •Классы содержащие другие классы в качестве данных-членов
- •Структуры
- •Почему два ключевых слова несут одинаковую смысловую нагрузку
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 7-й. Циклы
- •Организация циклов
- •История оператора goto
- •Почему следует избегать оператора goto
- •Организация циклов с помощью оператора while
- •Сложные конструкции с оператором while
- •Операторы break и continue
- •Использование конструкции while(true)
- •Организация циклов с помощью конструкции do...While
- •Использование конструкции do...While
- •Оператор for
- •Сложные выражения с оператором for
- •Множественные инициализации и приращения счетчиков цикла
- •Нулевые параметры цикла for
- •Использование пустых циклов for
- •Вложенные циклы
- •Область видимости переменных-счетчиков циклов for
- •Обобщение сведений о циклах
- •Оператор switch
- •Обработка комманд менб с помощью оператора switch
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •Подведение итогов
- •Итоги первой недели
- •Неделя №2 Основные вопросы
- •Что дальше
- •День 8-й. Указатели
- •Что такое указатель
- •Использование указателя как средства хранения адреса
- •Имена указателей
- •Оператор разыменовывания
- •Указатели, адреса и переменные
- •Обращение к данным через указатели
- •Использование адреса, хранящегося в указателе
- •Для чего нужны указатели
- •Память стековая и динамически распределяемая
- •Оператор new
- •Оператор delete
- •Что такое утечка памяти
- •Размещение объектов в области динамической памяти
- •Удаление объектов
- •Доступ к членам класса
- •Динамическое размещение членов класса
- •Указатель this
- •Блуждающие, дикие или зависшие указатели
- •Использование ключевого слова const при объявлении указателей
- •Использование ключевого слова const при объявлении указателей и функций-членов
- •Указатель const this
- •Вычисления с указателями
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 9-й. Ссылки
- •Что такое ссылка
- •Использование оператора адреса (&) при работе со ссылками
- •Ссылки нельзя переназначать
- •На что можно ссылаться
- •Нулевые указатели и нулевые ссылки
- •Передача аргументов функций как ссылок
- •Передача указателей в функцию swap()
- •Передача ссылок в функцию swap()
- •Представления о заголовках функций и прототипах
- •Возвращение нескольких значений
- •Возвращение значений с помощью ссылок
- •Передача ссылок на переменные как средство повышения эффективности
- •Передача константного указателя
- •Ссылки в качестве альтернативы
- •Когда лучше использовать ссылки, а когда - указатели
- •Коктейль из ссылок и указателей
- •Не возвращайте ссылку на объект, который находиться вне области видимости!
- •Возвращение ссылки на в области динамического обмена
- •А где же уазатель?
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 10-й. Дополнительные возможности использования функции
- •Перегруженные функции-члены
- •Использование значений, заданных по умолчанию
- •Выбор между значениями по умолчанию и перегруженными функциями
- •Конструктор, принятый по умолчанию
- •Перегрузка конструкторов
- •Инициализация объектов
- •Конструктор-копировщик
- •Перегрузка операторов
- •Запись Функции инкремента
- •Перегрузка префиксных операторов
- •Типы возвратов перегруженных функций операторов
- •Возвращение безымянных временных объектов
- •Использование указателя this
- •Перегрузка постфиксных операторов
- •Различия между преинкрементном и постинкрементном
- •Оператор суммирования
- •Перегрузка оператора суммирования
- •Основные принципы перегрузки операторов
- •Ограничения перегрузки операторов
- •Что можно перегружать
- •Оператор присваивания
- •Операторы преобразований
- •Операторы преобразования типов
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 11-й. Наследование
- •Что такое наследование
- •Иерархия и наследование
- •Царство животных
- •Синтаксис наследования классов
- •Закрытый или защищенный
- •Конструкторы и деструкторы
- •Передача аргументов в базовые конструкторы
- •Замещение функций
- •Сокрытие метода базового класса
- •Вызов базового метода
- •Виртуальные методы
- •Как работают виртуальные методы
- •Нельзя брать там, находясь здесь
- •Дробление объекта
- •Виртуальные деструкторы
- •Виртуальный конструктор-копировщик
- •Цена виртуальности методов
- •Вопросы и ответы
- •Коллоквиум
- •Упражнения
- •День 12-й. Массивы и связанные листы
- •Что такое массивы
- •Элементы массива
- •Вывод данных за пределами массива
- •Ошибки подсчета столбцов для забора
- •Инициализация массива
- •Объявление массивов
- •Массивы объектов
- •Многомерные массивы
- •Инициализация многомерного массива
- •Несколько слов о памяти
- •Массивы указателей
- •Объявление массивов в области динамического обмена
- •Указатель на массив или массив указателей
- •Имена массивов и указателей
- •Удаление массива из области динамической памяти
- •Массивы символов
- •Функции strcpy() и strncpy()
- •Классы строк
- •Связанные списки и другие структуры
- •Общие представления о связанных списках
- •Делегирование ответственности
- •Компоненты связанных списков
- •Что мы узнали в этой главе
- •Классы массивов
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 13-й. Полиморфизм
- •Проблемы с одиночным наследованием
- •Перенос метода вверх по иерархии классов
- •Приведение указателя к типу производного класса
- •Добавление объекта в два списка
- •Множественное наследование
- •Из каких частей состоят объекты, полученные в результате множественного наследования
- •Конструкторы классов, полученных в результате множественного наследования
- •Двусмысленность ситуации
- •Наследование от общего базового класса
- •Виртуальное наследование
- •Проблемы с множественным наследованием
- •Классы-мандаты
- •Абстрактные типы данных
- •Чистые виртуальные функции
- •Выполнение чистых виртуальных функций
- •Сложная иерархия абстракций
- •Когда следует использовать абстрактные типы данных
- •Логика использования абстрактных классов
- •Пара слов о множественном наследовании, абстрактных типах данных и языке Java
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 14-й. Специальные классы и функции
- •Статические переменные-члены
- •Статические функции-члены
- •Указатели на функции
- •Зачем нужны указатели на функции
- •Массивы указателей на функции
- •Передача указателей на функции в другие функции
- •Использование typedef с указателями на функции
- •Указатели на функции члены
- •Массивы указателейна функции-члены
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •Подведение итогов
- •Неделя №3 Основные вопросы
- •Что дальше
- •День 15-й. Дополнительные возможности наследования
- •Вложение
- •Доступ к членам вложенного класса
- •Фильтрация доступа к вложенным классам
- •Цена вложений
- •Передача объекта как значения
- •Различные пути передачи функциональности классу
- •Делегирование
- •Закрытое наследование
- •Классы друзья
- •Функции друзья
- •Функции друзья и перегрузка оператора
- •Перегрузка оператора вывода
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 16-й. Потоки
- •Знакомство с потоками
- •Инкапсуляция
- •Буферизация
- •Потоки и буферы
- •Стандартные объекты ввода-вывода
- •Переадресация
- •Вывод данных с помощью cin
- •Проблемы, возникающие при вводе строк
- •Другие методы объекта cin
- •Ввод одного символа
- •Использование функции gef() без параметров
- •Использование функции get() с параметром
- •Ввод строк со стандартного устройства ввода
- •Использование функции cin.Ignore()
- •Функции-члены peek() и putback()
- •Ввод данных с помощью cout
- •Очистка буфера вывода
- •Функции-члены объекта cout
- •Манипуляторы, флаги и команды форматирования
- •Использование функции cout.Width()
- •Установка символов заполнения
- •Установка флагов
- •Сравнение потоков и функции printf()
- •Использование файлов для ввода и вывода данных
- •Объекты ofstream
- •Состояния условий
- •Открытие файлов для ввода-вывода
- •Настройка открытия файла объектом ofstream
- •Двоичные и тектовые файлы
- •Установка параметров ввода-вывода с помощью коммандной строки
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 17-й. Пространства имен
- •Введение
- •Вызов по имени функций и классов
- •Создание пространства имен
- •Объявление и определение типов
- •Объявление функций за пределами пространства имен
- •Добавление новых членов
- •Вложения пространства имен
- •Использование пространства имен
- •Ключевое слово using
- •Использование using как оператора
- •Использование using в объявлениях
- •Псевдонимы пространства имен
- •Неименованные пространства имен
- •Стандартное пространство имен std
- •Вопросы и ответы
- •Построение моделей
- •Проектирование программ: язык моделирования
- •Процесс проектирования программ
- •Анализ требований
- •Ситуация использования
- •Определение пользователей
- •Определение первой ситуации использования
- •Создание модели домена
- •Обобщение
- •Вложение
- •Ассоциация
- •Разработка сценариев
- •Разработка путеводителей
- •Диаграммы взаимодействий
- •Создание пакетов
- •Анализ совместимости приложения
- •Анализ существующих систем
- •Прочая документация
- •Визуализация
- •Артефакты
- •Проектирование
- •Что такое классы
- •Преобразования
- •Другие преобразования
- •Обработка данных
- •Устройства
- •Статическая модель
- •Карточки crc
- •Как проводить заседания с карточками
- •Сфокусируемся на распределении ответственности
- •Как сделать класс живым
- •Ограничения карточек crc
- •Создание модели uml no картонкам crc
- •Отношения между классами
- •Множественное наследование против вложения
- •Дискриминаторы и силовые классы
- •Динамическая модель
- •Диаграммы переходов состояний
- •Сверхсостояния
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 19-й. Шаблоны
- •Что такое шаблоны
- •Параметризованные типы
- •Создание экземпляра шаблона
- •Объявление шаблона
- •Использование имени шаблона
- •Выполнение шаблона
- •Функции шаблона
- •Шаблоны и друзья
- •Дружественные классы и функции, не являющиеся шаблонами
- •Дружественный класс или функция как общий шаблон
- •Использование экземпляров шаблона
- •Специализированные функции
- •Статические члены и шаблоны
- •Стандартная библиотека шаблонов
- •Контейнеры
- •Последовательные контейнеры
- •Контейнер двухсторонней очереди
- •Очередь
- •Ассоциативные контейнеры
- •Другие ассоциативные контейнеры
- •Классы алгоритмов
- •Операции, не изменяющие последовательность
- •Алгоритмы изменения последовательности
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 20-й. Отслеживание исключительных ситуаций и ошибок
- •Ошибки, погрешности, ляпусы и "гнилой" код
- •Исключительные ситуации
- •Несколько слов о "гнилом" коде
- •Исключения
- •Как используются исключения
- •Использование блоков try и catch
- •Перехват исключений
- •Использование нескольких операторов catch
- •Наследование исключений
- •Данные в классах исключений и присвоение имен объектам исключений
- •Исключения и шаблоны
- •Исключения без ошибок
- •Ошибки и отладка программы
- •Точка останова
- •Анализ значений переменных
- •Исследование памяти
- •Код ассемблера
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 21-й. Что дальше
- •Процессор и компилятор
- •Просмотр промежуточного файла
- •Использование директивы #define
- •Использование директивы #define для создания констант
- •Использование директивы #define для тестирования
- •Комманда препроцессора #else
- •Включение файлов и предупреждение ошибок включения
- •Макросы
- •Зачем нужны все эти круглые скобки
- •Макросы в сравнении с функциями шаблонов
- •Подставляемые функции
- •Операции со строками
- •Оператор взятия в кавычки
- •Конкатенация
- •Встроенные макросы
- •Макрос assert()
- •Оладка программы с помощью assert()
- •Макрос assert() вместо исключений
- •Побочные эффекты
- •Инварианты класса
- •Печать промежуточных значений
- •Уровни отладки
- •Операции с битами данных
- •Сброс битов
- •Инверсия битов
- •Битовые поля
- •Стиль программирования
- •Отступы
- •Фигурные скобки
- •Длинные строки
- •Конструкции с оператором switch
- •Текст программы
- •Имена идентификаторов
- •Правописание и использование прописных букв в именах
- •Комментарии
- •Организация доступа к данным и методам
- •Определения классов
- •Включение файлов
- •Макрос assert()
- •Ключевое слово const
- •Сделаем еще один шаг вперед
- •Где получить справочную информацию и советы
- •Журналы
- •Выскажите свое мнение о книге
- •Вопросы и ответы
- •Коллоквиум Контрольные вопросы
- •Упражнения
- •Подведение итогов
- •Приложение а Приоритеты операторов
- •Приложение б
- •Приложение в Двоичные о числа
- •Другие системы счисления
- •Еще об основаниях
- •Двоичная система счисления
- •Почему именно основание 2
- •Биты, байты и полубайты
- •Что такое килобайт
- •Двоичные числа
- •Шестнадцатерична система счисления
- •Приложение г - Ответы День 1 Контрольные вопросы
- •Упражнения
- •День 2 Контрольные вопросы
- •Упражнения
- •День 3 Контрольные вопросы
- •Упражнения
- •День 4 Контрольные вопросы
- •Упражнения
- •День 5 Контрольные вопросы
- •Упражнения
- •День 6 Контрольные вопросы
- •Упражнения
- •День 7 Контрольные вопросы
- •Упражнения
- •День 8 Контрольные вопросы
- •Упражнения
- •День 9 Контрольные вопросы
- •Упражнения
- •День 10 Контрольные вопросы
- •Упражнения
- •День 11 Контрольные вопросы
- •Упражнения
- •День 12 Контрольные вопросы
- •Упражнения
- •День 13 Контрольные вопросы
- •Упражнения
- •День 14 Контрольные вопросы
- •Упражнения
- •День 15 Контрольные вопросы
- •Упражнения
- •День 16 Контрольные вопросы
- •Упражнения
- •День 17 Контрольные вопросы
- •Упражнения
- •День 18 Контрольные вопросы
- •Упражнения
- •День 19 Контрольные вопросы
- •Упражнения
- •День 20 Контрольные вопросы
- •Упражнения
- •День 21 Контрольные вопросы
- •Упражнения
Процесс проектирования программ
Правильное выполнение анализа и проектирования объектно-ориентированной программы намного важнее, чем соблюдение соглашений языка моделирования. Именно этой тематики посвящено большинство публикаций и конференций. И если по поводу языка моделирования удалось прийти к общим соглашениям и выработать UML, то споры по поводу основополагающих принципов анализа и проектирования программ продолжаются по сей день.
Появилась даже новая профессия — методологи: это программисты, которые изучают и разрабатывают методы программирования. Часто в литературе можно встретить статьи, посвященные описанию нового метода программирования. Метод — это совокупность языка моделирования и подходов анализа и проектирования. Три наиболее известных методолога в мире — это Грейди Буч (Grady Booch), создавший метод Буча, Айвер Якобсон (Ivar Ja- cobson), разработавший подходы объектно-ориентированного программирования, и Джеймс Рамбо (James Rumbaugh), создавший технологию объектного моделирования. Вместе они создали метод Objectory~ коммерческий продукт от фирмы Rational Software, Inc. Это фирма, в которой они работают и где их любовно величают "три амигос".
Материал, изложенный на этом занятии, приблизительно следует методам Objectory. Точного соответствия не будет, так как я не верю в рабское следование академической теории. Я считаю создание конкурентно способной профессиональной программы более важным, чем точное соответствие этой программы каким бы то ни было абстрактным методам. В конце концов на Objectory свет клином не сошелся, и я рекомендую вам быть эклектиками и выбирать все лучшее из всех методов, которые вам известны.
Процесс проектирования программ итеративен. Это значит, что при разработке программы мы периодически повторяем весь процесс, по мере того как растет понимание требований, Проект нацелен на решение задачи, но нюансы, возникающие в ходе поиска оптимального решения, воздействуют на сам проект. Невозможно разработать серьезный крупный проект идя по прямой от начала до конца. Вместо этого на отдельных этапах приходится возвращаться к началу, постоянно совершенствуя интерфейсы и процедуры выполнения отдельных объектов.
Итеративную разработку следует отличать от каскадной, при которой выход из одной стадии становится входом в следующую и назад дороги нет (рис. 18.3). Этот процесс напоминает конвейер сборки автомобилей, где на каждом этапе собирается и тестируется один узел, постепенно формируя автомобиль. Но программа, в отличие от автомобиля, продукт штучный. Разработку программ редко удается поставить на конвейер.
При итеративном проектировании теоретик предлагает новую идею, а прикладник начинает творческую реализацию этой абстрактной идеи в программе. По мере того как начнут прорисовываться детали проекта, будут меняться наши представления о форме реализации исходной идеи. Работа над проектом начинается с формулирования требований к проекту, которые в ходе разработки могут меняться, что потребует внесения изменений в уже созданные программные блоки. Большой проект разбивается на отдельные блоки, для которых сначала создаются прототипы, а затем процедуры их выполнения. Тестирование выполнения отдельных модулей может привести к необходимости внесения изменений в их прототипы, а изменения отдельных блоков заставляют время от времени пересматривать принципы их взаимодействия в целом проекте.
Рис. 18.3. Каскадный процесс проектирования
Хотя цикличность работы над проектом очевидна, описать эти процессы в виде какого-то стабильного цикла довольно сложно. Поэтому предлагаю вам лишь логическую последовательность действий: возникновение идеи, анализ и осмысление ее, проектирование, программирование, тестирование и возвращение к тому этапу, который можно модернизировать. Таким образом, итеративность разработки проекта не заставляет вас кружить по замкнутому циклу, а позволяет творчески подойти к решению задач и возвращаться всякий раз к тому этапу, где вы видите возможность повысить эффективность выполнения программы.
Еще раз повторим последовательность действий.
1. Разработка концепции.
2. Анализ.
3. Проектирование.
4. Реализация.
5. Тестирование.
6. Возвращение.
Разработка концепции — это вынашивание чистой идеи, к сожалению, далекой от реальной жизни. Анализ — это процесс осознания требований к проекту. Проектирование — процесс формирования модели классов, на основе которой будет создаваться код. Реализация — написание кода (например, на C++); тестирование — проверка того, все ли в порядке, и возвращение — это шлифовка вашего продукта до того состояния, когда его можно будет отдать заказчику. Осталось реализовать все это на практике.
Идея
Любая гениальная программа начинается с идеи. Некто думает о продукте, который, с его точки зрения, было бы хорошо создать. Реже сногсшибательную идею выдают комитеты. На самой первой стадии анализа и проектирования объектно-ориентированного программного продукта эта самая идея должна быть зафиксирована одним предложением (в крайнем случае, кратким абзацем). Идея становится ведущим принципом разработки, и команда, собравшаяся для ее реализации, по мере продвижения вперед должна на нее оглядываться, а в случае необходимости и корректировать.
Дискуссии
Много спорят о том. что происходит на каждом этапе процесса итеративного проектирования, и даже о том, какназывается каждый этап. Откроем тайну: это не имеет значения. Основные этапы каждого процесса одни и те же: найдите, что надо постро- ить, спроектируйте решение и реализуйте проект.
Хотя на дискуссиях расцвели пышным цветом группы новостей и списки электронных адресов специалистов по объектнымтехнологиям, в сущности, объектно-ориентированный анализ и проектирование довольно просты. В этой главе описан практиче- ский подход к процессу создания архитектуры приложения.
Целью всей этой работы является создание кода, соответствующего установленным требованиям, а также отличающегося надежностью, расширяемостью и настраивае- мостью. Не менее важным является создание высококачественного продукта в уста- новленные сроки и в пределах бюджета.
Даже если новая идея исходит от группы товарищей из отдела маркетинга, кто-то все-таки должен стать "крестным отцом" этой идеи и блюсти ее чистоту. Из идеи проистекают требования к проекту. Детали исходной идеи могут преобразиться с учетом реалий сроков и требований рынка, но основная задача, которую планируется решить с помощью новой программы, должна оставаться неизменной, иначе зачем же браться за этот проект. Если в ходе проработки деталей вы забудете о том, ради чего был задуман проект, то такой проект обречен.
