Тверской государственный университет
Опубликован: 03.10.2011 | Доступ: свободный | Студентов: 3289 / 60 | Оценка: 4.33 / 3.83 | Длительность: 19:48:00
ISBN: 978-5-9963-0573-5
Лекция 5:

Интерфейс класса

< Лекция 4 || Лекция 5: 1234 || Лекция 6 >

4.4. Запросы

Класс SIMPLE_LINE предлагает несколько запросов о характеристиках линии метро.

Сколько станций на линии?

Первое, что нам хотелось бы знать о линии, это сколько на ней станций, что обеспечивается запросом count. Спецификация этого запроса появляется в контрактном облике в виде:

count: INTEGER
      -- Число станций на этой линии

Вторая строка, как вы знаете, является комментарием, более точно – заголовочным комментарием (header comment), который должен сопровождать каждый компонент класса. Всегда полезно дать простое объяснение каждого компонента. Наряду с другими инструментами это позволяет избежать возможных недоразумений. Здесь, например, мы могли бы выбрать в качестве меры число сегментов, которое было бы на единицу меньше числа станций.

Комментарий проясняет наше соглашение: для класса SIMPLE_LINE запрос count задает число станций.

4 станции, 3 сегмента

Рис. 4.4. 4 станции, 3 сегмента

Обратите внимание, в комментарии сказано: "на этой линии". Класс описывает общее понятие линии, но метод применяется к вполне конкретной линии, как в вызове Line8.count, и запрос будет возвращать в этом вызове число станций Line8. В конечном счете, класс всегда говорит о конкретной линии, даже если в классе эти конкретные линии нам не известны. Так что смысл "эта линия" в комментарии означает, что речь идет об объекте, к которому будет применяться метод count.

Объявление запроса начинается с count: INTEGER. Вначале вводится имя запроса, count, а затем тип возвращаемого результата, INTEGER. Запрос поставляет информацию об объекте, интерфейс класса должен определять ее тип.

Таким типом является INTEGER, обозначающий положительные и отрицательные целые значения, включая ноль. Другие типы, которые встретятся в этой лекции, включают:

  • STRING, для значений, представленных последовательностью символов, например, "ABCDE";
  • BOOLEAN, для "истинностных значений", которые могут быть только True или False;
  • сами классы, такие как STATION или LEG.

Вскоре мы узнаем больше о типах, а пока достаточно и типа INTEGER.

Экспериментируем с запросами

Познакомившись с методами, можно испытать их.

Время программирования!

Длина линии

В первом упражнении на программирование в этой лекции, детализированном ниже, требуется вычислить длину Линии 8.

Программная система, названная interfaceподкаталоге 04_interface), является частью ПО Traffic. Откройте эту систему в EiffelStudio и рассмотрите класс QUERIES_AND_COMMANDS:


Рис. 4.5.

Этот класс является площадкой для проверки концепций этой лекции. Заполните подсвеченную часть вызовами различных методов. Запустив полученную систему на выполнение, можно видеть возникающий в каждом случае эффект.

Нужные линии метро определены в контексте класса TOURISM. Введите в часть для заполнения следующий оператор:

Console.show (Line8.count)

В результате будет вызван только что описанный метод count для Line8, полученное значение будет передано команде show объекта Console, позволяющей отобразить результат в окне консоли. Так вы узнаете, сколько станций есть на Линии 8.

Как и в лекции по объектам, остается некоторая "магия", так как объекты Console и Line8 определены в данном нам классе TOURISM. Появится в этой лекции и еще капелька магии, но нам необходимо сосредоточиться на новых концепциях. Довольно скоро магия исчезнет, и мы будем способны определять все, что нам необходимо.

В предыдущей лекции мы говорили, что вызов Line8.count, означающий результат применения запроса к объекту, является выражением. Каждое выражение имеет тип. В данном случае тип выражения есть INTEGER, поскольку это тип результата, возвращаемого запросом count.

Станции на линии

Наши следующие запросы позволят нам узнать, какие же именно станции находятся на линии. Вспомните объяснение в нашем небольшом документе требований.

