(*~\Глагол\ПриложенияТесты\ПредмОписПодход\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                                 ОТДЕЛ ПриветПоП+;
(*============================================================================
 *     Проверка работы НАБОРа-класса Предмет и его методов (задачных полей)
 *============================================================================*)

ИСПОЛЬЗУЕТ
  ОБХОД,
  НаЭкран ИЗ "..\..\Отделы\Обмен\ВводВывод\";

ВИД
        ДкПредмету = ДОСТУП К нПредмет;
                              нПредмет = НАБОР (* описание предмета = дискриптор [ПредметDisc] *)

    _ц:ЦЕЛ;                     (* свойство/атрибут предмета (поле данных) *)

     ы:ЗАДАЧА(пД+:ДкПредмету);  (*    ы - поле-ЗАДАЧА, но   допустим вызов:  wД.ы(wД); только после присвоения
                                   wД.ы:=n3;       (* инициализация свойства-метода предмета-набора задачей n3() у доступа к набору "wД" *)
                                 *)
     я:ЗАДАЧА( п+: нПредмет)    (*    я - поле-ЗАДАЧА, но   допустим вызов:   v.я(v);  только после присвоения
                                    v.я:=n4;       (* инициализация свойства-метода предмета-набора задачей n4() у набора "v" *)
                                 *)
(*                                  здесь задачные\процедурые поля
   n2-:ЗАДАЧА(пД+:ДкПредмету);

   n3-:ЗАДАЧА(пД+:ДкПредмету);  (* n3() - поле-ЗАДАЧА, но НЕдопустим вызов:   wД.n3(wД); 
                                     а только как вызов обычной задачи в отделе: n3(wД); *)
   nА-:ЗАДАЧА(пД+:ОБХОД.Адрес)

   n4-:ЗАДАЧА( п+: нПредмет);   (* n4() - поле-ЗАДАЧА, но НЕдопустим вызов:    v.n4(v); 
                                     а только как вызов обычной задачи в отделе: n4(v); *)

             не имеют смысла, т.к. эти методы не вызываются по разыменованию доступа к набору
        wД.n4(wД^); - т.к. это хотя и преобразуется в obj (или компилируется), но при выполнении
             происходит зависание,
             а вызываются они только как обычные задачи в приложении ПриветПоП+
   n4(wД^);
             их реализации см. ниже
*)
                                         КОН; (* нПредмет *)

(*----------------------- Реализации методов для НАБОРа нПредмет ---------------------*)

  ЗАДАЧА (*(нПредмет)*) n2-(пД+:ДкПредмету);
  УКАЗ
    пД._ц:=2   (* разыменование доступа к набору и присвоение полю постоянного значения *)
  КОН n2;

  ЗАДАЧА (*(нПредмет)*) n3-(пД+:ДкПредмету);
  УКАЗ
    пД._ц:=3   (* разыменование доступа к набору и присвоение полю постоянного значения *)
  КОН n3;
(*                            это приводит к зависанию
  ЗАДАЧА nА-(а+:ОБХОД.Адрес);
  ПЕР
    экзД:ДкПредмету;
  УКАЗ
    экзД:=ОБХОД.Значение(ДкПредмету,а);
    экзД._ц:=5 (* разыменование доступа к набору и присвоение полю постоянного значения *)
  КОН nА;
*)
  ЗАДАЧА n4-(п+:нПредмет);
  УКАЗ
    п._ц:=4    (* разыменование набора и присвоение полю *)
  КОН n4;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Главная;
ПЕР
  wД:ДкПредмету;

  v :нПредмет;
  vА:ОБХОД.Адрес;

  vД:ДкПредмету; (* vД:ДОСТУП К нПредмет; *)
УКАЗ
  НаЭкран.ВсяЦепь("^------Проверка работы НАБОРа-класса нПредмет и его методов (задачных полей)---^^");

(*- Проверка работы НАБОРа-класса нПредмет -*)

  НаЭкран.ВсяЦепь("^ Проверка Предметно-Описательного Подхода (ПоП - аналог ООП) с предметами^ (т.е. экземплярами) вида нПредмет в рус.ЯП Глагол.^");
  НаЭкран.ВсяЦепь("^ ООП - это подход с акцентом на классы (class-centered),");
  НаЭкран.ВсяЦепь("^ ПоП - это подход с акцентом на экземпляры вида нПредмет (instance-centred),^ при котором одно и тоже 'свойство предмета' может иметь разные реализации у одного^ экземпляра предмета или отличаться у разных экземпляров одного предмета.^");


(* @@@@@@@@@@@@@@@@ Работа с ДОСТУПом к НАБОРу wД *)

  НаЭкран.ВсяЦепь("^---- Работа с ДОСТУПом к НАБОРу wД:^");
(*
                    Работа с ДОСТУПом к НАБОРу wД - только как параметр-источник
                                   при вызове задач:
  n2(wД);   (* wД._ц:=2; *)
  n3(wД);   (* wД._ц:=3; *)
 *)
  СОЗДАТЬ(wД);

  wД._ц:=5;
  НаЭкран.Цел4числа('^работа с полем НАБОРа             wД._ц:=5 = %d ^',wД._ц,0,0,0);
(*
  -------------- это пока не проходит -------------

  wД.n2(wД); (* свойство n2(д+:ДкПредмету); не определено в наборе *)
  wД.n3(wД); (* значение доступа wД - пусто или сработала ловушка *)
  wД.n4(wД^);(* wД^._ц:=4; Приводит к зависанию *)

  НаЭкран.Цел4числа('^вызов ЗАДАЧи-метода  wД.n4(wД);   wД._ц:=4 = %d ^',wД._ц,0,0,0);
*)
                                              n2(wД);(* wД._ц:=2; *)
  НаЭкран.Цел4числа('^вызов ЗАДАЧи из отдела  n2(wД);   wД._ц:=2 = %d ^',wД._ц,0,0,0);
(*
                                           wД.n2(wД);(* wД._ц:=2; - вызов ЗАДАЧи как метода приводит к зависанию *)
  НаЭкран.Цел4числа('^вызов ЗАДАЧи-метода  wД.n2(wД);   wД._ц:=2 = %d ^',wД._ц,0,0,0);
*)
(*
  пока не проходит вызов      wД.n2(wД);
или вызов 
  метода экземпляра предмета: wД.ы(wД); - такой вызов (ещё не инициализированного) свойства-метода
                                          приводит к зависанию приложения
        и, вообще, у предмета wД. пока нет инициалированых свойств-методов.
  Однако
            n3(wД) - это допустимый вызов задачи из отдела, пока не связанной с набором нПредмет
*)

(*--- инициализация свойства-метода "ы()" ---*)

  wД.ы:=n3;           (* инициализация свойства-метода предмета-набора задачей n3() у доступа к набору "wД" *)

                                            wД.ы(wД); (* wД._ц:=3; *)
  НаЭкран.Цел4числа('^вызов ЗАДАЧи-метода   wД.ы(wД);    wД._ц:=3 = %d ^',wД._ц,0,0,0);

(*---*)
                                             n4(wД^); (* wД._ц:=4; *)
  НаЭкран.Цел4числа('^вызов ЗАДАЧи ПриветПоП.n4(w);      wД._ц:=4 = %d ^',wД._ц,0,0,0);


(* @@@@@@@@@@@@@@@@ Работа с НАБОРом v *)

  НаЭкран.ВсяЦепь("^---- Работа с НАБОРом v:^");

  v._ц:=5;
  НаЭкран.Цел4числа('^работа с полем НАБОРа              v._ц:=5 = %d ^',v._ц,0,0,0);

(*--- инициализация свойства-метода "ы()" ---*)

   v.я:=n4;           (* инициализация свойства-метода предмета-набора задачей n4() у набора "v" *)

                                             v.я(v);  (* v._ц:=4; *)
  НаЭкран.Цел4числа('^вызов ЗАДАЧи-метода    v.я(v);     v._ц:=4 = %d ^',v._ц,0,0,0);

(*---*)
  
                                              n4(v);  (* v._ц:=4; *)
  НаЭкран.Цел4числа('^вызов ЗАДАЧи  ПриветПоП.n4(v);     v._ц:=4 = %d ^',v._ц,0,0,0);


(* @@@@@@@@@@@@@@@@ Работа с ДОСТУПом к НАБОРу vД *)

  НаЭкран.ВсяЦепь("^---- Работа с ДОСТУПом к НАБОРу vД:^");

  СОЗДАТЬ(vД);

(*--- инициализация свойства-метода "ы()" ---*)

  vД.ы:=n2;           (* инициализация свойства-метода предмета-набора задачей n2() у набора "vД" *)

                                            vД.ы(vД); (* vД._ц:=2; *)
  НаЭкран.Цел4числа('^вызов ЗАДАЧи-метода   vД.ы(vД);    vД._ц:=2 = %d ^',vД._ц,0,0,0);

(*---*)
                                              n3(vД); (* vД._ц:=3; *)
  НаЭкран.Цел4числа('^вызов ЗАДАЧи из отдела  n3(vД);    vД._ц:=3 = %d ^',vД._ц,0,0,0);
(*
         vД.n3(vД);                         (* vД._ц:=3; - вызов ЗАДАЧи как метода приводит к зависанию *)
  НаЭкран.Цел4числа('^вызов ЗАДАЧи-метода  vД.n3(vД);    vД._ц:=3 = %d ^',vД._ц,0,0,0);
*)
(*
  vА:=ОБХОД.ПолучитьАдрес(v);
  ОБХОД.ИзПамяти(vА,vД); (* vД:=Память[vА]- Приводит к зависанию *)
  НаЭкран.Цел4числа('^присвоение из v в vД               vД._ц:=4 = %d ^',vД._ц,0,0,0);
*)
(*=
  v.nА(vА); (* v._ц:=5; *)
  НаЭкран.Цел4числа('^вызов ЗАДАЧи-метода   v.nА(vА);    vД._ц:=5 = %d ^',vД._ц,0,0,0);
(*
  ОБХОД.ИзПамяти(vА,vД); (* vД:=Память[vА] *)
(*-                 vД:=ОБХОД.Значение(ДкПредмету,vА); -*)
  v.n2(vД); (* vД._ц:=2; Приводит к зависанию *)
*)
  НаЭкран.Цел4числа('^вызов ЗАДАЧи-метода   v.n2(vД);    vД._ц:=2 = %d ^',vД._ц,0,0,0);
=*)
                                              n4(vД^);(* vД._ц:=4; *)
  НаЭкран.Цел4числа('^вызов ЗАДАЧи  ПриветПоП.n4(v);     vД._ц:=4 = %d ^',vД._ц,0,0,0);

КОН Главная;

(*+ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss+*)
УКАЗ
  Главная
КОН ПриветПоП.
