Рассмотрим задачу поиска маршрутов между заданными пунктами на карте. Карта может быть представлена графом, узлами которого являются города, а дороги отражаются как связи между узлами. Если наша программа должна быть универсальной, т.е. уметь обрабатывать различные карты, то подходящим контейнером для хранения карты является список. В нем можно хранить список городов и связей между ними. Такой список легко создавать и обрабатывать.
Что такое город с точки зрения структуры данных? Город имеет название, координаты и список соседей к которым проложены дороги. С другой стороны, ни к городу ни к карте как к прикладным объектам не целесообразно применять ссылочную семантику принятую для списков. Мы приходим к ситуации, когда желательно использовать код разработанный для класса списков, но не порождать потомков этого класса. Поэтому карта и город должны включать поля TRList, но не наследовать от него.
Определим два вспомогательных класса для положения города и указания связи с другим городом. Положение, это информация. Бессмысленно говорить о положении как об информации, если оно не содержит координат, отсюда конструктор содержит два параметра — x и y, и в класс добавлены соответствующие свойства.
Связь это тоже информация. Точно так же связь не информативна, если не указывает с чем связан объект, поэтому город сделан параметром конструктора.
Описание города является информацией, а конструктор имеет параметры названия и координат. Название и положение города можно узнать не только при создании, но и в любой последующий момент, поэтому добавлены свойства Name и Pos.
Обратите внимание, что связи с другими городами непосредственно заложены в определение города а не карты. Это вопрос который можно решать так или иначе, но связи в TCity скрыты, т.е. являются реализацией. Если в дальнейшем вопрос размещения связей будет пересмотрен, пользователи класса не испытают никаких неудобств.
Наконец, карта — это объект в который можно добавлять города, связывать города с известным названием, находить город по названию и представлять карту в текстовом виде.
Проанализируем наиболее интересные фрагменты реализации новых классов.
Обратите внимание, что полю FPCity в конструкторе присваивается параметр C, а не его адрес. Так и должно быть, ведь C это ссылка на объект. Для TLink нет необходимости в деструкторе, ведь уничтожается только ссылка, а сам объект может продолжать существовать. По аналогичной причине не создается копии FPCity при копировании, создается ссылка на тот же самый объект.
Функция копирования города не копирует связи с другими городами. Это задача карты. Ведь связи указываются по ссылке, а город сам по–себе не должен содержать связей с городами конкретной карты.
Функция печати города интересна использованием селектора для списка связей. Обратите внимание как элегантно пробегается весь список. При создании селектора текущим становится первый элемент списка. До появления пустого текущего элемента в результат добавляется соответствующий текстовый фрагмент и выполняется переход к следующему элементу. Поскольку такая обработка является типичной, метод Next возвращает ссылку на текущий а не на следующий элемент и делает следующий текущим (см. TSelect.Next в Приложении).
Наиболее сложный метод это связывание двух городов. Перечислим ограничения на связывание, которые призваны обеспечить безопасность и удобство использования классов и осмысленность возникающих карт: • город не следует связывать сам с собой;
• оба города должны принадлежать карте;
• не следует дублировать связь, если она уже существует;
• если A связан с B, то и B связан с A.
Разберитесь самостоятельно как эти ограничения реализованы в тексте программы.
Метод для распечатки карты демонстрирует переход к новой строке текста. Такой переход задается специальной комбинация символов #13#10 — новая строка. Если добавить такую комбинацию в текст, то вся последующая часть будет выводиться с новой строки.
Все недостающие методы приведены в Приложении. Там же имеются достаточные комментарии, позволяющие понять назначение и алгоритм каждого метода.
Опубликовал Kest
September 01 2011 11:47:39 ·
0 Комментариев ·
7741 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.