Как происходит отслеживание свободного экстента? |
Работа с объектами
2.4. Методы с аргументами
Запросы так же важны, как и команды. Приведем теперь несколько примеров их использования. Мы можем, например, захотеть узнать начальную точку нашего маршрута. Для этого воспользуемся запросом origin (начало). Напишем:
Route1.origin
Это вызов метода, подобно вызову команд Route1.animate и других. В данном случае, поскольку метод является запросом, он ничего не делает, он просто вырабатывает значение – начало маршрута Route1. Мы можем использовать это значение разными способами, например, напечатать на листе бумаги, но позвольте нам отобразить его на экране.
Вы, наверное, заметили, рассматривая отображение программной системы в среде EiffelStudio, в нижней части дисплея маленькое окошко (прямоугольную область), помеченное как "Console" и используемое для показа информации о состоянии системы, которая моделирует город. В нашей программе Console (отгадайте с первого раза, что это?) оно – объект. Он является одним из предопределенных объектов, подобно Paris и Route1, которые наш класс PREVIEW наследует от TOURISM.
Одна из команд, применимых к Console, называется show; результатом ее выполнения является выдача некоторого текста на консоль. Сейчас мы воспользуемся ею для показа начальной точки маршрута.
Время программировать!
Отображение специфической информации
Модифицируем теперь нашу предыдущую программу, чтобы она дополнительно позволяла отобразить информацию о начальной точке маршрута.
Необходимы только два изменения: обновить комментарий – в интересах пояснения текста – и добавить в конец новую операцию:
class PREVIEW inherit TOURISM feature explore -- Показать информацию о городе, маршруте и начале маршрута do Paris.display Louvre.spotlight Line8.highlight Route1.animate Console.show (Route1.origin) end end
Выполните полученную программу. Началом маршрута является Лувр (формально: Palais Royal Musee du Louvre), что показано в окне консоли:
Это результат вызова нового метода Console.show (Route1.origin). Все предыдущие вызовы имели форму some_object.some_feature, но для этого вызова форма изменилась: где some_argument является значением, которое мы передаем методу, поскольку оно необходимо для выполнения работы. Методу show необходимо знать, что же он должен показать, – мы и передаем ему соответствующее значение.
some_object.some_feature (some_argument)
Такие значения известны как аргументы метода, аналогично аргументам функций в математике, где cos (x) обозначает косинус от x – функцию cos, примененную к аргументу x.
Некоторые методы могут иметь несколько аргументов (разделенных символом "запятая"). В хорошо спроектированном ПО у большинства методов аргументов мало, обычно ноль или один аргумент.
Понятие аргумент дополняет наш багаж, состоящий из базисных программных элементов, которые служат основой всех обсуждений в последующих лекциях: классы, компоненты, методы, аргументы, команды, запросы и объекты.
2.5. Методы с аргументами
- Программную систему можно представлять как множество механизмов, позволяющих создавать, получать доступ и изменять коллекции информации, называемых объектами.
- Объект – это машина, которая управляет некоторой коллекцией данных, предоставляемых программой в момент выполнения, с множеством операций (они называются методами), применимых к этим данным.
- Методы бывают двух видов: запросы, которые возвращают информацию об объекте, и команды, которые могут изменять объект. Применение команд к объекту может изменить результаты последующих запросов.
- Некоторые объекты являются программными моделями объектов физического мира, другие – программными моделями концепций физического мира, подобно маршруту путешествия, третьи могут не иметь аналогов в физическом мире, имея смысл только в рамках самого ПО.
- Базисными операциями, выполняемыми программами, являются вызовы методов, каждый из вызовов применяет некоторый метод к некоторому целевому объекту.
- Метод может иметь аргументы, предоставляющие необходимую методу информацию.
Новый словарь
Argument | Аргумент | Class | Класс | Command | Команда |
Declaration | Объявление | Feature | Метод | Feature call | Вызов метода |
Indentation | Отступ | Object | Объект | Query | Запрос |
Более полное определение класса будет дано в лекции 4.
2-У. Упражнения
2-У.1. Словарь
Дайте точное определение всех элементов словаря.
2-У.2. Карта концепций
Это упражнение необходимо будет выполнять на протяжении всех последующих лекций, расширяя полученные здесь результаты. Цель состоит в создании карты терминов, вводимых в словарях, которые сопровождают каждую лекцию. Разместите термины в квадратиках на листе бумаги и свяжите их стрелками, отражающими отношение между понятиями. Дайте имена каждому из отношений.
Конечно, можно использовать и электронные средства для построения диаграммы, но одного листа бумаги достаточно, чтобы отобразить связи понятий данной лекции.
Можно использовать различные имена отношений, но в любом случае рассмотрите следующие фундаментальные отношения.
- "Является специальным подвидом". Например, в области знаний, не относящейся к программированию, "журнал" является подвидом "публикации". Другим подвидом "публикации" является "книга".
- "Является экземпляром". "Австралия" является экземпляром "страны". Не путайте с предыдущим отношением. Австралия не является подвидом страны – это страна.
- "Основано на" (применимое к концепциям). Например, в математике "деление" основано на "умножении", так как невозможно понять деление, не поняв ранее суть умножения. Если одно из двух предыдущих отношений существует для двух терминов и для них также имеется и отношение "основано на", то следует применять это отношение лишь тогда, когда один из терминов не является ни подвидом, ни экземпляром другого термина.
- "Содержит". Например, каждая страна содержит город. Вместо отношения "содержит" можно применять инверсное к нему – "является частью".
Наряду с этими отношениями можно применять и собственные отношения, при условии, что вы дадите им точные определения.
2-У.3. Команды и запросы
Представьте, что вы создаете ПО для работы с документами – создания, модифицирования и доступа к ним. Предположите, что вы проектируете класс WORD ("Слово"), который описывает понятие "слово", и класс PARAGRAPH ("Абзац"), описывающий понятие абзаца. Для каждого из следующих возможных методов класса PARAGRAPH установите, какой из них должен быть командой, а какой – запросом.
- Метод word_count, используемый в вызовах my_paragraph.word_count, возвращающий число слов абзаца.
- Метод remove_last_word, используемый как my_paragraph.remove_last_word, удаляющий последнее слово абзаца.
- Метод justify, используемый как my_paragraph.justify, позволяющий убедиться, что абзац выровнен в соответствии с установленными границами для левого и правого поля.
- Метод extend, используемый как my_paragraph.extend (my_word), имеющий слово в качестве аргумента и добавляющий его в конец абзаца.
- Метод word_length, используемый как my_paragraph.word_length (i), у которого целочисленный аргумент задает индекс (порядковый номер) слова в абзаце, а в качестве результата возвращается число символов этого слова.
2-У.4. Проектирование интерфейса
Представьте, что вы создаете ПО для работы с МР3-плейером.
- Перечислите основные классы, которые вы будете использовать.
- Для каждого такого класса перечислите применимые методы, указав, будет ли метод командой или запросом, будет ли он иметь аргументы и каков их смысл, если они есть.