Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Object Manager


Страницы:   1 2

Piroxyline ©   (2006-12-30 20:04:00) 

Подумал-подумал, и решил сделать енто... Не слишком отлажено, но работает.
Смысл: есть менеджер объектов, который может автоматически создавать почти неограниченное их количество. В объектах может быть почти неограниченное количество свойств, у каждого из которых должно быть имя и значение. Свойства создаются автоматически при попытке записи в них (если его не было, оно создатся, если было - перезапишется). Если нет значения - свойство автоматически удаляется, если нет свойств - удаляется объект. Объект удаляется также, если у него удалить имя. У объекта есть методы на попытку чтения и на попытку записи свойств, а также на обновление. Обновление осуществляется вызовом процедуры Update у менеджера, при этом удаляются убитые объекты из массива. К объектам и их свойствам можно обращаться как по имени, так и по списку. Работает все это практически в любой версии Delphi, где поддерживается тип Variant (у меня пахала с 4 по turbo)
В-общем, судите сами - надо это или нет. В комплекте лежит пример - консольная программка для подсчета слов из файла.

http://forum.sources.ru/index.php?act=Attach&type=post&id=1396624


Piroxyline   (2007-01-12 12:47:00) [1]

Все равно не понял :(


vlad-mal   (2007-01-11 18:18:00) [2]


> Piroxyline ©   (11.01.07 17:15) [33]

Дык я о чем? Только о том, чтобы внутреннее устройство твоего менеджера изменить. Чтобы не тупым перебором искать (что и происходит в твоем коде).

И программку переделал не для того, чтобы сказать, что мне твой менеджер не нравится, а чтобы продемонстрировать принцип работы ассоциативного массива.

:)


Piroxyline   (2007-01-11 17:15:00) [3]


> vlad-mal ©   (10.01.07 19:40) [31]

Менеджер объектов реально используется только для динамического управления ими. А если создать один объект без менеджера, то и управлять им придется самостоятельно. Т. е. получится так:
MyObject.Create('MyObject');
...
MyObject.Properties[PropertyName] := PropertyValue;
...
MyObject.Free;

Почти как твой код, только в Properties используется не Integer, а Variant


ors_archangel   (2007-01-10 19:50:00) [4]

Piroxyline, менеджер самобытных объектов, имхо, - всегда искусственность. Лучше делать такие вещи прозрачнее. (Но кода я не видел, где www.***.narod.ru? так что не обессутьте, если не прав вот здесь)


vlad-mal   (2007-01-10 19:40:00) [5]


> Хм. А если взять не менеджер объектов, а один объект (по
> сути, тут используется как раз один объект только), то должна
> получится схожая картина.

Пардон, не понял?


Piroxyline   (2007-01-10 19:30:00) [6]

Хм. А если взять не менеджер объектов, а один объект (по сути, тут используется как раз один объект только), то должна получится схожая картина.


vlad-mal   (2007-01-10 18:06:00) [7]


> Еще бы знать, что такое ассоциатиный массив... Если объясните,
>  могу попробовать сделать.

Ну, иными словами, в данном случае я имел в виду структуру типа "словарь".
Т.е. словарь - это ассоциативный массив, в котором значение ключа является строкой.

Вообще, ассоциативными массивами называют неупорядоченные коллекции, в которых для доступа к значению может быть использован какой-либо ключ.

К примеру, класс TIntegerDictionary используется, когда нужно получить доступ к целому, используя в качестве ключа строку.                          

Пример использования словаря целых значений:

   Ages := TIntegerDictionary.Create; // Создаем массив Ages
   Ages['John'] := 29; // Джону 29 лет
   Ages['Mike'] := 35; // Майку 35
   if Ages.HasKey['John'] then // Если есть элемент Джон, то
     Ages.Delete('John');  // удалим его
   Ages.Free; // удаляем массив


В качестве примера использования, рассмотрим Вашу программку WordsNum.
Чуть - чуть изменим ее:

program WordsNum;

uses
 FastMM4, // По настроению... :)
 cDictionaries;
...

var
 AWords            : TIntegerDictionary; // Вместо Вашего "менеджера"
 Word              : string;
 Buf               : Char;
 f                 : TextFile;
 i, j, k           : Integer;
...
 WriteLn('Processing...');

 AWords := TIntegerDictionary.Create;  // Создаем массив

 AssignFile(f, ParamStr(1));
 Reset(f);

 Word := '';
 j := 0;

 while not Eof(f) do begin // Считываем входной файл
   Read(f, Buf);
   if (IsDelimeter(Buf)) then begin
     if (Length(Word) > 0) then begin
       Word := LowerCase(Word);
       if AWords.HasKey(Word) then // Считаем
         i := AWords[Word] + 1 // число
       else // слов
         i := 1; // ...
       AWords[Word] := i;
       Word := '';
       if i > j then j := i;
     end;
   end
   else begin
     Word := Word + Buf;
   end;
 end;

 CloseFile(f);

 AssignFile(f, ParamStr(2));
 Rewrite(f);

 for i := 0 to Pred(AWords.Count) do begin // Выводим массив
   Word := AWords.GetKeyByIndex(i); // в выходной
   WriteLn(f, Word,' ', AWords[Word]);  // файл
 end;

 Word := '';
 CloseFile(f);
 AWords.Free; // Уничтожили словарь


