Форум: "Основная";
Текущий архив: 2007.03.04;
Скачать: [xml.tar.bz2];
ВнизObject Manager Найти похожие ветки
← →
Piroxyline © (2006-12-30 20:04) [0]Подумал-подумал, и решил сделать енто... Не слишком отлажено, но работает.
Смысл: есть менеджер объектов, который может автоматически создавать почти неограниченное их количество. В объектах может быть почти неограниченное количество свойств, у каждого из которых должно быть имя и значение. Свойства создаются автоматически при попытке записи в них (если его не было, оно создатся, если было - перезапишется). Если нет значения - свойство автоматически удаляется, если нет свойств - удаляется объект. Объект удаляется также, если у него удалить имя. У объекта есть методы на попытку чтения и на попытку записи свойств, а также на обновление. Обновление осуществляется вызовом процедуры Update у менеджера, при этом удаляются убитые объекты из массива. К объектам и их свойствам можно обращаться как по имени, так и по списку. Работает все это практически в любой версии Delphi, где поддерживается тип Variant (у меня пахала с 4 по turbo)
В-общем, судите сами - надо это или нет. В комплекте лежит пример - консольная программка для подсчета слов из файла.
http://forum.sources.ru/index.php?act=Attach&type=post&id=1396624
← →
Palladin © (2006-12-31 04:18) [1]Эх, парень, как думаешь, сколько людев прошли через это?
Ты пойми один из самых великих законов программирования... Чем универсальней сущность, тем меньше найдется случаев для ее применения...
Всегда... всегда... При разработке идет балансирование между количеством и качеством... И всегда всегда оказывается неоптимально использовать нечто не конкретное... Самое оптимальное использовать самописный или левописный ДБЛэйер...
← →
Piroxyline © (2006-12-31 13:00) [2]
> Эх, парень, как думаешь, сколько людев прошли через это?
Много. Я тоже.
> Ты пойми один из самых великих законов программирования.
> .. Чем универсальней сущность, тем меньше найдется случаев
> для ее применения...
> Всегда... всегда... При разработке идет балансирование между
> количеством и качеством... И всегда всегда оказывается неоптимально
> использовать нечто не конкретное... Самое оптимальное использовать
> самописный или левописный ДБЛэйер...
В курсе. Только я реализовал то же самое, что сделано в интерпретаторе C++ в ПКМ и третьих Корсарах. Сейчас начал проект, в котором в конце концов пришел к использованию этого модуля - мне просто так удобней. Я ведь никого не заставляю им пользоваться.
← →
vlad-mal © (2007-01-03 23:18) [3]Оч. интересно.
Деструкторыdestructor T_ObjectManager.Destroy;
и
destructor T_Object.Destroy;
не - виртуальны. Следовательно, не будут вызваны при обращении к методу .Free экземпляров соотв. объектов.
-----------------
Кто такие "третьи Корсары"?
← →
Palladin © (2007-01-03 23:34) [4]Кто здесь?
← →
vlad-mal © (2007-01-03 23:55) [5]:)
← →
Игорь Шевченко © (2007-01-04 13:16) [6]Дети Ивана Кулибина
← →
Piroxyline © (2007-01-04 15:21) [7]
> vlad-mal © (03.01.07 23:18) [3]
Вроде поправил (ну не разбираюсь я в этих методах :) ). Плюс сделал оччень тупое сохранение.
http://forum.sources.ru/index.php?act=Attach&type=post&id=1400838
← →
MetalFan_pda (2007-01-04 15:33) [8]хм...подобие xml чтоль...
← →
vlad-mal © (2007-01-04 16:50) [9]
> Вроде поправил (ну не разбираюсь я в этих методах :) ).
Ужас :)
destructor Destroy; virtual;
Вы на ворнинги смотрите, после компиляции?
> [Warning] ObjectManager.pas(94): Method "Destroy" hides
> virtual method of base type "TObject"
>
Ваш классT_Object = class
наследуется от класса TObject, в котором уже есть свой деструктор Destroy:destructor Destroy; virtual;
с "пустой" реализациейdestructor TObject.Destroy;
begin
end;
К котороому и происходит обращение при вызове .Free. Т.е. реально Ваш деструктор не вызывается. Вы должны или вызывать его явно (.Destroy), или (что желательно) переопределить существующий виртуальный вот так:
T_Object = class
...
public
destructor Destroy; override;
...
end;
T_ObjectManager = class
...
public
...
destructor Destroy; override;
end;
Этого достаточно, чтобы при вызове .Free вызывался именно Ваш деструктор.
Кстати, посмотреть, есть ли обращение к деструктору, легко можно в отладчике. :)
Еще: работать все равно не будет :) - т.к. деструкторы написаны неправильно. :(
Как только Вы сделаете то, что я Вам рекомендовал, дектруктор выдаст Access Violation. Потому что написан он неправильно :)
...
Я для примера запустил Вашу программку с параметрами:
> ObjectManager.pas Out.txt
и схлопотал OutOfMemory.
Подключил менеджер памяти FastMM4, все получилось, но узнал, что Ваши деструкторы не вызываются, и происходит утечка памяти. Остальное - см. выше.
Так что вот так.
--------------
Так кто такие "третьи Корсары"? :)
← →
Джо © (2007-01-04 17:00) [10]>
> Так кто такие "третьи Корсары"? :)
А заодно и «ПКМ».
← →
TCrash (2007-01-04 17:12) [11]и как попасть на http://forum.sources.ru/index.php?act=Attach&type=post&id=1400838 не регистрируясь на форуме?
Хочешь создать опенсорц проект - сделай для него сайт. хотя бы на том же народе
← →
saxon (2007-01-04 17:25) [12]
> vlad-mal © (04.01.07 16:50) [9]
> ... К котороому и происходит обращение при вызове .Free. Т.е.
> реально Ваш деструктор не вызывается. ...
Ой по моему тут совсем наоборот ;)
← →
saxon (2007-01-04 17:29) [13]
> saxon (04.01.07 17:25) [12]
Извините, не так прочитал. посыпаю голову пеплом :)
← →
vlad-mal © (2007-01-04 17:40) [14]Если я не узнаю, что такие "третьи Корсары", (а заодно и "ПКМ"), я не усну сегодня... :)
← →
Джо © (2007-01-04 17:45) [15]> [14] vlad-mal © (04.01.07 17:40)
> Если я не узнаю, что такие "третьи Корсары", (а заодно и
> "ПКМ"), я не усну сегодня... :)
Будем бодрствовать вместе. А Кулибин пусть отдохнет :)
← →
Piroxyline © (2007-01-07 19:36) [16]vlad-mal, игра такая это, с открытым исходным кодом *игры*, а не движка (используется интерпретатор си).
За те исправления сори, написано на сонную голову, тоже посыпаю голову пеплом и раскаиваюсь.
← →
vlad-mal © (2007-01-08 01:24) [17]Ну так как насчет продолжения?
Вы деструкторы настройте, а я Вам пару идей - глядишь, что хорошее настряпаем... :)
← →
Piroxyline © (2007-01-08 15:18) [18]Поправил и добавил таймер: http://forum.sources.ru/index.php?act=Attach&type=post&id=1404786
С идеями плиз в аську: 283044430
← →
vlad-mal © (2007-01-08 16:11) [19]"Уж лучше Вы к нам" (c) - :)
Ну и что? Все равно же не работает.
Запусти свою программку WordsNum.EXE с параметрами:WordsNum.EXE ObjectManager.pas Out.txt
- получишь Out Of Memory.
Я уже рассказывал:
Подключаешь FastMM4 - тогда отрабатывает до конца, но в деструкторе фиксируется ошибка. И утечка памяти.
← →
Piroxyline © (2007-01-08 16:59) [20]Ок, буду смотреть. Просто тестирую на другом проекте, там все нормально.
← →
Piroxyline © (2007-01-09 20:44) [21]Еще одна поправка. Теперь для уничтожения неиспользуемых объектов нужно обязательно вызывать Update у менеджера, зато все идет нормально.
http://forum.sources.ru/index.php?act=Attach&type=post&id=1406504
← →
ors_archangel © (2007-01-09 21:05) [22]
> http://forum.sources.ru/index.php?act=Attach&type=post&id=1406504
см. TCrash [11], мне интересно, но регистрироваться в лом абы где
← →
vlad-mal © (2007-01-09 21:09) [23]Молодец!
Однако, со стандартным менеджером памяти 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/
← →
vlad-mal © (2007-01-09 21:10) [24]
> см. TCrash [11], мне интересно, но регистрироваться в лом
> абы где
Да, кстати. Что мешает разместить где-нибудь на халявном хостинге свой сайт?
← →
vlad-mal © (2007-01-10 05:36) [25]Вот, если интересно, нечто похожее:
http://fdb.linesoft.org/
В реальности - простая и супершустрая СУБД.
Работает очень похоже на Ваш менеджер объектов.
.dll - ка 100 кб, и все счастье. :)
← →
ORMADA © (2007-01-10 07:02) [26]2 vlad-mal
если уж рассматривать ЭТО как СУБД то SQLite(sqlite.org) её (fdb) рвёт как грелку
размер длл правда 200 с копейками
зато частично SQL-92 держит а по скорости на малых и средних объёмах вообще рвёт всех....
← →
vlad-mal © (2007-01-10 15:25) [27]
> 2 vlad-malесли уж рассматривать ЭТО как СУБД то SQLite(sqlite.
> org) её (fdb) рвёт как грелкуразмер длл правда 200 с копейкамизато
> частично SQL-92 держит а по скорости на малых и средних
> объёмах вообще рвёт всех....
1. Отнюдь. :)
2. Тем неменее, вопрос не в скорости доступа к табличкам, а в подходе к проектированию приложения.
Здесь мы рассматриваем объектный подход, а не реляционный.
← →
Piroxyline © (2007-01-10 15:32) [28]Так, комментирую по очереди.
> 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 18:06) [29]
> Еще бы знать, что такое ассоциатиный массив... Если объясните,
> могу попробовать сделать.
Ну, иными словами, в данном случае я имел в виду структуру типа "словарь".
Т.е. словарь - это ассоциативный массив, в котором значение ключа является строкой.
Вообще, ассоциативными массивами называют неупорядоченные коллекции, в которых для доступа к значению может быть использован какой-либо ключ.
К примеру, класс 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 19:30) [30]Хм. А если взять не менеджер объектов, а один объект (по сути, тут используется как раз один объект только), то должна получится схожая картина.
← →
vlad-mal © (2007-01-10 19:40) [31]
> Хм. А если взять не менеджер объектов, а один объект (по
> сути, тут используется как раз один объект только), то должна
> получится схожая картина.
Пардон, не понял?
← →
ors_archangel © (2007-01-10 19:50) [32]Piroxyline, менеджер самобытных объектов, имхо, - всегда искусственность. Лучше делать такие вещи прозрачнее. (Но кода я не видел, где www.***.narod.ru? так что не обессутьте, если не прав вот здесь)
← →
Piroxyline © (2007-01-11 17:15) [33]
> vlad-mal © (10.01.07 19:40) [31]
Менеджер объектов реально используется только для динамического управления ими. А если создать один объект без менеджера, то и управлять им придется самостоятельно. Т. е. получится так:MyObject.Create("MyObject");
...
MyObject.Properties[PropertyName] := PropertyValue;
...
MyObject.Free;
Почти как твой код, только в Properties используется не Integer, а Variant
← →
vlad-mal © (2007-01-11 18:18) [34]
> Piroxyline © (11.01.07 17:15) [33]
Дык я о чем? Только о том, чтобы внутреннее устройство твоего менеджера изменить. Чтобы не тупым перебором искать (что и происходит в твоем коде).
И программку переделал не для того, чтобы сказать, что мне твой менеджер не нравится, а чтобы продемонстрировать принцип работы ассоциативного массива.
:)
← →
Piroxyline © (2007-01-12 12:47) [35]Все равно не понял :(
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.03.04;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.039 c