fpc 2.6.2

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: fpc 2.6.2

Сообщение Kitayets » 13.03.2013 11:33:59

Если кому интересен вопрос в старте топика, то я просмотрел исходники rtl и fcl-base на предмет что за поддержка потерна «Наблюдатель» была добавлена.
И результат мне очень понравился, сам паттерн реализован по классической схеме GoF на интерфейсах, а не как в JAVA, где для субъекта (источника сообщений) необходимо наследоваться от абстрактного класса java.util. Observable, что в виду отсутствия множественного наследования уменьшает полезность данной реализации.

Что добавилось в rtl:

В модуле Classes определены интерфейсы для субъекта и наблюдателей, а также тип уведомления (изменение, удаление субъекта?, добавление/удаление элемента и пользовательское) :
Код: Выделить всё
Type
  // Notification operations :
  // Observer has changed, is freed, item added to/deleted from list, custom event.
  TFPObservedOperation = (ooChange,ooFree,ooAddItem,ooDeleteItem,ooCustom);
{$INTERFACES CORBA}

  { IFPObserved }

  IFPObserved = Interface [BaseGUIDObserved]
    // attach a new observer
    Procedure FPOAttachObserver(AObserver : TObject);
    // Detach an observer
    Procedure FPODetachObserver(AObserver : TObject);
    // Notify all observers of a change.
    Procedure FPONotifyObservers(ASender : TObject; AOperation : TFPObservedOperation; Data : Pointer);
  end;

  { IFPObserver }

  IFPObserver = Interface  [BaseGUIDObserver]
    // Called by observed when observers are notified.
    Procedure FPOObservedChanged(ASender : TObject; Operation : TFPObservedOperation; Data : Pointer);
  end;

Новый тип исключений:
EObserver = Class(Exception);
очевидно, что оно «бросается» при попытке добавления в список наблюдателей объекта не реализующий интерфейс IFPObserver.

Замечу, дополнительно, что перед описанием интерфейсов «наблюдателя» присутствует директива
Код: Выделить всё
{$INTERFACES CORBA}

что означает, что они не наследуются от IUnknown – и при использовании данных интерфейсов не будет никаких «сайд» эффектов автоматически создаваемых\удаляемых экземпляров, как это подразумевается при использовании технологии COM.

Ну и самое главное – классы TList и TPersistent теперь реализуют интерфейс IFPObserved, т.е. они и их потомки теперь могут регистрировать наблюдателей! И посылать уведомления о своем состоянии (изменении состояния). Теперь дело за разработчиками LCL – ведь все компоненты наследуются от TPersistent (кроме того от него же наследуются и TStrings) – и это означает, что в скором времени можно будет наблюдателем подключаться и получать уведомления от любого компонента, например TButton и т.д..
Т.к. в TPersistent – методы реализующие интерфейс IFPObserved – объявлены в секции Protected, то только разработчики наследников решают будет ли доступна данная функциональность пользователям их классов.

В FCL_Base
Появился модуль fpobserver. В нем объявлено несколько классов, смысл использования для меня остается не до конца очевидным. Это классы TObservedHook и рад классов посредников (Mediator) наблюдателей.
Насколько я понял TObservedHook это для делегированной реализации в своих классах субъектах:
Код: Выделить всё
TMySubject = class(IFPObserved)
    Private
       fObservedHook: TObservedHook;
     …
    Public
    …
       Property Observed: TObservedHook read fObservedHook implements IFPObserved;
    ….
End;


на этом по наблюдателям в 2.6.2 все. Если кто знает как обычно используются посредники в паттерне "наблюдатель" киньте ссылку пожалуйста.
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: fpc 2.6.2

Сообщение Sharfik » 19.01.2014 02:00:07

Идею понял, а вот как применять пока не очень. Слаб в работе с интерфейсами :(
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 808
Зарегистрирован: 20.07.2013 01:04:30

Re: fpc 2.6.2

Сообщение Padre_Mortius » 19.01.2014 11:57:49

Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Пред.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru
cron