Содержанием этого этапа практического задания является решение студентом нескольких задач, связанных с разработкой и программированием объектной модели. Каждой из этих задач ниже посвящается отдельный подраздел. В начале каждого подраздела формулируется частная задача, а далее следуют краткие методические указания по ее решению. В результате должны быть разработаны все компоненты объектной модели: классы, объекты, методы. При этом студент должен продемонстрировать знание двух подходов – в окне Object Browser и в окне KAL Interpreter - и воспользоваться ими для создания иерархии классов и объектов.
Разработка иерархии классов и объектов в окне Object Browser
Необходимо создать иерархию классов и объектов, изображенную на рис. 1.10. В данном случае класс System1 представляет реализацию проектируемой системы на базе первой аппаратной платформы. При этом система состоит из двух приборов Device1 и Device2. Следует представить иерархию в окне в сжатом виде (скрыть подкласс Hardware), а затем вернуться к развернутому представлению.
Методические указания:Чтобы создать в классе подкласс/объект, необходимо
· щелкнуть мышью на имени класса в окне Object Browser;
· не отпуская клавиши, в появившемся меню выбрать Добавление Подкласса/Объекта (Add Subclass/Instance);
· ввести название подкласса/объекта;
· нажать кнопку ОК.
Удаление и редактирование классов/объектов производятся аналогичным образом (команды Edit и Delete).
Информация в окне Object Browser может быть представлена в сжатом или развернутом виде путем удаления из окна объектов или подклассов некоторых указанных пользователем классов (команды Hide/Show Subclasses/Instances). При этом в окне имя класса, чьи объекты или подклассы скрыты, обводится рамкой.
Создать в соответствии с таблицей для классов и объектов слоты. Слоты Proizv и Stoim отражают производительность и стоимость конкретного прибора в объекте Device, и средние значения по системе в объекте Global. Сделать слоты Name и Number в классе Hardware и объекте Device локальными и присвоить им значения. Слот Number в объекте Device, доставшийся по наследству, использовать для хранения номера группы.
Таблица слотов
Класс/объект
Hardware
System
Device
Global
Слот
Name
Name
Name
Name
Number
Number
Number
Proizv
Proizv
Stoim
Stoim
Методические указания. Чтобы создать в классе (объекте) слот, необходимо:
· щелкнуть мышью на имени класса в окне Object Browser;
· перейти в редактор класса, для чего, не отпуская клавиши, в появившемся меню выбрать Редактирование (Edit);
· выбрать меню Slot/New;
· ввести имя слота.
Для присвоения требуемого значения слоту надо продолжить предыдущую процедуру:
· перейти в редактор слотов, для чего выбрать меню Slot/Edit;
· ввести в поле Value требуемое значение.
Для преобразования слота класса (объекта) в локальный следует выделить этот слот в редакторе класса (объекта) и обратиться к меню Slot/MakeLocal.
Разработка иерархии классов и объектов в окне KAL Interpreter.
Необходимо дополнить средствами KAL Interpreter ранее созданную иерархию классов и объектов до следующего вида (рис. 1.11).
При построении использовать функции (команды) MakeClass, MakeInstance, MakeSlot.
Методические указания. Все функции в ЭО KAPPA разделены на группы:
· функции манипулирования элементами знаний (Knowledge),
· математические функции (Math),
· функции для работы со строками (String),
· функции для работы со списками (List),
· логические функции (Logical),
· функции манипулирования файлами (File),
· функции управления или взаимодействия с ОС (Control),
· функции для работы с окнами КАРРА и с объектами интерфейса (Windows),
· определенные пользователем функции (User Functions),
· все функции (All Functions).
Получить доступ к имеющимся функциям можно в любом окне ЭО KAPPA, где доступно использование выражений в KAL-коде. Для этого нажатием правой кнопки мыши в этом окне активизируется всплывающее меню, с помощью которого можно оперативно выбрать из имеющихся необходимую группу функций. С выбором группы функций на экране появляется окно Выбора команды (Select Command), где представлены функции выбранной группы. После щелчка левой кнопкой мыши на любой из них внизу окна появляется формат и список аргументов функции. Так, например, для функции Создать класс (MakeClass) формат имеет вид: MakeClass(@className, @<superName>).Из приведенной записи следует, что аргументами функции является имя создаваемого класса, а также имя класса (суперкласса), в который создаваемый класс должен входить. Последний аргумент является необязательным, о чем свидетельствуют угловые скобки. Символ @ является элементом описания формата и в описании функции отсутствует, например, MakeClass(System1, Hardware). Запись любой функции заканчивается «; ».
Создание методов для классов и объектов модели
Необходимо создать с использованием функции PostMessage (вывод сообщения на экран) для классов и объектов методы в соответствии с таблицей, где Contr – контроль правильности ввода значения слота Number, SrProizv – вычисление средней производительности по системе, SrStoim – вычисление средней стоимости по системе.
Таблица методов
Класс/объект
Hardware
System
Global
Метод
Contr (контроль правильности ввода)
Contr (контроль правильности ввода)
SrProizv
(средняя производительность)
SrStoim
(средняя стоимость)
Методические указания. Методы - это процедуры, являющиеся атрибутами объекта. Процесс активизации метода в объекте назван посылкой сообщения. Когда объект получает сообщение, относящееся к одному из его методов, этот метод вступает в действие и выполняет определенную им процедуру. Методы передаются по наследству, по аналогии со слотами.
Метод Contr «Контроль правильности ввода». Для создания метода Contr, например, в классе Hardware можно воспользоваться следующей процедурой.
1) выбрать редактор Класса (окно KTools), пункт меню Edit и класс Hardware;
2) обратиться к меню Methods/New;
3) присвоить методу имя Contr;
4) в появившемся окне редактора метода в строке аргументов (Arguments) ввести:
x Number
В результате в тексте метода длинная переменная Number может быть заменена на короткую x.
5) в теле метода, которое заключается в фигурные скобки, размещается условный оператор (группа функций управления Control):
{
If( Self:x<=10)
Then PostMessage(«Вы ввели число систем»)
Else PostMessage(«Введенное Вами число систем слишком велико !»);
};
Напомним, что все переменные, используемые в текстах методов, функций и правил отражают слоты некоторых классов или объектов. В результате их обозначение содержит как имя класса (объекта), так и имя слота, разделенные двоеточием, например, Hardware:Number. В приведенном тексте программы вместо имени класса Hardware использовано служебное слово Self, что позволяет использовать этот текст метода в любом другом классе. Заметим, что функция PostMessage предназначена для вывода на экран дисплея выражений, которые записываются в скобках как ее аргументы через запятую, при этом символьные выражения должны быть заключены в кавычки. Так, например, информация о средней стоимости прибора, представленная переменной Global:Stoim, может быть выведена следующим образом:
PostMessage(“Средняя стоимость прибора по системе =”, Global:Stoim).
КАРРА автоматически относит к каждому слоту ряд опций (в редакторе класса/объекта, выбрав конкретный слот, войдите в меню Slots/Edit/Options), среди которых, в частности, три опции для присоединения к слоту методов (процедур):
· метод, выполняемый автоматически, когда запрашивается значение слота, а это значение отсутствует;
· метод, выполняемый перед тем, как произойдет изменение значения слота;
· метод, выполняемый сразу после изменения значения слота.
Для рассматриваемого примера имеем:
1. выбрать Update/Close;
2. в редакторе класса Hardware щелкнуть два раза на слот Number;
3. войти в пункт меню Options;
4. ввести в поле After Change название нашего метода Contr;
5. выбрать тип значения number и ограничения 0 .. 10;
6. нажать OK и сохранить класс Hardware.
Метод SrProizv «Средняя производительность по системе». При создании методов, вычисляющих, например, среднюю производительность по системе, оказываются полезными функция подсчета числа объектов некоторого класса CountInstance, а также функция управления ForAll, просматривающая объекты некоторого класса и вычисляющая общее для них и единственное выражение, стоящее сразу после квадратных скобок и заканчивающееся точкой с запятой. Если этих выражений несколько, они должны быть заключены в фигурные скобки. Функция ForAll является по существу оператором цикла с параметром, который последовательно пробегает имена всех объектов из просматриваемого класса и указывается в квадратных скобках после служебного слова ForAll. В квадратных скобках, кроме параметра цикла указывается имя просматриваемого класса, отделенное от переменной-параметра вертикальной чертой. Так фрагмент, вычисляющий средний балл для студентов из второй группы будет иметь вид:
{
Global:Proizv1 = 0;
ForAll [ obj|System1 ]
Global:Proizv1 = Global:Proizv1 +
obj:Proizv;
System1:Number = CountInstances( System1 );
Global:Proizv1 = Global:Proizv1 / System1:Number;
PostMessage( "Средняя производительность по системе 1=", Global:Proizv1 );
};
В этом фрагменте параметр цикла обозначен буквами obj.