пятница, 25 апреля 2014 г.

И ещё о "фильтрах и генераторах"

В продолжение темы - http://programmingmindstream.blogspot.ru/2014/04/blog-post_25.html

Как выглядит SetTo?

А очень просто:

type
 TElementFilter = class(Generator)
 ..
  class procedure SetTo(var theFilter: Generator);
 end;//TElementFilter

...

class procedure TElementFilter.SetTo(var theFilter: Generator);
var
 l_This : TElementFilter;
begin
 l_This := Self.Create;
 l_This.Next := theFilter;
 FreeAndNil(theFilter);
 theFilter := l_This;
end;

P.S. Для тех кто хочет "пообсуждать FreeAndNil" посоветую для начала прочитать вот это - http://18delphi.blogspot.ru/2013/04/iunknown.html

16 комментариев:

  1. ну если с арком, то наверное всё так. просто с первого взгляда кажется, что здесь ошибочное освобождение инстанса, на который сохраняется ссялка в next

    ОтветитьУдалить
    Ответы
    1. У Александра своя реализация IUnknown работающая несколько по другому, чем TInterfacedObject. В конструкторе RefCount взводится в 1 (в отличие от). Соответственно Free (которое тоже свое и работает как IUnknown.Release) обязательно. Иначе память потечет.

      Удалить
  2. хотя даже с арком достаточно пересвоения значения переменной… зачем в этом коде вызов FreeAndNil?

    ОтветитьУдалить
    Ответы
    1. Николай, по-моему я уже не раз внятно дал понять, что обсуждать такую ерунду как FreeAndNil - у меня нет никакого интереса.

      Удалить
  3. Александр, я не о Free vs FreeAndNil, я именно о том, что дёргается деструктор
    А то что у вас используются интерфейсы -это по коду не очевидно

    ОтветитьУдалить
    Ответы
    1. Николай, так и я "не о FreeAndNil".

      Просто удручает тот факт, что люди комментируют "незначительные мелочи", которые "поняли вскользь и навскидку". И НЕ комментируют КОНЦЕПТУАЛЬНЫЕ вещи, которые "требуют вдумчивого погружения".

      Вот именно это и "расстраивает".

      Дело ведь не во FreeAndNil, а в том (касательно данного поста и сопутствующих), что фильтры "связываются в цепочки" типа:

      Reader -> Filter1 -> Filter2 -> Filter3 -> ... -> FilterN - Writer

      Если бы была "откомментирована СУТЬ", то "было бы что обсуждать"...

      А так - "очередной раз обсуждать подсчёт ссылок" - неинтересно...

      Что же до "интерфейсов" и "моего подсчёта ссылок" - я уже ДАВНО писал - http://18delphi.blogspot.ru/2013/04/iunknown.html

      НУ меня лично РАССТРАИВАЕТ, когда я "пишу о тестах" или "об особенностях Supports", а комментируют "а у вас тут запятые не так расставлены"....

      Удалить
  4. так а цепочка она как бы и очевидна… чего её комментировать? :с)
    я написал о том, что меня смутило и заставило задуматься не о СУТИ

    ОтветитьУдалить
    Ответы
    1. Николай, одно из ЛУЧШИХ и ВОСТРЕБОВАННЫХ умений программиста это умение "абстрагироваться от мелочей", а мелочи подмечать и "записывать в вопросы".

      Подсчёт ссылок мы тоже можем обсудить :-)

      Удалить
    2. ну как же мелочь, Александр.
      создать объект, прописать ссылку в Next, подменить var-параметр - это я понимаю. но тут же грохнуть предыдущий объект (а именно так я читаю код) это не мелочь, а особенность, о которой надо либо упомянуть, либо выкинуть эту строку, чтоб не сбивала от СУТИ… ну я так думаю, может я конечно и придираюсь…

      Удалить
    3. Николай, мелочь.. мелочь.. к посту отношения НЕ ИМЕЕТ... пост О ДРУГОМ... понимаете, если мы будем обсуждать "скажем UML" и скатывать "в мелочи" - мы далеко не уйдём...

      Удалить
    4. ну, возможно я просто нашёл повод увести разговор в сторону? (или этот повод случайно дали Вы сами?)
      комментариями с 27го числа я хочу натолкнуть Вас на мысль, что Ваш код могут читать неподготовленные люди, и если упрощать - то это нужно на уровне примеров (т.е. кода). мне так кажется.
      постараюсь впредь не раздувать

      Удалить
    5. "неподготовленные люди" - покажусь грубым, но "неподготовленным людям" - надо читать иное.. :-)

      что касается Next...

      Вы не задумывались, что под Next лежит pm_SetNext?

      В котором написано - aValue.SetRefTo(f_Next).

      Ссылки на исходники кстати дадены... :-)

      Вот например - https://sourceforge.net/p/rumtmarc/code-0/HEAD/tree/trunk/Blogger/RealWork/K2/k2TagGen.pas

      Понимаете.. Если всё время ориентироваться на "неподготовленных людей" - сложно далеко уйти...

      Это как если рассуждать о квантовой теории с людьми, которые не знаю про три закона Ньютона..

      Мысль понятна? :-)

      Не хочу обидеть...

      Но я не раз уже писал.. "Мои посты не для всех"...

      Если "пытаться писать для всех", то "можно остаться на месте"...

      Ещё раз.. Можно писать про UML или DUnit, но при этом приходится предполагать, что "неподготовленные люди" читали остальное...

      Ну СЛОЖНО "в одном посте" включить и три закона Ньютона и квантовую теорию... Надо чтобы читающие "были на уровне"...

      Удалить
  5. а) задумывался, и от этих мыслей легче не стало, скорее даже наоборот
    б) исходники я время от времени посматриваю, но мне пока в них тяжело ориентироваться
    в) понятна)
    г) меня тяжело обидеть, но я сам боюсь задеть за живое
    д) ну вот и поболтали, спокойной ночи)

    ОтветитьУдалить