Страница 9 из 19
Автоматическое удаление объектовПри программировании в терминах объектов Delphi приходится постоянноучитывать, когда создаются объекты определенного класса и, что еще важнее, ктои когда их удаляет. Ситуация несколько упрощается при построении визуальныхприложений и использовании компонентов - установив компонент на форму (илимодуль данных), тем самым мы определяем механизм создания и удаления объектовсоответствующего класса, когда форма-владелец создает объект в процессе своейинициализации и удаляет его в момент своего удаления. При построении невизуальных приложений (например,реализация бизнес-правил на промежуточном слое многоуровневого приложения)можно использовать механизм автоматического удаления COM-объектов или объектов(объектов, являющихся наследниками от TInterfacedObject). Впрочем, необходимо признать, что автоматическое удалениеобъектов в Delphiреализовано не лучшим образом, т.к.: - приходится использовать две или даже три разные модели программирования для визуальных и невизуальных приложений (управление компонентами посредством формы-владельца, интерфейсные объекты, COM-объекты);
- при использовании COM-объектов отладка не является прозрачной с точки зрения объектной модели Delphi, т.к. в целях совместимости со стандартами OLE приходится соблюдать ряд ограничений, в т.ч. в вопросах генерации ошибок, совместимых с COM.
Более того, объекты Delphi, которые часто используются припостроении прикладных объектов, например, списки, стеки, битовые массивы и пр.,не поддерживают механизм автоматического удаления, поэтому на практикеприходится или использовать смешанную модель, в которой лишь некоторые объектыудаляются автоматически, или в целях стандартизации кода вообще отказываться отавтоматического удаления. Рассмотрим простую семантическую конструкцию - загрузкусписка объектов. В Delphi типичная реализация выглядят примерно так: procedure LoadList(aList: TObjectList); begin aList.Clear; // заполнение списка end; . . . try MyObjectList = TObjectList.Create; LoadList(MyObjectList); // далее - использование объектов из списка finally MyObjectList.Free; end;
На самом деле из-за ограничений Delphi (TObjectList не может удаляться автоматически)семантика приведенного кода разбивается на две отдельные фазы: - создать пустой список объектов
- заполнить список
В C# аналогичное действие (загрузка списка объектов) реализуется проще исемантически точнее: class ListLoadTest { Collection LoadList() { Collection c = new Collection(); // непосредственная загрузка объектов и добавление их в коллекцию return c; } static void Main() { Collection c = LoadList(); foreach (MyObject in c) { // что-то сделать с очередным объектом из списка } } }
Строго говоря, в приведенном коде C# даже два преимущества: - во-первых, не нужно думать об удалении списка объектов и его элементов (если бы в Delphi для хранения объектов вместо TObjectList использовался бы TList или просто массив, объекты пришлось бы удалять вручную)
- во-вторых, список объектов создается и заполняется в одном месте.
Таким образом, довольно простая вещь - автоматическоеудаление объектов, - позволяет писать более точный (семантически) и понятныйкод. |