Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Oberon
Перезагрузить страницу Защищенные действия protected
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию Защищенные действия protected - 21.09.2005, 12:43

В ряде объектно ориентированных языков программирования существует модификатор - "protected", отсутствующий в Оберонах. Protected используется для ограничения (для защиты) способов модификации состояния объекта разрешая protected-модификацию только в классах потомках. На первый взгляд может показаться, что раз в Оберонах нет ключевого слова protected, то в них невозможно образовать защищенные действия. В самом деле, рассмотрим классическую схему (паттерн) импорта модулей:
Код:
ПубличныйМодуль--->---РеализационныйМодуль
     |                         |
    |/                       |/
     |                         |
     +---->---+      +----<----+
              |      |
             |/    |/
              |      |
          КлиентскийМодуль
В публичном модуле описан абстрактный тип; в реализационном модуле этот тип расширен до конкретного типа; клиентский модуль импортирует публичный модуль с интерфейсом - абстрактным типом, а также какой-то реализационный модуль (или даже несколько реализационных модулей). Для определенности, пусть публичный модуль экспортирует абстрактный тип объекта-контейнера имеющего целочисленное поле доступное только для чтения - количество элементов в контейнере:
Код:
  TYPE
    Контейнер* = POINTER TO ABSTRACT RECORD
      количествоЭлементов-: INTEGER
    END;
Поскольку поле "количествоЭлементов" доступно только для чтения, то не существует ни какого способа изменить его из других модулей. Необходимо экспортировать еще и процедуру модификатор:
Код:
  PROCEDURE УстановитьНовоеКоличествоЭлементов* (контейнер: Контейнер; n: INTEGER);
  BEGIN ASSERT(n >= 0, 20);
    контейнер.количествоЭлементов := n
  END УстановитьНовоеКоличествоЭлементов;
Иначе как же еще модифицировать это поле? Но экспортирование такой процедуры в некотором смысле опасно - ведь ее может вызвать кто угодно, когда угодно и для какого угодно объекта-контейнера тем самым, быть может, нарушив целостность этого объекта-контейнера. Вызов этой процедуры не контроллируем, т.е. не защищен. Как уже было сказано в начале этой заметки, в ряде языков программирования эта проблема решается путем введения специального модификатора "protected" и процедура становится защищенным методом. В Оберонах нет модификатора protected, поэтому указанная выше схема не работает. Решение задачи образования защищенных действий над объектами предоставляется самой модульностью. Схема импорта модулей должна быть такой:
Код:
            ЗащищенныйМодуль
              |      |
             |/    |/
              |      |
     +----<---+      +---->----+
     |                         |
    |/                       |/
     |                         |
ПубличныйМодуль--->---РеализационныйМодуль
     |                         |
    |/                       |/
     |                         |
     +---->---+      +----<----+
              |      |
             |/    |/
              |      |
          КлиентскийМодуль
Защищенный модуль экспортирует защищенные действия над объектами:
Код:
MODULE ПримерыЗащищенныйМодуль;

  TYPE
    Контейнер* = POINTER TO ABSTRACT RECORD
      количествоЭлементов-: INTEGER
    END;
  
  PROCEDURE УстановитьНовоеКоличествоЭлементов* (контейнер: Контейнер; n: INTEGER);
  BEGIN ASSERT(n >= 0, 20);
    контейнер.количествоЭлементов := n
  END УстановитьНовоеКоличествоЭлементов;
  
END ПримерыЗащищенныйМодуль.
Публичный модуль, естественно, экспортирует только публичные методы:
Код:
MODULE ПримерыПубличныйМодуль;

  IMPORT
    Защищенный := ПримерыЗащищенныйМодуль;
  
  TYPE
    Контейнер* = POINTER TO ABSTRACT RECORD (Защищенный.Контейнер)
      (*...*)
    END;

    PROCEDURE (контейнер: Контейнер) Положить* (элемент: ANYPTR), NEW, ABSTRACT;
    PROCEDURE (контейнер: Контейнер) Изъять* (OUT элемент: ANYPTR), NEW, ABSTRACT;
    