Каждая линия содержит множество станций, две из которых являются конечными станциями

Хотя эта спецификация не совершенна и требует дополнения нашими интуитивными знаниями транспортной сети, из нее все же следует, что линия метро содержит последовательность станций: конечную станцию, станцию, еще одну станцию и так далее до следующей конечной станции. Простой способ представить это дает следующий запрос из нашего класса SIMPLE_LINE:

i_th (i: INTEGER): STATION
        -- Станция с индексом i на этой линии.
Начало линии 8 (только основные станции, некоторые имена укорочены)

Рис. 4.6. Начало линии 8 (только основные станции, некоторые имена укорочены)

Имя i_th выбрано в соответствии с общим способом ссылки на элемент некоторой серии по его номеру (в английском – the 25-th element). Следует учесть, что при построении идентификаторов нельзя использовать тире, но можно использовать знак подчеркивания.

Запрос i_th, подобно show для Console, принимает аргумент – целое число, задающее индекс требуемой нами остановки, который имеет значение 1 для первой конечной станции, а затем увеличивается на единицу для каждой следующей станции. Снова возьмем в качестве примера Линию 8, представленную на рисунке:

Выражение представляет станцию "Balard": Line8.i_th (2) – это станция "La Motte" и так далее. Будем использовать два соглашения.

Line8.i_th (1)

Соглашения: нумерация станций на линии

  • Линия метро всегда содержит, по крайней мере, одну станцию, даже если она пуста и имеет ноль сегментов.
  • Нумерация станций на линии всегда начинается с южного конца. Запрос south_end будет обозначать эту станцию, north_end – другую конечную станцию. Для пустой линии или кольцевой оба запроса дают одну и ту же станцию. В тех редких случаях, когда конечные станции различны, но находятся на одной широте, south_end означает западную станцию.

Ссылка на пустые линии звучит странно, если иметь в виду существующие линии метро. Но мы моделируем абстрактное понятие "Линии", для которого пустая линия возможна. Позже в этой лекции мы будем строить (виртуально) линию метро, начиная с пустой линии и добавляя в нее поочередно новые станции.

Класс SIMPLE_LINE имеет два запроса, обозначающие конечные станции на линии:

south_end: STATION
      -- Конечная станция на южной стороне.
north_end: STATION
      -- Конечная станция на северной стороне.

Время для теста

Другой конец

Line8.i_th (1) является выражением типа STATION, обозначающим станцию на южном конце Линии 8. Не используя число станций этой линии или имена станций (или ответ на этот тест, который появится ниже), напишите еще одно выражение, которое в том же стиле задает объект, представляющий станцию на другом конце линии. Подсказка: используйте другой уже введенный запрос.

Свойства начала и конца линий

Чтобы более точно выразить наше решение о начале нумерации с южного конца, заметим, что любая линия l удовлетворяет следующим свойствам:

l.south_end = l.i_th (1)
l.north_end = l.i_th (l.count)

Не стоит продолжать чтение, если вы в совершенстве не понимаете эти две программные строчки. Каждая устанавливает свойство линии l – эквивалентность, подобную эквивалентности в математике, такой как \cos^2 (x) + \sin^2 (x) = 1 для любого числа x.

  • Первая эквивалентность говорит, что запрос south_end всегда возвращает тот же результат, что и запрос i_th, примененный к той же лини метро с аргументом 1. Другими словами, здесь устанавливается наше соглашение о нумерации станций, начиная с южного конца.
  • Второе равенство устанавливает соответствующую эквивалентность для другого конца. Так как l.count обозначает число станций на линии, выражение l.i_th (l.count) обозначает последнюю станцию.

Соглашение, что линия всегда имеет станцию, даже если она пуста, также играет роль, поскольку в противном случае выражение l.i_th (1) не всегда имело бы смысл.

Все сказанное дает ответ на наш маленький тест: для получения ответа можно использовать выражение Line8.i_th (Line8.count) или более короткое – l.north_end.

< Лекция 4 || Лекция 5: 1234 || Лекция 6 >
Кирилл Юлаев
Кирилл Юлаев
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?