Буквально ВЧЕРА я узнал про 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)).
Было:
Стало:
Результирующий код доступен тут - https://sourceforge.net/p/rumtmarc/code-0/HEAD/tree/trunk/Blogger/GUITests/Chapter3/Scripting/Script.Axiomatics.pas
Я "вдохновился новыми знаниями" и решил переписать уже знакомый (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
Посмотрел кстати сегодня немного исходники от Embarcadero - где используются class constructor и class destructor.
ОтветитьУдалитьУзнал для семя МНОГО НОВОГО :-) Подсмотрел для себя несколько ИНТЕРЕСНЫЙ мыслей :-) Когда они окончательно оформятся, то может быть я про них напишу.
Классовый деструктор - для тех, кто также только начал оформлять свои мысли в коде и, возможно, сомневается - работает вместе с "классикой" раздела "финализация". Только срабатывает после, а не до. Это позволяет "плавно" и "медленно" добавлять классово-близкий-уничтожитель. Для тех, кто не оснащён аппаратом проверки кода - да - очередной и явный комплимент в адрес "тестовых машинок".
ОтветитьУдалитьАлександр, есть ли возможность тестирования "пред-по-смертных" явлений в коде? И есть ли такая необходимость?
Не обязательно "разрушение" или "техника харакири", а так - невидные для пользователя процедуры "парковки" системы?
Всеволод, если честно - далеко не всё я тут понял.
Удалить"вместе с "классикой" раздела "финализация"."
УдалитьВсеволод, если вы меня подозреваете в "отходе от классики" или таки "незнании её", то вы таки - неправы..
Я "классику" - ЗНАЮ и ИСПОЛЬЗУЮ.
И тут кстати есть проблема.
"Только срабатывает после, а не до. ".
ПОСЛЕ и ДО! Тут есть о чём поговорить.
Стандартное поведение не гарантирует ПОРЯДКА ВЫЗОВОВ "методов уничтожения". В отличии от Tl3System.AddExitProc - https://sourceforge.net/p/rumtmarc/code-0/HEAD/tree/trunk/Blogger/RealWork/L3/l3Base.pas