END ПримерыПубличныйМодуль.
Каждый реализационный модуль импортирует защищенный и публичный модули. С помощью импортированного защищенного модуля в реализационном модуле можно выполнять над объектами защищенные действия:
Код:
MODULE ПримерыРеализационныйМодуль;

  IMPORT
    Защищенный := ПримерыЗащищенныйМодуль,
    Публичный := ПримерыПубличныйМодуль;
  
    TYPE
      Контейнер* = POINTER TO RECORD (Публичный.Контейнер)
        (* ... *)
      END;
  
      PROCEDURE (контейнер: Контейнер) Положить* (элемент: ANYPTR);
      BEGIN
        (*...*)
        Защищенный.УстановитьНовоеКоличествоЭлементов(контейнер, контейнер.количествоЭлементов + 1);
        (*...*)
      END Положить;
    
      PROCEDURE (контейнер: Контейнер) Изъять* (OUT элемент: ANYPTR);
      BEGIN
        (*...*)
        Защищенный.УстановитьНовоеКоличествоЭлементов(контейнер, контейнер.количествоЭлементов - 1);
        (*...*)
      END Изъять;
    
      PROCEDURE Новый* (VAR контейнер: Публичный.Контейнер);
        VAR к: Контейнер;
      BEGIN 
        NEW(к); 
        (*...*)
        контейнер := к
      END Новый;
    
END ПримерыРеализационныйМодуль.
Все клиентские модули импортируют только публичный модуль и реализационные модули но не импортируют защищенный модуль. Поскольку клиентские модули не импортируют защищенный модуль, то они и не могут выполнять над объектами защищенные действия - эти действия, стало быть, защищены от клиетов. Задача решена.
Код:
MODULE ПримерыКлиентскийМодуль;

  IMPORT
    Интерфейс := ПримерыПубличныйМодуль,
    Реализация := ПримерыРеализационныйМодуль,
    Журнал := StdLog;
  
    PROCEDURE Выполнить*;
      VAR контейнер: Интерфейс.Контейнер;
    BEGIN
      Реализация.Новый(контейнер);
      контейнер.Положить(NIL);
      Журнал.Int(контейнер.количествоЭлементов);
      Журнал.Ln;
      (*...*)
    END Выполнить;
    
END ПримерыКлиентскийМодуль.
В модульных системах защита осуществляется не "волшебным" словом "protected", а просто с помощью вынесения защищенных действий в отдельный модуль с последующем контролем импорта такого защищенного модуля.
Ответить с цитированием
  (#2 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию Re: Защищенные действия (protected) - 21.09.2005, 13:25

Кстати, 100% способ защиты - не давать клиентам символьный файл защищенного модуля.

Символьный файл защищенного модуля надо давать только "реализаторам".
Ответить с цитированием
  (#3 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию Re: Защищенные действия (protected) - 23.09.2005, 18:36

MS Word-овский документ с рисунком:

http://www.rsdn.ru:80/File/30795/Protected...edOperation.zip
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Самопроизвольные действия компьютера Kaethavel Любые вопросы от новичков 8 26.06.2011 01:04
действия с Базой данных gingerred Prolog 106 03.10.2010 07:05
Действия с комплексными числами nilov Prolog 8 02.03.2010 17:12
Кнопка двойного действия Eugenio DHTML, JavaScript, VBScript 1 22.08.2009 17:54
Выполнение действия по заданному времени Kurdt Delphi 3 27.04.2008 12:02
Как реализовать protected-наследование D_K С/С++ 8 20.09.2007 14:07
реализация действия на gnu prolog warf Prolog 0 20.06.2007 01:24
Работа с таблицами и мат действия MySQL AstonClinton MySQL 2 07.09.2006 12:32
Область действия - прототип Bogdan1024 С/С++ 13 13.05.2006 06:31
Password Protected VS. PHP terminator PHP 5 31.07.2004 10:20
Как сделать дамп Protected Storage imported_MasterX WinAPI 1 19.04.2004 11:15



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов