Этот сайт предназначен, прежде всего, людям, ностальгирующим по ушедшим РУССКОМУ СЛОВУ, Windows 3.1, ФОТОНУ, процессорам 486SX и иже с ними.
Конечно, времена должны идти вперед, но почему они обязательно должны уходить?
StuhlbergR 2007-2008 ©
|
Новая диалоговая оболочка системы МАСТЕР (продолжение)
СРЕДСТВА ПРОГРАММИРОВАНИЯ
Наиболее значительные по сравнению с предыдущей версией изменения, скрытые от конечного пользователя, дают программистам, использующим систему МАСТЕР в качестве инструмента для своих разработок, возможность перейти на более современную технологию объектно-ориентированного программирования (ООП) (см. врезку "Основные понятия ООП"). Сама оболочка была создана с использованием этой технологии. В библиотеку оболочки добавлен ряд системных функций общего назначения, которые также могут быть использованы в прикладном программировании.
ОСНОВНЫЕ ПОНЯТИЯ ООП
Как известно, объектно-ориентированное программирование (ООП) имеет три черты, совокупность которых отличает его от процедурного программирования. Это замыкание свойств, наследование свойств и полиморфизм.
(Примечание: еще об объектно-ориентированном программировании можно прочитать в статье "Объектно-ориентированное программирование для менеджеров".)
Замыкание свойств (encapsulation) - сочетание структур данных с функциями (методами), предназначенными для манипуляции с этими данными. Замыкание осуществляется с помощью механизма классов.
Наследование свойств (inheritance) - построение подклассов, которые наследуют данные и методы от ранее определенных классов. При наследовании можно переопределить или добавить новые данные и методы к данным и методам класса, от которого они унаследованы. Наследование порождает иерархию классов.
Полиморфизм (polymorphism) - назначение методу одного имени по всей иерархии классов, причем в каждом классе этот метод обеспечивает действие, соответствующее данному классу.
Заметим, что авторы различных статей про ООП избегают давать определения понятий "класс" и "объект".
Предполагается, что читатель интуитивно понимает, что это такое. Действительно, дать определение объекта и класса очень трудно, поскольку это понятия базовые (сравните, например, с понятиями точки и линии в геометрии). Как правило, описывается только конкретная реализация данных понятий в той или иной системе программирования. Приведем некоторые термины ООП.
Суперкласс - для каждого класса это класс, от которого унаследованы данные и методы. Соответственно, наследующий класс называется подклассом.
Свойства объекта - набор всех данных и методов объекта. Свойства могут частично или полностью определяться классом объекта и частично наследоваться от суперкласса.
Базовый класс - класс, в котором полностью определяются все свойства объекта. Соответственно, у базового класса нет суперкласса, сам же он является суперклассом для всех наследующих от него классов.
Виртруальная функция - реализация метода. Для каждого класса метод с одним и тем же именем может иметь свою независимую реализацию в виде отдельной одноименной виртуальной функции, либо наследовать реализацию от суперкласса. Выбор конкретной реализации (т.е. виртуальной функции) происходит в момент выполнения программы - когда определен объект, применительно к которому вызывается метод.
Виртуальный вызов - вызов метода. При этом система пытается найти соответствующую методу виртуальную функцию и вызывает ее. Виртуальная функция ищет сначала в классе объекта, для которого произошел вызов, и если она там не найдена, то поиск продолжается вверх по иерархии классов до ближайшего суперкласса, содержвщего реализацию метода.
Посылка сообщения объекту - вызов соответствующего метода.
Супервызов - один из элементов механизма наследования. Каждая виртуальная функция (но только не базового класса) может сделать вызов одноименной виртуальной функции суперкласса. Последняя вызывается как подпрограмма и производит собственные действия над данными объекта, унаследованными от суперкласса. Затем управление возвращается, и виртуальная функция класса может произвести свои, дополнительные действия. Тем самым в классе переопределяется реализация соответствующего метода суперкласса. Заметим, что виртуальная функция суперкласса, в свою очередь, тоже может сделать супервызов (вызов виртуальной функции класса, лежащего выше по иерархии). Цепочка супервызовов, таким образом, может быть очень длинной - до самого базового класса.
|
Средства ООП
Встроенный язык программирования Мастер не содержит средств ООП. В то же время, рамки системы МАСТЕР, по сути, являются объектами. Правда, некоторые свойства объекта-рамки (а именно, способ показа содержимого рамки на экране дисплея) реализованы в ядре системы МАСТЕР так, что могут быть переопределены лишь частично. Зато другие, более важные действия, вызываемые нажатием клавиш в активной рамке, так или иначе могут быть запрограммированы на языке Мастер.
Для реализации принципов ООП был использован традиционный механизм классов объектов. Все программы предыдущей диалоговой оболочки, описывающие реакции рамок на нажатие клавиш, были перенесены в классы этих рамок и оформлены в виде так называемых виртуальных функций. Кроме того, в виде виртуальных функций были оформлены реализации таких важных свойств рамок, как реакции на вход и выход из них курсора, на считывание и запись их на диск и т.п. В результате общий объем программного кода в оболочке версии 1.1 несколько сократился, а вносить изменения в свойства рамок и добавлять новые свойства стало гораздо проще. Появилась также дополнительная возможность - создавать новые подклассы рамок, используя при этом все выгоды механизма наследования свойств.
Классы и объекты. В новой оболочке классы являются объектами (рамками) класса "Класс". Такое решение мы можем найти, например, в известном языке программирования Smalltalk. В языке же программирования С++, напротив, классы как таковые не представимы никакими объектами и поэтому не допускают динамической обработки.
Рамки-классы описываемой диалоговой оболочки содержат определяемые функции, являющиеся реализациями методов (виртуальными функциями; см. врезку "Основные понятия ООП"). Во время работы ИС МАСТЕР классы рамок загружаются в библиотеку диалоговой оболочки (в скрытую область памяти), где содержащиеся в них виртуальные функции и используются. Второй экземпляр объекта-класса, как и рамку "Биб", можно считать с диска на рабочее поле. Находящийся на рабочем поле объект-класс не является активным и ничем не отличается от других рамок. Его содержимое можно безбоязненно редактировать. Только после того, как рамка-класс будет записана опять на диск, а оттуда перезагружена в библиотеку диалоговой оболочки, она станет активным классом, и проявятся внесенные в нее модификации.
Классы рамок следует создавать по определенным правилам в несколько этапов. Прежде всего, следует выбрать суперкласс, от которого новый класс будет наследовать свойства. Кроме того, надо выбрать для нового класса имя-индетификатор, которое должно быть уникальным.
Затем с помощью меню оболочки следует создать рамку класса "Класс", дав ей выбранное имя и введя ответ на запрос имя суперкласса. Внутри полученной рамки-класса можно создавать виртуальные функции, описывающие реакции объектов данного класса на внешние события. При отсутствии какой-либо виртуальной функции в рамке-классе реализация соответствующего метода будет автоматически унаследована от суперкласса. Поэтому следует программировать только те виртуальные функции, действие которых необходимо в данном классе переопределить.
По окончании создания виртуальных функций рамка-класс записывается в файл с именем класса и расширением MCL, а в конфигурационный файл оболочки добавляется новая строка, описывающая этот класс. Тем самым новый класс становится доступным программам оболочки. Теперь можно создавать объекты нового класса.
Это можно сделать двумя путями: программно или с помощью меню пользователя. Так или иначе объект связывается со своим классом посредством специальной метки, записанной внутри рамки-объекта и содержащей имя ее класса.
Любая программа может любым способом создать произвольную рамку и с помощью фнкции Класс() установить у нее метку требуемого класса. Этот способ создания объектов прост и в некоторых случаях вполне достаточен, однако он является второстепенным.
Основной же способ порождения объекта при программировании средствами новой оболочки заключается в использовании так называемого шаблона (template) объекта. Создание объекта при этом сводится к считыванию с диска рамки-шаблона требуемого класса и, если необходимо, выполнению над ней каких-либо инициализирующих действий. Поэтому при создании нового класса требуется, кроме, собственно, рамки класса, создать еще одну рамку-шаблон объекта данного класса. Только при наличии такого шаблона пользователь имеет возможность с помощью меню создавать объекты этого класса.
Для изготовления шаблона нового класса рекомендуется взять шаблон его суперкласса. Если рамка-шаблон составная, то внутри нее можно поместить любые рамки. В ней также с помощью фильтров можно переопределить любые стандартные действия клавиш. После того, как рамка-шаблон создана и оформлена, в ней требуется заменить метку суперкласса на метку нового класса. Это делается с помощью меню оболочки. Затем новый шаблон следует записать в один каталог с его классом, причем имя файла должно быть такое же, как у рамки-класса, а расширение - TPL.
По окончании этой процедуры рамки нового класса могут быть созданы с помощью функции оболочки СоздатьОбъект(). Данная функция используется также и при создании рамок посредством меню.
Виртуальные функции. Виртуальные функции, как уже было сказано, реализуют реакции объекта на различные события: нажатия клавиш, перемещение курсора, создание, уничтожение, считывание, запись рамок и т.п. Так, например, для рамок важным действием является "вход" в них (перемещение курсора внутрь рамки). Рамка извещается об этом вызовом соответствующей ее классу виртуальной функции "Вход". При этом рамки разных классов по-разному реагируют на вход в них.
Общее число методов в классах оболочки велико. Их можно разделить на две группы:
девять методов, реализующих базовые операции над объектами: "Вызов", "Вход", "Выход", "Подсказать", "Запись", "Считана", "Создана", "Установлена", "Освободись";
довольно большое число методов с именами функциональных (по терминологии создателей системы МАСТЕР) клавиш.
Методы первой группы вызываются программами, а второй - пользователем (нажатием клавиш), соответственно, и механизм вызовов методов различен.
Для организации виртуального вызова метода из первой группы надо записать обращение следующего вида:
Вып(Вирт(рамка,'имяМетода'),аргументы...),
где рамка - указатель объекта, для которого вызывается этот метод; Вирт() - специальная функция, реализующая в новой оболочке виртуальные вызовы. Список аргументов для каждой виртуальной функции (метода) строго фиксирован. Например, виртуальная функция "Вход" имеет один аргумент - указатель рамки-объекта, в которую должен быть сдела вход. Поэтому вызов метода "Вход" будет записан следующим образом:
Вып(Вирт(рамка,'Вход'),рамка).
Методы первой группы достаточно специфичны. Поэтому создано 10 системных функций, вызывающих эти методы: ВызовОбъекта(), ВходОбъект(), ВыходИзОбъекта(), Подсказать(), ЗаписатьОбъект(), СчитатьОбъект(), СоздатьОбъект(), УстОбъект(), ОчиститьОбъект(), УдалитьОбъект(). Пользоваться ими удобнее. Две последних функции делают вызов одного и того же метода "Освободись".
Методы второй группы, как уже было отмечено, вызываются нажатием клавиш; при этом используется встроенный в ядро системы МАСТЕР механизм глобального действия клавиш: специальная функция ядра оболочки осуществляет виртуальный вызов метода с именем нажимаемой клавиши, не имеющей в активной рамке-объекте стандартного действия. Для клавиш, имеющих стандартное, заранее заданное в ядре системы МАСТЕР действие, такой механизм сработать не может; поэтому для переопределения стандартных действий приходится использовать фильтры (локальные действия) клавиш.
Механизм наследования свойств заключается в том, что при виртуальном вызове соответствующая виртуальая функция ищет сначала в рамке-классе объекта, а затем вверх по иерархии классов. Вызывается первая найденная функция. Для организации супервызовов из виртуальных функций предусмотрена функция ядра оболочки Супер(). Например, виртуальная функция "Вход" некоторого класса может воспользоваться реализацией метода суперкласса. Для этого в ней следует записать:
Вып(Супер('Вход'),Арг(1)),
где Арг(1) - указатель рамки, переданный виртуальной функции при ее вызове в качестве первого (и единственного) аргумента. В результате супервызова вход в рамку будет осуществлен так, как будто эта рамка является объектом не данного класса, а его суперкласса. Затем виртуальная функция класса может произвести дополнительные действия, характерные именно для данного класса.
Базовым в иерархии классов считается рамка "Биб", содержащая помимо функций ядра оболочки и системных функций одщего назначения виртуальные функции всех методов первой группы и нескольких методов второй. Если реализация виртуальной функции не найдена ни в одном из классов, виртуальный вызов просто игнорируется.
[1] [2] [3]
Статья была опубликована в журнале "Мир ПК" №8 1992
Программы
|
Большинство предоставленного здесь материала является цитированием со старых номеров компьютерных журналов, таких, как
"Мир ПК" или "Весь Компьютерный Мир". К сожалению, все мои попытки связаться с этими изданиями по поводу вопроса о цитировании были безуспешны.
Издания упорно хранили молчание. Что я разрешил себе расценивать как знак согласия, указывая, тем не менее, повсюду как выходные данные
издания (с работающей ссылкой на Интернет-представительство), так и автора публикации. Тем более, что, в силу срока давности этих публикаций, вряд ли материал можно рассматривать как коммерческий или рекламный,
пусть даже названия фирм здесь и присутствуют (уж без этого никуда).
Ежели появятся какие претензии по оному поводу, прошу
издания связаться со мной
Райво Штулберг |