среда, 15 января 2014 г.

Переделываем синглетон

Буквально ВЧЕРА я узнал про class Constructor и class Destructor - http://programmingmindstream.blogspot.com/2014/01/class-constructor-class-destructor.html

Я "вдохновился новыми знаниями" и решил переписать уже знакомый (http://18delphi.blogspot.ru/2013/11/gui-back-to-basics_22.html) синглетон (http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BD%D0%B3%D0%BB%D1%82%D0%BE%D0%BD_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)).

Было:

unit Script.Axiomatics;

interface

uses
 Script.Dictionary
 ;

type
 TscriptAxiomatics = class(TscriptDictionary)
  private
   class var f_Instance : TscriptAxiomatics;
  public
   class function Instance: TscriptAxiomatics;
 end;//TscriptAxiomatics

implementation

uses
 System.SysUtils
 ;

class function TscriptAxiomatics.Instance: TscriptAxiomatics;
begin
 if (f_Instance = nil) then
  f_Instance := TscriptAxiomatics.Create;
 Result := f_Instance;
end;

initialization

finalization
 FreeAndNil(TscriptAxiomatics.f_Instance);

end.

Стало:

unit Script.Axiomatics;

interface

uses
 Script.Dictionary
 ;

type
 TscriptAxiomatics = class(TscriptDictionary)
  strict private
   class var f_Instance : TscriptAxiomatics;
  public
   class function Instance: TscriptAxiomatics;
   class destructor Destroy;
 end;//TscriptAxiomatics

implementation

uses
 System.SysUtils
 ;

class destructor TscriptAxiomatics.Destroy;
begin
  FreeAndNil(f_Instance);
  inherited;
end;

class function TscriptAxiomatics.Instance: TscriptAxiomatics;
begin
 if (f_Instance = nil) then
  f_Instance := TscriptAxiomatics.Create;
 Result := f_Instance;
end;

end.

Результирующий код доступен тут - https://sourceforge.net/p/rumtmarc/code-0/HEAD/tree/trunk/Blogger/GUITests/Chapter3/Scripting/Script.Axiomatics.pas

4 комментария:

  1. Посмотрел кстати сегодня немного исходники от Embarcadero - где используются class constructor и class destructor.

    Узнал для семя МНОГО НОВОГО :-) Подсмотрел для себя несколько ИНТЕРЕСНЫЙ мыслей :-) Когда они окончательно оформятся, то может быть я про них напишу.

    ОтветитьУдалить
  2. Классовый деструктор - для тех, кто также только начал оформлять свои мысли в коде и, возможно, сомневается - работает вместе с "классикой" раздела "финализация". Только срабатывает после, а не до. Это позволяет "плавно" и "медленно" добавлять классово-близкий-уничтожитель. Для тех, кто не оснащён аппаратом проверки кода - да - очередной и явный комплимент в адрес "тестовых машинок".

    Александр, есть ли возможность тестирования "пред-по-смертных" явлений в коде? И есть ли такая необходимость?
    Не обязательно "разрушение" или "техника харакири", а так - невидные для пользователя процедуры "парковки" системы?

    ОтветитьУдалить
    Ответы
    1. Всеволод, если честно - далеко не всё я тут понял.

      Удалить
    2. "вместе с "классикой" раздела "финализация"."

      Всеволод, если вы меня подозреваете в "отходе от классики" или таки "незнании её", то вы таки - неправы..

      Я "классику" - ЗНАЮ и ИСПОЛЬЗУЮ.

      И тут кстати есть проблема.

      "Только срабатывает после, а не до. ".

      ПОСЛЕ и ДО! Тут есть о чём поговорить.

      Стандартное поведение не гарантирует ПОРЯДКА ВЫЗОВОВ "методов уничтожения". В отличии от Tl3System.AddExitProc - https://sourceforge.net/p/rumtmarc/code-0/HEAD/tree/trunk/Blogger/RealWork/L3/l3Base.pas

      Удалить