Приложение 1. Пример разработки объектно-ориентированной программной системы
Для иллюстрации подходов, описанных в данном пособии, разработаем, с некоторыми упрощениями, информационную систему для приемной комиссии ВУЗ.
Основными задачами, которые должна решать разрабатываемая система, являются учет поступающих, формирование статистики и составление расписания вступительных экзаменов.
Проведем анализ требований и определим внешнее функционирование проектируемой системы и ее взаимодействия с внешним миром, путем построения диаграммы использования (рис П.1)
Рис П.1. Диаграмма использования ИС "Абитуриент"
Далее, определяем основные объекты системы и общую последовательность их взаимодействия. Для этого используем диаграммы последовательностей. Подобные диаграммы составляются для всех блоков использования.
На рис П.2. представлена диаграмма последовательностей для
блока использования "учет поданных заявок".Аналогичным образом формируются остальные диаграммы.
Рис. П.2. Диаграмма последовательностей для блока "Учет поданных заявлений"
Дальнейшие стадии разработки связанны с проектированием структуры объектов, определенных на этапе анализа.
Проведем разработку таблицы заявок, используемой для хранения информации о поступающих. Подобный элемент может быть выполнен, например, в виде хеш-таблицы.
Хэш-таблицы представляют собой структуру данных для хранения и быстрого поиска информации по символьному ключу. Например, дан список сотрудников предприятия, для каждого сотрудника задается дополнительная информация: табельный номер, специальность, и т.п. Ключом может являться фамилия сотрудника. Ключ отображается в номер записи по определенному правилу. Формула, по которой выполняется подобное преобразование называется хеш-функций. Для ключа √ строки символов, можно использовать перевод в целочисленное значение с помощью суммирования кодов символов и вычисления выполнение деления результата по модулю
N, где N - размер таблицы (количество ячеек). Этот, и все аналогичные методы приводят к частичной потере информации, т.е. различные ключи после их преобразования могут дать одинаковые целочисленные значения. Попытки сохранить такие элементы в одной таблице приведут к ошибке, так как оба элемента будут претендовать на одно и тоже место. Подобные случаи именуются конфликтами или коллизиями. Существуют различные способы разрешения конфликтов, например: двойное хеширование, добавление конфликтующего элемента в конец таблицы, ведение списка синонимов. Для хеш-таблицы определяются следующие основные операции:
- вставка новой записи,
- удаление записи,
- поиск записи по ключу.
Процедурная реализация хэш-таблиц имеет один важный недостаток - она не позволяет хранить в хэш-таблице разнотипную информацию. Наиболее типичная ситуация, требующая хранения разнородной информации - компилятор, в котором нужно хранить таблицу ключевых слов, переменных, подпрограмм и т.п. Каждый из перечисленных элементов имеет одинаковый ключ, им является идентификатор, но сопутствующая информация различна. Для переменной - это тип и адрес в памяти, для константы - тип и значение, зависящее от типа и т.д. Процедурная реализация потребует определения собственных подпрограмм для всех основных операций - включения, удаления, поиска и т.п.
Объектная реализация обеспечивает возможность один раз определить все функциональное поведение хэш-таблицы и далее легко добавлять новые элементы хранения без изменения исходного текста программы и даже без его перекомпиляции. Это связано с тем, что функциональное поведение хэш-таблицы зависит только от ключа и не зависит от сопутствующей информации.
Возвращаясь к проектированию таблицы заявлений в ИС "Абитуриент", определим необходимые классы, которые образуют данную таблицу.
Базовым элементом таблицы должен являться объект ⌠Элемент хэш-таблицы■. Этот класс имеет свойство ⌠ключ■ и метод поведения ⌠вычислить хэш-функцию■, и "отобразить информацию" (печать значения атрибута "ключ"):
объект
:элемент хэш-таблицы
атрибуты
:ключ : строка
методы
:вычислить хеш-функцию
отобразить информациюДалее необходимо определить абстрактную хэш-таблицу, задающую метод хранения элементов, и методы поиска, вставки и удаления элементов.
объект
:хэш-таблица
атрибуты
:массив элементов типа элемент хэш-таблицы
количество элементов : число
методы
:вставить элемент( элемент : элемент хэш-таблицы )
удалить элемент ( элемент : элемент хэш-таблицы )
найти элемент ( ключ : строка ) : элемент хеш-таблицы
Ключевым моментом в определении методов таблицы является то, что параметрами являются объекты ⌠Элемент хэш-таблицы■. За счет этого можно легко модифицировать тип элементов таблицы и даже включать в одну и ту же таблицу разнотипные элементы.
Конкретизируем информацию, содержащуюся в таблице. Для хранения сведений об абитуриенте, подавшем заявление, будем использовать новый объект "Абитуриент", наследующий свойства объекта "Элемент хеш-таблицы" .
объект
:Абитуриент ( Элемент хеш-таблицы )
атрибуты
:Номер диплома : строка
средний балл : число
методы
:отобразить информацию
Отметим, что ключом является фамилия абитуриента, для хранения которой используется атрибут "ключ", наследованное от объекта-предка. Метод "отобразить информацию" для данного объекта производит печать значений всех атрибутов. При этом, в отличии от одноименного метода родительского объекта, он будет в состоянии распечатать конкретную информацию (номер диплома, средний балл ) по данному абитуриенту.
Кроме того, проектируема таблица должна обеспечивать хранение информации и о внеконкурсных абитуриентах, зачисляемых в ВУЗ на основании заключаемого контракта. Для хранения подобной информации введем объект "контрактный абитуриент", который также будем наследовать от объекта "Элемент хеш-таблицы".
объект
:Контрактный абитуриент ( Элемент хеш-таблицы )
атрибуты
:номер контракта : строка
методы
:отобразить информацию
Данный объект, также как и предыдущий, имеет унаследованный атрибут "ключ", в котором хранится фамилия абитуриента и имеет собственный метод "отобразить информацию" (для печати дополнительно к фамилии еще и номера контракта)
Таким образом, мы имеем таблицу, в которой можно разместить информацию о заявлениях различных типов, поступающих от абитуриентов в приемную комиссию. Причем, обработка этих разнотипных заявлений будет происходить единообразно. Например, для печати всей информации из таблицы, достаточно вызвать для каждого элемента метод "отобразить информацию". Подобный метод имеют все объекты, хранимые в таблице, так как он объявлен в родительском объекте "Элемент хеш-таблицы". Однако, за счет свойства полиморфизма, для каждого объекта будет вызван его собственный метод, который отобразит специфическую для данного объекта информацию.
Отобразим полученную структуру объектов системы в виде диаграммы классов (рис. П.3).
Рис.П.3. Диаграмма классов для пакета "Таблица заявок"
Классы, представленные на данной диаграмме объединяются в пакет "Таблица заявлений". В дальнейшем, такимже образом формируются диаграммы классов и пакеты для иных частей системы.
После завершения этапа логического проектирования, выполняется построения диаграммы компонентов, на которой отображаются все объекты (экземпляры классов) системы, реализуемые программно, и осуществляется кодирование (программирование).