Время выполнения - меньше одного тика на тех же исходных данный... :)

(Класс словаря был взят из упомянутого ранее пакета Fundamentals )


Piroxyline   (2007-01-10 15:32:00) [8]

Так, комментирую по очереди.

> vlad-mal ©   (09.01.07 21:09) [23]

Еще бы знать, что такое ассоциатиный массив... Если объясните, могу попробовать сделать.

> vlad-mal ©   (09.01.07 21:10) [24]

Ладно, сделаю сайт на народе.

> vlad-mal ©   (10.01.07 05:36) [25]

Ну я не стремлюсь создать субд или замену уже существующему - я ж это просто для собственного удобства сделал :)

> ORMADA ©   (10.01.07 07:02) [26]

Гы. Динамические массивы под досом всех рвут :)


vlad-mal   (2007-01-10 15:25:00) [9]


> 2 vlad-malесли уж рассматривать ЭТО как СУБД то SQLite(sqlite.
> org) её (fdb) рвёт как грелкуразмер длл правда 200 с копейкамизато
> частично SQL-92 держит а по скорости на малых и средних
> объёмах вообще рвёт всех....

1. Отнюдь. :)
2. Тем неменее, вопрос не в скорости доступа к табличкам, а в подходе к проектированию приложения.
Здесь мы рассматриваем объектный подход, а не реляционный.


ORMADA   (2007-01-10 07:02:00) [10]

2 vlad-mal
если уж рассматривать ЭТО как СУБД то SQLite(sqlite.org) её (fdb) рвёт как грелку
размер длл правда 200 с копейками
зато частично SQL-92 держит а по скорости на малых и средних объёмах вообще рвёт всех....


vlad-mal   (2007-01-10 05:36:00) [11]

Вот, если интересно, нечто похожее:
http://fdb.linesoft.org/

В реальности - простая и супершустрая СУБД.

Работает очень похоже на Ваш менеджер объектов.
.dll - ка 100 кб, и все счастье. :)


vlad-mal   (2007-01-09 21:10:00) [12]


> см. TCrash [11], мне интересно, но регистрироваться в лом
> абы где

Да, кстати. Что мешает разместить где-нибудь на халявном хостинге свой сайт?


vlad-mal   (2007-01-09 21:09:00) [13]

Молодец!

Однако, со стандартным менеджером памяти WordsNum выполняется за 47 тиков, а с FastMM4 - 30. :)
(ну это так, к слову)

Еще неплохо бы сделать следующий шаг:
- изменить тип массива _Properties с
 T_PropertyList = array of T_Property;

на что-то более быстрое.
Например, на ассоциативный массив.

Тогда, например, в методах

     function GetProperty(Name: String): Variant;
     procedure SetProperty(Name: String; Value: Variant);

не придется выполнять перебор всех элементов.

Готовую реализацию можно скачать например, отсюда:

    http://fundementals.sourceforge.net/


ors_archangel   (2007-01-09 21:05:00) [14]


> http://forum.sources.ru/index.php?act=Attach&type=post&id=1406504

см. TCrash [11], мне интересно, но регистрироваться в лом абы где


Piroxyline   (2007-01-09 20:44:00) [15]

Еще одна поправка. Теперь для уничтожения неиспользуемых объектов нужно обязательно вызывать Update у менеджера, зато все идет нормально.
http://forum.sources.ru/index.php?act=Attach&type=post&id=1406504


Piroxyline   (2007-01-08 16:59:00) [16]

Ок, буду смотреть. Просто тестирую на другом проекте, там все нормально.


vlad-mal   (2007-01-08 16:11:00) [17]

"Уж лучше Вы к нам" (c) - :)

Ну и что? Все равно же не работает.
Запусти свою программку WordsNum.EXE с параметрами:

WordsNum.EXE ObjectManager.pas Out.txt


- получишь Out Of Memory.

Я уже рассказывал:
Подключаешь FastMM4 - тогда отрабатывает до конца, но в деструкторе фиксируется ошибка. И утечка памяти.


Piroxyline   (2007-01-08 15:18:00) [18]

Поправил и добавил таймер: http://forum.sources.ru/index.php?act=Attach&type=post&id=1404786
С идеями плиз в аську: 283044430


vlad-mal   (2007-01-08 01:24:00) [19]

Ну так как насчет продолжения?
Вы деструкторы настройте, а я Вам пару идей - глядишь, что хорошее настряпаем... :)


Piroxyline   (2007-01-07 19:36:00) [20]

vlad-mal, игра такая это, с открытым исходным кодом *игры*, а не движка (используется интерпретатор си).
За те исправления сори, написано на сонную голову, тоже посыпаю голову пеплом и раскаиваюсь.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо