nextupprevious

Next:1.9 Программные единицы
Up:1 Язык программирования Zonnon
Previous:1.7 Предопределенные процедуры


1.8 Активности, поведение и взаимодействие


Объявление активности подобно объявлению метода (процедуры), в котором опущен список параметров. Зарезервированное слово activity используется, чтобы отличить объявление активности от объявления метода. Активности также могут иметь модификаторы private и public для управления их видимостью. Когда активность объявлена, ее экземпляры могут создаваться в любом активном объекте или модуле.

Семантически разница между активностью и методом более существенна. Активности объявлены и затем воплощены (запущены), а не вызваны, и новая активность размножается с каждым запуском.

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

1.8.1. Поведение


Активности предоставляют средства инкапсулированного поведения, добавленного к объекту или модулю (рассматриваемому как отдельный объект). Объект может содержать произвольное число активностей, или не содержать их вовсе, и в этом случае он является пассивным объектом. Обычно поведенческие активности являются приватными по отношению к объекту (или модулю), который содержит их, и создаются и размножаются конструктором.

Пример:

object Cell (*конвейера*);
    type Job = …;
    var in, out, n: integer;
        buf: array N of Job;
    procedure Get (j: Job);
    begin
    end Get;
    procedure { public } Put (j: Job);
    begin
    end Put;
    activity Process;
    var … (*пространство состояний активности*)
    begin
    end Process;
    var p: Process;
    begin
        n := 0; in := 0; out := 0;
        p := new Process (*Создать активность в Cell *)
end Cell;
 

1.8.2. Взаимодействие

Формальная синтаксическая спецификация может ассоциироваться с активностями для объектного взаимодействия. Для того чтобы начать взаимодействие, вызывающий вначале создает активность в вызываемом объекте, который неявно открывает диалог с ним, который затем начинается между вызывающей и вызванной активностями по формальному синтаксису диалога вызванного. Весьма важно, что взаимодействие между вызывающей и вызванной активностью является асимметричным. Вызывающий знает вызываемого по его имени, тогда как вызываемый не осведомлен об имени вызывающего, а знает только об асссоциации между ними, являющейся данным диалогом.

Реальный обмен синтаксическими лексемами между вызывающим и вызываемым управляется с помощью операций send и receive, описанным в разделах 1.6.12 и 1.6.13, где receive имеет родовой аргумент объекта. Если необходимо, знак операции is может тогда использоваться для распознавания разных типов синтаксических лексем (см. 1.4.2.5).
 

1.8.3. Протокол РБНФ


Определение активности может включать диалог, котрый является формальную синтаксическую спецификацию коммуникационного протокола в РБНФ. Он представляется в виде модификатора к типу перечисления, который определяет алфавит терминальных лексем синтаксиса. Название активности и ее тип перечисления образуют сигнатуру активности. Заметим, что в спецификации протокола в виде РБНФ к коммуникации элемента от вызывающего к вызываемому приставляется спереди “?”.

Пример:

definition Fighter;
    activity (* Синтаксис протокола, в данном случае он рекурсивный *)
        { fight = { attack ( { defense attack } | RUNAWAY [ ?CHASE] | KO | fight ) }.
        attack = ATTACK strike.
        defense = DEFENSE strike.
        strike = bodypart [ strength ].
        bodypart = LEG | NECK | HEAD.
        strength = integer. }
    Karate = (RUNAWAY, CHASE, KO, ATTACK, DEFENSE, LEG, NECK, HEAD);
end Fighter.

object Opponent implements Fighter;
    activity Karate implements Fighter.Karate;
        var t: object;
        procedure fight;
        begin
            while t is ATTACK do
                receive t;
                while t is DEFENSE do receive t; strike
                    if t is ATTACK then strike else halt(protokolError) end
                end;
                if t is RUNAWAY then
                    if (*не истощен*) then send Karate.CHASE end;
                        return (* борьба завершается *)
                elsif t is KO then return (* борьба завершается *)
                elsif t is ATTACK then fight (* рекурсия, продолжается борьба *)
                else halt(protocolError) (* ошибка протокола *)
                end
            end
        end fight;
        procedure strike;
        begin
            if (t is LEG) or (t is NECK) or (t is HEAD)
            then
                receive t;
                if t is integer then (* необычная сила *) receive t end
            end
        end strike;
    begin (* Karate*)
        receive t;
        fight
    end Karate;
end Opponent.

object Challenger;
    import Opponent, Fighter;
    var opp: Opponent; f: Fighter.Karate;
    opp := new Opponent; (* создать оппонента *) …
    f := new opp.Fighter.Karate; (* создать диалог *)
    send Fighter.Karate.ATTACK => f; … (* борьба соответствующая протоколу диалога *)

end Challenger.
 

1.8.4. Завершение


Объект может только тогда завершиться, когда на него больше нет ссылок и когда завершены все его активности. Активность завершается после выполнения оператора непосредственно предшествующего end в ее теле процедуры.
 

1.8.5. Процедуры ввода и вывода


Язык включает встроенные возможности для текстового ввода и вывода. Концептуально чтение и запись соответствуют получению и посылке лексем из и в предопределенные активности standard input и standard output соответственно.

Для удобства предоставлены предопределенные процедуры для чтения и выдачи текста в Паскале-подобном стиле. Процедурами для ввода текста являются read и readln, а для вывода – write и writeln. Все вводимое и выводимое должно быть текстом, который неявно предполагается должен изображаться как строки литер, разделенные символами конца строки.
 

1.8.5.1. Параметры и специальный синтаксис


Процедуры используются с нестандартным синтаксисом для их списков параметров. Допускается переменное число параметров, которые могут быть разных типов. Параметры типа char не требуют преобразования типов данных, однако, для других типов (таких как целые, вещественные и др.) передача данных включает неявное преобразование типов данных.
 

1.8.5.2. Процедуры ввода

1.8.5.2.1. Процедура read


Процедура read имеет следующий вид

read (v1, …, vn)

Допускается один или больше параметров, каждый из которых является значением некоторого базисного типа данных. Если v является значением типа char, то read(v) передает следующую литеру входного текста в v. Если v является значением типа byte, integer, cardinal или real, то read(v) означает чтение последовательности литер из входного текста и присваивание прочитанного числа v. Предшествующие пробелы и символы конца строки подавляются и отбрасываются.
 

1.8.5.2.2. Процедура readln


Процедура readln имеет следующий вид

readln(v1, …, vn)

readln имеет ту же функциональность что и read за тем исключением, что после чтения vn все оставшиеся литеры в строке игнорируются вплоть до (и включая) следующего символа конца строки.
 

1.8.5.3. Процедуры вывода

1.8.5.3.1. Процедура write


Процедура write имеет следующий вид

write (p1, …, pn)

Она может иметь один или несколько параметров, каждый из которых имеет вид

e , e:m или e:m:n

Здесь e изображает значение, которое выводится, а m и n спецификаторы ширины поля. Если значение e требует менее чем m литер для своего представления, то пробелы (промежутки) выводятся для того, чтобы гарантировать, что суммарно записано равно m литер. Если m опущено, то используется по умолчанию определенное реализацией число. Форма e:m:n применима только к числам типа real, см. ниже.

Параметры процедуры write могут иметь тип char, string, boolean, integer, cardinal и real.

1.8.5.3.2. Процедура writeln


Процедура writeln имеет следующий вид:

writeln (v1, …, vn)

Процедура writeln имеет ту же функциональность, что и write, с тем отличием, что после записи vn помещается символ конца строки.
 

1.8.5.3.3. Значения ширины поля по умолчанию для write


Значения параметров ширины поля по умолчанию для write и writeln зависят от типа параметра следующим образом:


 

Next:1.9 Программные единицы
Up:1 Язык программирования Zonnon
Previous:1.7 Предопределенные процедуры


© В.Н. Касьянов, Е.В.Касьянова,2004