Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора 130стр.doc
Скачиваний:
93
Добавлен:
15.06.2014
Размер:
2.49 Mб
Скачать

35) Технологии конструирования по

Классический жизненный цикл ПО:

Лесенка-водопад

Возврат на след. этап

1) Сист. анализ: происходит попытка понять то, что надо заказчику.

2) Анализ требований: результат использования специализированных языков.

3) Проектирование: построение архитектуры, блоков, согической структуры, структур данных, алгоритмов.

4) Кодирование: перенос диаграмм описания на язык программирования.

5) Тестирование: функциональное (работает или нет), нагрузочное (время работы, объем данных).

6) Сопровождение: описывается программная документация, время разработки, технология других работ.

Спиральная модель

Каждый виток – новая версия программного продукта.

Макетирование – как можно быстрее получить законченную версию программного продукта.

Вначале все делается «на соплях». Заказчику хочется быстрее получить продукт -> 3 версии:

1-я – самая первая с кучей глюков, с осн требованиями; 2-я версия – основа для исправления упущений; 3-я версия – итоговая.

!Опасность. Не допустить ошибку на этапе сист анализа.

Быстрая разработка приложений (RAD).

Цель – уменьшить спиральный цикл за счет готовых уже прог, их доработка.

Методика экстремального программирования

Основные идеи метода: игра-пиалирование, частая смена версий, метафора, простое проектирование, тестирование, реорганизация, парное программирование, компактное владение кодом, непрерываемая интеграция, 40-часовая неделя, локальный заказчик, стандартное кодирование.

36) Шаблоны классов и функций

Шаблоны классов C++ обеспечивают лучший способ генерирования общих объявлений классов. Шаблоны обеспечивают параметризованные типы, т.е. возможность передачи имени типа в качестве аргумента, который содержит в себе указание для создания класса или функции. Например, передавая имя типа int шаблону Queue, можно заставить компилятор создать класс Queue для формирования очереди объектов int.

Определение шаблона класса

В качестве основы для создания шаблона используем класс Stack, описывающий стек.

При применении шаблона определение Stack будет заменено определением шаблона, а функции-элементы Stack — функциями-элементами шаблона. Шаблон класса необходимо предварять кодом следующего вида:

template <class Type>

Ключевое слово template сообщает компилятору, что вы собираетесь определять шаблон. Конструкция в угловых скобках аналогична списку аргументов функции. Ключевое слово class в данном случае выступает в качестве имени типа переменной, которая принимает тип в качестве значения, a Type — представляет имя этой переменной.

В данном случае использование ключевого слова class не означает, что Type должен быть классом; это означает лишь то, что Type служит в качестве общего спецификатора типа, который при использовании шаблона будет заменяться реальным типом. Более новые реализации позволяют в этом контексте вместо ключевого слова class использовать более понятное ключевое слово typename:

template <typename Type> //более новый вариант

В позиции Type можно применять свой вариант общего имени типа; при указании имени действуют те же правила, что и при указании любого другого идентификатора. Наиболее часто используются Т и Type; мы будем применять последнее. При вызове шаблона Type будет заменяться конкретным значением типа, таким как int или String. Внутри определения шаблона общее имя типа используется для идентификации типа, который должен быть сохранен в стеке. Для случая Stack это означало бы использование Type везде, где в старом объявлении применялся бы идентификатор long. Например,

long items[MAX]; //содержит элементы стека

становится следующим:

Type items[MAX]; //содержит элементы стека

Аналогично, методы исходного класса можно заменить функциями-элементами шаблона. Заголовок каждой функции будет предварен тем же самым объявлением шаблона:

template <class Type>

Если метод определяется внутри объявления класса (встроенное определение), то можно опускать префикс шаблона и спецификатор класса.

шаблоны класса и функций-элементов не являются определениями класса и функций-элементов. Они служат инструкциями для компилятора C++ относительно генерирования определений класса и функции-элемента. Конкретная актуализация шаблона, такого как класс стека для обработки объектов String, называется созданием экземпляра или специализацией. Если только вы не располагаете компилятором, в котором реализовано новое ключевое слово export, размещение шаблонной функции-элемента в отдельном файле реализации будет невозможно. Поскольку шаблоны не являются функциями, они не могут компилироваться отдельно. Шаблоны должны использоваться совместно с запросами о конкретных экземплярах шаблонов. Проще всего поместить всю информацию шаблона в заголовочный файл и включить его в файл, в котором будут использоваться шаблон;

Использование шаблонного класса

Для создания шаблонного класса недостаточно просто включить в программу шаблон. Необходимо создать его экземпляр. Для этого следует объявить объект типа шаблона класса, заменив общее имя типа конкретным желаемым типом. Вот, например, как можно было бы создать два стека: один — для накопления объектов int и другой — д,и накопления объектов String:

Stack<int> kernels; //создает стек int

Stack<String> colonels; //создает стек объектов String

Получив эти два объявления, компилятор будет следовать инструкциям, приведенным в шаблоне Stack<Type>, чтобы сгенерировать два отдельных объявления класса и два отдельных набора методов класса. Объявление класса Stack<int> полностью заменит Type на int, в то время как объявление класса Stack<string> полностью заменит Type на String. Конечно, используемые алгоритмы должны соответствовать типам. Например, класс стека предполагает, что можно присваивать один элемент другому. Это предположение справедливо для основных типов, структур и классов (если только оператор присваивания не сделан собственным), но не для массивов.

Общие идентификаторы типа, такие как Type в вышеприведенном примере, называются параметрами типа, т.е. они действуют как переменная, но вместо числового значения им присваивается тип. Так, в вышеприведенном объявлении kernel параметр типа Type имеет значение int.

Обратите внимание на то, что требуемый тип нужно поддерживать явно.