![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Object Manager
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, игра такая это, с открытым исходным кодом *игры*, а не движка (используется интерпретатор си).
За те исправления сори, написано на сонную голову, тоже посыпаю голову пеплом и раскаиваюсь.