Создание объектов и выполняемых систем
В предыдущих примерах использовались имена, такие как Paris и Route1, для получения доступа к объектам, которые кем-то были созданы для нас, — и все это было довольно загадочно. Настало время разобраться, как самим создавать свои собственные объекты. Создание объектов — центральная тема этой лекции — представляет интересный механизм с важными следствиями. Это рассмотрение приведет нас к общей картине выполнения систем: как программа запускается, как она выполняется и как завершается.
В процессе изучения мы создадим фиктивную линию метро, fancy_line, связывающую несколько реальных станций. В противоположность предыдущим примерам, таким как Line8, новая линия fancy_line не предопределена, мы должны построить ее сами. Этот процесс потребует создания других объектов, например, для представления остановок на линии.
Три линии парижского метро завершаются на южной стороне примерно в одном районе, но довольно далеко для пешеходных переходов. Жителям этого района для перехода с одной линии на другую приходится ехать в центр, там выполнять пересадку на другую линию. Цель fancy_line — облегчить их участь, создав кольцевую линию, если и не в реальном городе, то хотя бы в нашем виртуальном мире.
6.1. Общие установки
Наша система для этой лекции называется creation. Откройте ее теперь, используя те же приемы, что и в предыдущих лекциях. Перейдите к классу, предмету данного обсуждения, LINE_BUILDING, который изначально выглядит так:
class LINE_BUILDING inherit TOURISM feature build_a_line — Построить воображаемую линию и подсветить ее на карте do Paris.display — "Создать новую линию, заполнить ее станциями и добавить в Paris" — "Подсветить новую линию на карте" end end
Строка — "Создать новую линию, заполнить ее станциями и добавить в Paris" и строка, следующая за ней, начинаются с двух дефисов и, следовательно, являются комментариями. Но это комментарии особого рода, известные как псевдокод, означающие, что они замещают реальный программный текст — код, который мы собираемся поместить в этом месте, разрабатывая программу.
Определение: Псевдокод
При разработке программы полезно использовать псевдокод, это лучше, чем вместо программного элемента писать комментарий: "Сюда следует поместить программный код". Псевдокод позволяет дать неформальное описание будущего кода, который пока мы не готовы поместить, например, из-за того, что это потребовало погружения в детали, мешающие увидеть всю картину в целом. На момент написания псевдокода детали могут быть еще не продуманы.
Процесс постепенной замены псевдокода элементами фактического кода называется детализацией, или уточнением (refinement). Этот прием еще более полезен при написании сложного ПО. Он является частью проектирования сверху вниз, обсуждаемого в последней лекции.
Псевдокод будет использовать соглашения, иллюстрируемые примером.
Почувствуй стиль: Запись псевдокода
После добавления псевдокода следует убедиться, что наша программа, даже если она и не полна, синтаксически корректна. Возможно, выполнять ее не имеет смысла, но компилироваться она должна, чтобы компилятор мог обнаружить ошибки, проскользнувшие по недосмотру, например, некорректное использование типов. Это базисное правило методологии разработки: программа должна компилироваться на любом этапе ее разработки. Служебные программы, рассматриваемые в последней лекции, обеспечивают дополнительные способы (обычно превосходящие псевдокод), направленные на достижение этой цели.
Создание комментируемого псевдокода напоминает, что это не обычный комментарий, аннотирующий существующий код, а держатель места для кода, который в конечном итоге должен появиться в этом месте.
6.2. Сущности и объекты
Наш класс нуждается в компоненте (запросе), представляющем линию, которую мы собираемся построить. Мы назовем этот запрос fancy_line. Это даст возможность начать процесс детализации, превращая часть псевдокода (часть первой строки и полностью вторую) в фактический код и делая напоминание более точным:
class LINE_BUILDING inherit TOURISM feature build_a_line -Построить воображаемую линию и подсветить ее на карте. do Paris.display -"Создать fancy_line, заполнить ее станциями" Paris.put_line (fancy_line) fancy_line.highlight end fancy_line: LINE — Воображаемая (но желательная) линия Парижского метро end
Рассмотрим строчку, следующую за псевдокодом. Оператор "Paris.put_line (fancy_line)" заменил текст псевдокода "добавить в Paris". Команда put_line, доступная для объектов класса CITY, позволяет добавить в "город" линию со станциями. Следующий за ним оператор использует команду highlight для уточнения второй строки исходного псевдокода.
Сразу же после выполнения процедуры build_a_line идентификатор fancy_line будет обозначать экземпляр класса LINE, задающий линию метро.
Идентификаторы могут обозначать многие вещи: они могут быть именами классов, подобно STATION, или методов, подобно i_th. Идентификатор, такой как fancy_line, чья роль — обозначать значение объекта, существующего в период выполнения, называется сущностью.
Если у вас есть опыт программирования, вы должны быть знакомы с еще одним важным понятием - понятием "переменной", обозначающим сущность, значение которой может изменяться. "Сущность" - более общее понятие, поскольку она может иметь и константное значение. В последующих лекциях переменные будут изучаться в деталях.
В данном случае сущность fancy_line является именем атрибута, но нам придется встречаться и с другими видами сущностей.
Если, в некоторый момент выполнения сущность представляет объект, мы будем говорить, что сущность присоединена к объекту
Следующий рисунок, изображающий момент выполнения, помогает визуализировать понятие сущности и присоединенного объекта.
Детализируем существующие отношения.
- Сущность — это имя в программе, которое в момент выполнения будет обозначать, благодаря "ссылке", объект в памяти. Понятие ссылки, выражающее связь, будет более точно определено в последующих лекциях.
- Объект, как определено ранее, является коллекцией данных или, если говорить более точно, как показано на рисунке, он состоит из множества полей, каждое из которых содержит единицу данных (например, целое или булевское значение). Данные, которыми наша программа манипулирует во время выполнения, полностью созданы из таких объектов, каждый со своим набором полей. Поля объекта STATION могут, например, включать координаты станции на карте, ее имя и другие характеристики.
Соглашения по изображению диаграмм, дающих мгновенный снимок структуры объекта или его части во время выполнения, следующие: