Читаем Объектно-ориентированный анализ и проектирование с примерами приложений на С++ полностью

 ∙ setUnion   Объединяет с другим множеством. 

 ∙ intersection   Находит пересечение с другим множеством. 

 ∙ difference   Удаляет элементы, которые содержатся в другом множестве. 

 ∙ extent   Возвращает количество элементов в множестве. 

 ∙ isEmpty   Возвращает 1, если множество пусто. 

 ∙ isMember   Возвращает 1, если данный элемент принадлежит множеству. 

 ∙ isSubset   Возвращает 1, если множество является подмножеством другого множества. 

 ∙ isProperSubset   Возвращает 1, если множество является собственным подмножеством другого множества. 

  Подобным же образом можно определить протокол класса BinaryTree:  

clear   Уничтожает дерево и всех его потомков. 

 ∙ insert   Добавляет новый узел в корень дерева. 

 ∙ append   Добавляет к дереву потомка. 

 ∙ remove   Удаляет потомка из дерева. 

 ∙ share   Структурно делит данное дерево. 

 ∙ swapChild   Переставляет потомка с деревом. 

 ∙ child   Возвращает данного потомка. 

 ∙ leftChild   Возвращает левого потомка. 

 ∙ rightChild   Возвращает правого потомка. 

 ∙ parent   Возвращает родителя дерева. 

 ∙ setItem   Устанавливает элемент, ассоциированный с деревом. 

 ∙ hasChildren   Возвращает 1, если у дерева есть потомки. 

 ∙ isNull   Возвращает 1, если дерево нулевое. 

 ∙ isShared   Возвращает 1, если дерево структурно разделено. 

 ∙ isRoot   Возвращает 1, если дерево имеет корень. 

 ∙ itemAt   Возвращает элемент, ассоциированный с деревом. 

  Для схожих операций мы используем схожие имена. При разработке интерфейса мы также проверяем полученное решение на соответствие критериям достаточности, полноты и примитивности (см. главу 3).

Классы поддержки

При реализации класса, ответственного за манипуляции с текстовыми строками, мы столкнулись с тем, что возможностей, предоставляемых классами поддержки Bounded и Unbounded, явно недостаточно. Ограниченная форма, в частности, оказывается неэффективной для работы со строками с точки зрения памяти, так как мы должны инстанцировать эту форму в расчете на максимально возможную строку, и следовательно понапрасну расходовать память на более коротких строках. Неограниченная форма, в свою очередь, неэффективна с точки зрения быстродействия: поиск элемента в строке может потребовать последовательного перебора всех элементов связного списка. По этим причинам нам пришлось разработать третий, "динамический" вариант:  

∙ Динамический   Структура хранится в "куче" в виде массива, длина которого может уменьшаться или увеличиваться. 

  Структура хранится в "куче" в виде массива, длина которого может уменьшаться или увеличиваться.

Соответствующий класс поддержки Dynamic представляет собой промежуточный вариант по отношению к ограниченному и неограниченному классам, обеспечивающий быстродействие ограниченной формы (возможно прямое индексирование элементов) и эффективность хранения данных, присущую неограниченной форме (память выделяется только под реально существующие элементы).

Ввиду того, что протокол данного класса идентичен протоколу классов Bounded и Unbounded, добавление к библиотеке нового механизма не составит большого труда. Мы должны создать по три новых класса для каждого семейства (например, DynamicString, GuardedDynamicString и SynchronizedDynamicString). Таким образом, мы вводим следующий класс поддержки:

template class Dynamic { public:

Dynamic(unsigned int chunkSize);

protected:

Item* rep; unsigned int size; unsigned int totalChunks; unsigned int chunkSize; unsigned int start; unsigned int stop; void resize(unsigned int currentLength, unsigned int newLength, int preserve - 1); unsigned int expandLeft(unsigned int from); unsigned int expandRight(unsigned int from); void shrinkLeft(unsigned int from); void shrinkRight(unsigned int from);

};

Последовательности разбиваются на блоки в соответствии с аргументом конструктора chunkSize. Таким образом, клиент может регулировать размер будущего объекта.

Из интерфейса видно, что класс Dynamic имеет много общего с классами Bounded и Unbounded. Отличия в реализации трех типов классов каждого семейства будут минимальны.

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

Перейти на страницу:

Похожие книги

Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript
Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript

Данная книга посвящена программированию игр с помощью ActionScript. Здесь вы найдете подробные указания, необходимые для создания самых разных игр – аркад, головоломок, загадок и даже игровых автоматов. В тексте приведены исходные коды программ и детальные, доступно изложенные инструкции. Базовые принципы программирования ActionScript рассматриваются на примере игр, однако вы без труда сможете применить полученные знания и для разработки неигровых проектов, таких как Web-дизайн и реклама. Рекомендации Гэри Розенцвейга помогут вам не только придумывать занимательные игры и размещать их на Web-сайте, но и оптимизировать скорость их работы, а также защищать свои творения от несанкционированного копирования. Представленный в книге код несложно изменить для использования в других программах.Книга предназначена для широкого круга читателей – создателей анимационных роликов, художников-оформителей, программистов и разработчиков Web-сайтов. Издание может также выступать в качестве практического пособия по изучению ActionScript.

Гэри Розенцвейг

Программирование, программы, базы данных / Программирование / Книги по IT